从n个文件打印列表(列表)为n列

时间:2012-09-19 22:31:43

标签: python list file-io

我正在尝试从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:真的与上面的问题相同。我需要同时访问多个元素,而不知道列表中有多少项,然后打印出所有内容。

如果有人能帮我解决这个问题,我将不胜感激。

3 个答案:

答案 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]是否存在,因为文件的长度不一样。