从n个文件以n列的形式打印列表(共个列表)

2024-09-27 00:20:51 发布

您现在位置:Python中文网/ 问答频道 /正文

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

File 1 contains:
text Line1
text Line2
text Line3

文件2包含:

^{pr2}$

我想合并这个文件:

File 1 File 2
Line1  Line01
Line2  Line02
Line3  Line03

我遇到的一个问题是,当我读取这些文件时,我一次只读取一个文件,并将每一行追加到一个列表中,但是如何以我想要的方式打印出来呢。在

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

或者

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

在case formfiles中:如何同时打印line1和line01,然后继续?在

在caseformfiles2中:确实存在与上面相同的问题。我需要同时访问多个元素,而不知道列表中有多少项,然后打印出所有内容。在

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


Tags: 文件数据text示例列表dirfile关心
3条回答

^{}就是为了这个!让我们从您的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的基本工作原理:

^{pr2}$

当然,这也适用于两个以上的参数:-)。在

当文件很小时,这是一个很好的方法。然后,您可以安全地将它们读入内存,合并内存中的数据,然后将合并的数据写入输出文件。但是,如果您的输入确实很大(GB的数据),那么您应该同时逐行读取输入文件,构建一个输出行,将其写入文件,然后再继续输入文件中的下一行。在

如果您有了zip的概念,那么您可以研究itertools.izip来提高内存效率:

>>> from itertools import izip
>>> for l in izip(*fromfiles2):
...     print "\t".join(l)
...
Line1   Line01
Line2   Line02
Line3   Line03

{a2如果不想查看相同数量的文件},可能还需要查看}

>>> fromfiles3 = [['Line1','Line2','Line3'],['Line01','Line02']]
>>> for l in izip_longest(*fromfiles3, fillvalue="Nothing"):
...     print "\t".join(l)
...
Line1   Line01
Line2   Line02
Line3   Nothing

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

像在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]是否存在,因为文件的长度不会相同。在

相关问题 更多 >

    热门问题