将单独文件中的列写入单个文件

时间:2014-02-18 23:41:28

标签: python csv merge

我对使用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()

谢谢!

2 个答案:

答案 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_longestfilter)。或者其他一百万种可能性。


作为旁注,一旦你得到这么多类似的变量,通常一个好的迹象表明你真的想要一个可迭代而不是单独的变量。例如:

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