我对使用python中的csv文件相对较新,并且会欣赏一些指导。我有6个单独的csv文件。我想将每个csv文件中第1列,第2列和第3列的数据复制到新文件中相应的前3列。
如何将其写入我的代码?
这是我不完整的代码:
import csv
file1 = open ('fileA.csv', 'rb')
reader1 = csv.reader (file1)
file2 = open ('fileB.csv', 'rb')
reader2 = csv.reader (file2)
file3 = open ('fileC.csv', 'rb')
reader3 = csv.reader (file3)
file4 = open ('fileD.csv', 'rb')
reader4 = csv.reader (file4)
file5 = open ('fileE.csv', 'rb')
reader5 = csv.reader (file5)
file6 = open ('fileF.csv', 'rb')
reader6 = csv.reader (file6)
WriteFile = open ('NewFile.csv','wb')
writer = csv.writer(WriteFile)
next(reader1, None)
Data1 = (col[0:3] for col in reader1)
next(reader2, None)
Data2 = (col[0:3] for col in reader2)
next(reader3, None)
Data3 = (col[0:3] for col in reader3)
next(reader4, None)
Data4 = (col[0:3] for col in reader4)
next(reader5, None)
Data5 = (col[0:3] for col in reader5)
next(reader6, None)
Data6 = (col[0:3] for col in reader6)
.......????????
file1.close()
file2.close()
file3.close()
file4.close()
file5.close()
file6.close()
WriteFile.close()
谢谢!
答案 0 :(得分:0)
如果您只想将这些全部连接在一起,那很容易。您可以在每个迭代器上调用writerows
,也可以chain
一起调用它们:
writer.writerows(itertools.chain(Data1, Data2, Data3, Data4, Data5, Data6))
或者,如果你想让它们交错,你从Data1获得第1行,然后从数据2获得第1行,依此类推,然后从数据1获得第2行,等等,使用zip
来转置数据,然后chain
再次压扁它:
writer.writerows(itertools.chain.from_iterable(zip(Data1, Data2, Data3,
Data4, Data5, Data6)))
如果文件的长度不同,只要您到达任何文件的末尾,zip
就会停止。那是你要的吗?我不知道。你可能想要那个。您可能希望用空行填充空白(在这种情况下请查看zip_longest
)。您可能希望跳过空白(您可以使用zip_longest
加filter
)。或者其他一百万种可能性。
作为旁注,一旦你得到这么多类似的变量,通常一个好的迹象表明你真的想要一个可迭代而不是单独的变量。例如:
filenames = ('fileA.csv', 'fileB.csv', 'fileC.csv',
'fileD.csv', 'fileE.csv', 'fileF.csv')
files = [open(filename, 'rb') for filename in filenames]
readers = [csv.reader(file) for file in files]
WriteFile = open ('NewFile.csv','wb')
writer = csv.writer(WriteFile)
for reader in readers:
next(reader, None)
Data = [(col[0:3] for col in reader) for reader in readers]
writer.writerows(itertools.chain.from_iterable(Data))
for file in files:
file.close()
WriteFile.close()
(请注意,我使用列表推导,而不是生成器表达式,用于文件,读者,数据等的集合。这是因为我们需要重复迭代它们 - 例如,为每个文件创建reader
,然后在每个文件上调用close
。同样因为有一个固定的,少量的元素 - 6 - 所以“浪费”整个列表并不是真正的问题。)
答案 1 :(得分:0)
我理解你的问题的方法是你有六个独立的csv,每个csv有3列,每列中的数据在所有六个文件中都是相同的类型。如果是这样,你可以使用熊猫。假设您有3个文件看起来像......
file1:
col1 col2 col3
1 1 1
1 1 1
然后是第二个和第三个文件,在第二个文件中有2个,在第三个文件中有3个文件你可以写...
#!/usr/bin/env python
import pandas as pd
cols = ['col1', 'col2', 'col3']
files = ['~/one.txt', '~/two.txt', '~/three.txt']
data_1 = pd.read_csv(files[0], sep=',', header=False, names=cols)
data_2 = pd.read_csv(files[1], sep=',', header=False, names=cols)
data_3 = pd.read_csv(files[2], sep=',', header=False, names=cols)
data_final = data_1.append(data_2).append(data_3)
然后data_final应该将所有三个数据集的内容相互堆叠。您可以修改6(或n)个数据集。希望这是你想要的。
Out[1]: col1 col2 col3
1 1 1
1 1 1
2 2 2
2 2 2
3 3 3
3 3 3