将单列csv文件合并到单个csv文件中
我在这里看到了这种类型的问题的一些答案,但还不足以真正帮助我。我在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,但我找不到正确的方法。我不认为我太遥远了,但我的蟒蛇不是最好的不幸!
我读过你试过的熊猫,那里出了什么问题?有了熊猫,我们可以简单地使用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
谢谢!这工作完美。老实说,我不能告诉你为什么类似的早就没有为我工作,但是这是现货:-) – PushT
您可以在文件的迭代应用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]
...
您需要构建一个嵌套列表,ea ch子列表代表单行。对于每个新文件,您都会追加到子列表中。然后用'csv.writerows()'结尾写下它(当前的方法是在每次迭代时打开文件,效率非常低)。我目前不在PC上创建答案。 – roganjosh
你的缩进有点过分,所以实际上你可能不会在每次迭代中打开。请修复问题中的缩进。 – roganjosh
Unix粘贴命令 –