Python 将n个文件中的列表(共列表)打印为n列

Python 将n个文件中的列表(共列表)打印为n列,python,list,file-io,Python,List,File Io,我正在尝试从n个文件中读取行。然后我将把所有数据打印到一个文件中。棘手的是,我不知道dir包含多少文件,我想把它打印出来,这样每个文件都有自己的列。 示例:(文本是一些我不关心的数据,可以使用拆分来获取[1]) 文件2包含: text Line01 text Line02 text Line03 我想合并成一个文件,如下所示: File 1 File 2 Line1 Line01 Line2 Line02 Line3 Line03 我遇到的一个问题是,当我读取文件时,我一次读取一个文件

我正在尝试从n个文件中读取行。然后我将把所有数据打印到一个文件中。棘手的是,我不知道dir包含多少文件,我想把它打印出来,这样每个文件都有自己的列。 示例:(文本是一些我不关心的数据,可以使用拆分来获取[1])

文件2包含:

text Line01
text Line02
text Line03
我想合并成一个文件,如下所示:

File 1 File 2
Line1  Line01
Line2  Line02
Line3  Line03
我遇到的一个问题是,当我读取文件时,我一次读取一个文件,并将每一行附加到一个列表中,但是如何按我想要的方式打印出来呢

fromfiles = ['Line1','Line2','Line3','Line01','Line02','Line03']

如果是formfiles:如何同时打印第1行和第01行,然后继续

在案例formfiles2中:与上述问题完全相同。我需要在不知道列表中有多少项的情况下同时访问多个元素,然后打印出所有内容


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

像在fromfiles2中那样保存它。。。一份名单

然后检查最大行数(所有列表中最大的.count()

然后做一个从0到
的for循环,如下所示(伪代码):

for(int i=0;i
注意:您必须检查索引[j][i]是否存在,因为文件的长度将不相同。

就是为此而设计的!让我们从文件2的
开始:

>>> 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
此外,如果文件的输入文件数不同,您可能需要查看:


读取每个文件时,请保持查找文件中遇到的最大行数(可能使用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

同时打开两个文件并写出每一行?所以我应该同时打开n个文件?如果你问我的话,听起来不太好。@Klaazy:你看过我的答案了吗?这不是“听起来不错”的问题。只是一个要求的问题。考虑你的输入文件是1 GB每一个你有10个:你仍然可以处理他们想要的方式,但你必须逐行处理它们,因为否则你将运行RAM。不过,我假设您的输入文件不是很大,内存中的解决方案完全可以。是的,很抱歉我没有读到您的问题,以为您说的是2个文件。@Jan Philip Gehrcke:是的,您是对的。去他妈的。。。我认为人们可以通过我的伪python代码来理解我的意思。请不要再使用伪代码。谢谢,这解决了我的问题。我使用fromfiles2和zip,然后我只需要打印出来。
>>> l1 = [1, 2, 3]
>>> l2 = ['a', 'b', 'c']
>>> zip(l1, l2)
[(1, 'a'), (2, 'b'), (3, 'c')]
>>> from itertools import izip
>>> for l in izip(*fromfiles2):
...     print "\t".join(l)
...
Line1   Line01
Line2   Line02
Line3   Line03
>>> fromfiles3 = [['Line1','Line2','Line3'],['Line01','Line02']]
>>> for l in izip_longest(*fromfiles3, fillvalue="Nothing"):
...     print "\t".join(l)
...
Line1   Line01
Line2   Line02
Line3   Nothing
# 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