1

我正在尝试从 n 个文件中读取行。然后我要将所有数据打印到一个文件中。棘手的事情是我不知道目录包含多少文件,我想把它打印出来,这样每个文件都有自己的列。示例:(文本是一些我不关心的数据,可以使用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: 确实与上述相同的问题。我需要在不知道列表中有多少项目的情况下同时访问多个元素,然后打印出所有内容。

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

4

3 回答 3

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
于 2012-09-19T22:44:46.757 回答
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
于 2012-09-19T22:48:40.203 回答
-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);
}

注意:您必须检查索引 [j][i] 是否存在,因为文件的长度不同。

于 2012-09-19T22:39:46.967 回答