从两个文件中读取

时间:2015-07-20 18:08:34

标签: python csv iteration

我正在尝试编写一个脚本,它将占用几个2列文件,将第一列和第二列从第一列写入结果文件,然后只将所有其他文件中的第二列写入并附加它们。

示例:

ptr

最终结果应为

File one                         File two
Column 1     Column 2            dont take this column      Column 2
Line 1       Line 2              dont take this column      Line 2

除了将第二列添加到第一列之外,我几乎所有工作都有效。我将ResultFile作为r +,我想读出那里的行(第一个文件数据),然后从其他文件中读取相应的行,将其追加,并将其重新放入。

这是我第二部分的代码:

Result file
Column 1    Column 2    Column 2     
Line1       Line 2      Line 2
etc

中断IF不能正常工作我只是需要一种方法来结束无限循环。 LastValue也等于第一个文件的最后一个x列值。

任何帮助将不胜感激

修改
我试图在没有itertools的情况下这样做。

2 个答案:

答案 0 :(得分:0)

首先打开所有文件并将它们存储在列表中可能会有所帮助。

fileHandles = []
for f in fileNames:
    fileHandles.append(open(f))

然后你可以直接读取()它们,以便第一个文件中的每一行。

dataLine = fileHandles[0].readline()
while dataLine:
     outFields = dataLine.split(",")[0:2]
     for inFile in fileHandles[1:]:
          dataLine = inFile.readline()
          field = dataLine.split(",")[1]
          outFields.append(field)
     print ",".join(outFields)
     dataLine = fileHandles[0].readline()

答案 1 :(得分:0)

基本上,您希望以zip对迭代器的方式同时遍历所有输入文件。

此示例说明了没有文件和csvs分散注意的模式:

file_row_col = [[['1A1', '1A2'],  # File 1, Row A, Column 1 and 2
                 ['1B1', '1B2']], # File 1, Row B, Column 1 and 2
                [['2A1', '2A2'],  # File 2
                 ['2B1', '2B2']],
                [['3A1', '3A2'],  # File 3
                 ['3B1', '3B2']]]

outrows = []

for rows in zip(*file_row_col):
    outrow = [rows[0][0]] # Column 1 of the first file
    for row in rows:
        outrow.extend(row[1:]) # Only Column 2 and on
    outrows.append(outrow)

# outrows is now [['1A1', '1A2', '2A2', '3A2'],
#                 ['1B1', '1B2', '2B2', '3B2']]

关键是zip(*file_row_col)完成转换。

现在让我们用实际文件重新实现这个模式。我将使用csv库使读取和编写csv更容易和更安全。

import csv

infilenames = ['1.csv','2.csv','3.csv']
outfilename = 'result.csv'

with open(outfilename, 'wb') as out: 
    outcsv = csv.writer(out)
    infiles = []
    # We can't use `with` with a list of resources, so we use
    # try...finally the old-fashioned way instead.
    try:
        incsvs = []
        for infilename in infilenames:
            infile = open(infilename, 'rb')
            infiles.append(infile)
            incsvs.append(csv.reader(infile))
        for inrows in zip(*incsvs):
            outrow = [inrows[0][0]] # Column 1 of file 1
            for inrow in inrows:
                outrow.extend(inrow[1:])
            outcsv.writerow(outrow)
    finally:
        for infile in infiles:
            infile.close()

鉴于这些输入文件:

#1.csv
1A1,1A2
1B1,1B2

#2.csv
2A1,2A2
2B1,2B2

#3.csv
3A1,3A2
3B1,3B2

代码生成此result.csv

1A1,1A2,2A2,3A2
1B1,1B2,2B2,3B2