Python:将多个(未知)csvs粘贴在一起

时间:2014-05-15 01:20:12

标签: python csv zip

我基本上寻找的是bash中的`paste'命令,但是在Python2中。假设我有一个csv文件:

a1,b1,c1,d1
a2,b2,c2,d2
a3,b3,c3,d3

还有另外一个:

e1,f1
e2,f2
e3,f3

我想把它们拉到一起:

a1,b1,c1,d1,e1,f1
a2,b2,c2,d2,e2,f2
a3,b3,c3,d3,e3,f3

这是最简单的情况,我有一个已知的数字,只有两个。如果我想用任意数量的文件来做这件事,而不知道我有多少文件。

我正在考虑使用带有csv.reader iterables列表的zip。将涉及一些解包,但似乎这个python-foo高于我的智商水平ATM。有人可以建议如何实现这个想法或完全不同的东西吗?

我怀疑这应该是一个简短的片段。感谢。

3 个答案:

答案 0 :(得分:2)

file1 = open("file1.csv", "r")
file2 = open("file2.csv", "r")

for line in file1:
    print(line.strip().strip(",") +","+ file2.readline().strip()+"\n")

可根据需要扩展多个文件。只需继续添加print语句即可。除了打印,您还可以附加到列表或任何您想要的内容。您可能不得不担心文件的长度,我没有像您未指定的那样担心。

答案 1 :(得分:1)

假设文件数量未知,并且所有文件格式正确,因为csv具有相同的行数:

files = ['csv1', 'csv2', 'csv3']
fs = map(open, files)

done = False

while not done:
    chunks = []
    for f in fs:
        try:
            l = next(f).strip()
            chunks.append(l)
        except StopIteration:
            done = True
            break
    if not done:
        print ','.join(chunks)

for f in fs:
    f.close()

似乎没有简单的方法可以轻松地将上下文管理器与变量文件列表一起使用,至少在Python 2中是这样的(请参阅接受的答案here中的注释),因此需要手动关闭文件如上所述。

答案 2 :(得分:0)

您可以尝试pandas

在你的情况下,[a,b,c,d]和[e,f]的组可以被视为Pandas中的DataFrame,并且很容易连接,因为Pandas具有名为concat的函数。

import pandas as pd

# define group [a-d] as df1
df1 = pd.read_csv('1.csv')
# define group [e-f] as df2
df2 = pd.read_csv('2.csv')

pd.concat(df1,df2,axis=1)