我正在尝试编写一个脚本,它将占用几个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的情况下这样做。
答案 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