Python: `paste' multiple (unknown) csvs together
我基本上要寻找的是bash中的"粘贴"命令,而python2中的命令。假设我有一个csv文件:
1 2 3 | a1,b1,c1,d1 a2,b2,c2,d2 a3,b3,c3,d3 |
另一种是:
1 2 3 | e1,f1 e2,f2 e3,f3 |
我想把它们放在一起:
1 2 3 | a1,b1,c1,d1,e1,f1 a2,b2,c2,d2,e2,f2 a3,b3,c3,d3,e3,f3 |
这是最简单的情况,我有一个已知的数字,只有两个。如果我想在不知道自己有多少文件的情况下使用任意数量的文件来执行此操作,该怎么办?
我正在考虑使用zip和csv.reader iterables列表。会涉及到一些解包,但似乎这许多python foo都高于我的iq级别atm。有人能建议如何实现这个想法或完全不同的东西吗?
我怀疑用一小段代码就能做到。谢谢。
1 2 3 4 5 6 | file1 = open("file1.csv","r") file2 = open("file2.csv","r") for line in file1: print(line.strip().strip(",") +","+ file2.readline().strip()+" ") |
可扩展到任意多个文件。只需继续添加到打印语句。除了打印,您还可以附加到列表或您希望的任何内容。你可能会担心文件的长度,我没有像你没有指定的那样。
假设文件数量未知,并且所有文件都正确格式化为csv,行数相同:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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中(参见这里接受的答案中的注释),似乎没有一种简单的方法可以轻松地使用带有文件变量列表的上下文管理器,因此需要像上面那样手动关闭文件。
你可以试试熊猫
在您的例子中,大熊猫中的[A、B、C、D]和[E、F]组可以被视为数据帧,很容易加入,因为大熊猫有一个称为concat的函数。
1 2 3 4 5 6 7 8 | 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) |