我正在尝试从n个文件中读取行。然后我打算将所有数据打印到一个文件。棘手的是,我不知道dir包含多少个文件,我想打印好的,所以每个文件都有自己的列。 示例:(文本是我不关心的一些数据,可以使用split来抓[1])
File 1 contains:
text Line1
text Line2
text Line3
文件2包含:
text Line01
text Line02
text Line03
我想要合并到一个这样的文件:
File 1 File 2
Line1 Line01
Line2 Line02
Line3 Line03
我遇到的一个问题是,当我读取文件时,我一次读取一个文件并将每行附加到列表中,但是如何以我想要的方式打印出来。
fromfiles = ['Line1','Line2','Line3','Line01','Line02','Line03']
或
fromfiles2 = [['Line1','Line2','Line3'],['Line01','Line02','Line03']]
如果是formfiles:如何同时打印line1和line01,然后继续?
如果是formfiles2:真的与上面的问题相同。我需要同时访问多个元素,而不知道列表中有多少项,然后打印出所有内容。
如果有人能帮我解决这个问题,我将不胜感激。
答案 0 :(得分:2)
zip()
就是这样做的!让我们从您的fromfiles2
开始:
>>> fromfiles2 = [['Line1','Line2','Line3'],['Line01','Line02','Line03']]
>>> outputlines = zip(*fromfiles2)
>>> for l in outputlines:
... print "\t".join(l)
...
Line1 Line01
Line2 Line02
Line3 Line03
zip
基本上是这样的:
>>> l1 = [1, 2, 3]
>>> l2 = ['a', 'b', 'c']
>>> zip(l1, l2)
[(1, 'a'), (2, 'b'), (3, 'c')]
当然这也适用于两个以上的论点: - )。
当文件较小时,这是一种很好的方法。然后,您可以先将它们安全地读入内存,将数据合并到内存中,然后将合并后的数据写入输出文件。但是,如果您的输入非常大(GB数据),那么您应该逐行读取输入文件,构建输出行,将其写入文件,然后继续输入文件中的下一行。
如果你有zip
的概念,那么你可以调查itertools.izip
以提高内存效率:
>>> from itertools import izip
>>> for l in izip(*fromfiles2):
... print "\t".join(l)
...
Line1 Line01
Line2 Line02
Line3 Line03
此外,如果您的文件没有相同数量的输入文件,您可能需要查看itertools.izip_longest:
>>> fromfiles3 = [['Line1','Line2','Line3'],['Line01','Line02']]
>>> for l in izip_longest(*fromfiles3, fillvalue="Nothing"):
... print "\t".join(l)
...
Line1 Line01
Line2 Line02
Line3 Nothing
答案 1 :(得分:0)
当您阅读每个文件时,请查找文件中遇到的最大行数(可能使用len())。
使用第二个解决方案,并将每个第1行迭代到全局最大值。如果该文件存在行条目,则将其打印出来;否则,跳过它。
# loop through files
# max = number of lines max
for i in range(max):
line = []
for file in fromfiles2:
if len(file) > i:
line.append(file[i])
else:
line.append('')
# print your line here
答案 2 :(得分:-3)
将它保存在fromfiles2 ...列表列表中。
然后检查最大行数(所有列表中最大的.count())。
然后像这样(伪代码)从0到<<maximum number of lines -1>>
进行for循环:
for(int i = 0; i < maxNumOfLines; i++) {
String lineToPrint = "";
for(int j = 0; j < numberOfLists; j++) {
lineToPrint += listOfLists[j][i];
}
File.Write(lineToPrint);
}
N.B。:你必须检查索引[j] [i]是否存在,因为文件的长度不一样。