2017-10-18 190 views
2

我在這裏看到了這種類型的問題的一些答案,但還不足以真正幫助我。我在9列.csv上做了一個分割 - 文件&將它們寫入了用於在C++中進行其他工作的向量。他們隨後被回寫到一個文件夾作爲單列的.csv文件,基本上類似於此:將單列csv文件合併到單個csv文件中

date 
20171012 
20171011 
20171010 
20171009 
20171006 
20171005 
20171004 

現在我想所有的9個簡單的CSV文件再次合併成1個文件,使他們水平堆疊最多像這樣在新的文件中:

date,value,etc...  
20171012,2501593,etc.. 
20171011,2176309,etc.. 
20171010,3484064,etc.. 
20171009,1785852,etc.. 
20171006,1785852,etc.. 
20171005,16476641,etc.. 
20171004,1235406,etc.. 

我希望這很容易理解。我下面的代碼如下:

import csv 
data = [] # Buffer list 
files = ['./CalculatedOutput/quote_date.csv', './CalculatedOutput/paper.csv', './CalculatedOutput/exch.csv', './CalculatedOutput/open.csv', './CalculatedOutput/high.csv', './CalculatedOutput/low.csv', './CalculatedOutput/close.csv', './CalculatedOutput/volume.csv', './CalculatedOutput/value.csv'] 

for filename in files: 
    with open(filename, 'r') as csvfile: 
     stocks = csv.reader(csvfile) 
     for row in stocks: 
      new_row = [row[0]] 
      data.append(new_row) 
     with open("CalculatedOutput/Opera.csv", "w+") as to_file: 
      writer = csv.writer(to_file , delimiter=",") 
      for new_row in data: 
       writer.writerow(new_row) 

此代碼列的所有行移動到1頁新的文件,但它只是使他們彼此下方。我將如何去編寫彼此相鄰的列,逗號分隔? 根據concat,merge和其他,我已經嘗試過大熊貓,numpy和csv lib,但我找不到正確的方法。我不認爲我太遙遠了,但我的蟒蛇不是最好的不幸!

+0

您需要構建一個嵌套列表,ea ch子列表代表單行。對於每個新文件,您都會追加到子列表中。然後用'csv.writerows()'結尾寫下​​它(當前的方法是在每次迭代時打開文件,效率非常低)。我目前不在PC上創建答案。 – roganjosh

+0

你的縮進有點過分,所以實際上你可能不會在每次迭代中打開。請修復問題中的縮進。 – roganjosh

+0

Unix粘貼命令 –

回答

1

我讀過你試過的熊貓,那裏出了什麼問題?有了熊貓,我們可以簡單地使用pd.concat([df1,df2 ....])。因此,讓我們讀出他們和一羣人在一起:

import pandas as pd 

df = pd.concat((pd.read_csv(f) for f in files),axis=1) # axis1 for horizontal 
df.to_csv("CalculatedOutput/Opera.csv",index=False) 

例子:

讓我們先來創建兩個假想文件:

file1 = """date 
20171012 
20171011 
20171010 
20171009 
20171006 
20171005 
20171004""" 

file2 = """number 
1 
2 
3 
4 
5 
6 
7""" 

files = [io.StringIO(f) for f in [file1,file2]] 

import pandas as pd 

df = pd.concat([pd.read_csv(f) for f in files],axis=1) 

print(df) 

 date number 
0 20171012  1 
1 20171011  2 
2 20171010  3 
3 20171009  4 
4 20171006  5 
5 20171005  6 
6 20171004  7 
+0

謝謝!這工作完美。老實說,我不能告訴你爲什麼類似的早就沒有爲我工作,但是這是現貨:-) – PushT

3

您可以在文件的迭代應用zip後打開使用一個上下文管理器中的所有文件contextlib.ExitStack(Python 3中),然後寫入到輸出文件:

import csv 
from contextlib import ExitStack 

outfile = "CalculatedOutput/Opera.csv" 
with ExitStack() as stack, open(outfile, "w+") as to_file: 
    # open all files 
    fs = [stack.enter_context(open(fname)) for fname in files] 
    fs = map(csv.reader, fs) 
    # write all rows from all files 
    csv.writer(to_file).writerows(zip(*fs)) 

更新

如果文件中包含的字符無法解碼爲UTF-8(默認編碼爲open),則可以在讀取時使用中間代理字符,它們將被替換爲他們在寫作時的原始形式:

with ExitStack() as stack, open(outfile, "w+", errors='surrogateescape') as to_file : 
    fs = [stack.enter_context(open(fname, errors='surrogateescape')) for fname in files] 
    ... 
+0

當我嘗試運行腳本時出現這種情況:「UnicodeDecodeError:'utf-8'編解碼器無法解碼位置11中的字節0xf8:無效的起始字節」。我確定這些已經是utf-8。 – PushT

+1

這些文件包含非ASCII字符?查看更新。 –

+0

非常感謝您的幫助,但Pandas方法爲我工作。 – PushT

相關問題