python初学者 - 如何将多个文件的内容读入唯一列表?

时间:2011-09-13 20:19:22

标签: python for-loop readlines

我想将几个文件中的内容读入我以后可以调用的唯一列表中 - 最终,我想将这些列表转换为集合并对它们执行交叉和减法。这一定是一个非常天真的问题,但在仔细研究了Lutz的“学习Python”的迭代器和循环部分之后,我似乎无法理解如何处理这个问题。这就是我写的:

#!/usr/bin/env python

import sys

OutFileName = 'test.txt'
OutFile = open(OutFileName, 'w')

FileList = sys.argv[1: ]
Len = len(FileList)
print Len

for i in range(Len):
    sys.stderr.write("Processing file %s\n" % (i))
    FileNum = i

for InFileName in FileList:
    InFile = open(InFileName, 'r')
    PathwayList = InFile.readlines()
    print PathwayList
    InFile.close()

使用几个简单的测试文件,我得到如下输出:

  

处理文件0

     

处理文件1

     

['alg1 \ n','alg2 \ n','alg3 \ n','alg4 \ n','alg5 \ n','alg6']

     

['csr1 \ n','csr2 \ n','csr3 \ n','csr4 \ n','csr5 \ n','csr6 \ n','csr7 \ n','alg2 \ n ','alg6']

这些列表是正确的,但是我如何将每个列表分配给一个唯一的变量,以便我以后可以调用它们(例如,通过在变量名中包含索引#)?

非常感谢指出一个完整的编程初学者正确的方向!

6 个答案:

答案 0 :(得分:2)

#!/usr/bin/env python

import sys

FileList = sys.argv[1: ]
PathwayList = []
for InFileName in FileList:
    sys.stderr.write("Processing file %s\n" % (i))
    InFile = open(InFileName, 'r')
    PathwayList.append(InFile.readlines())
    InFile.close()

假设您读入了两个文件,以下内容将逐行进行比较(它不会在较长的文件中拾取任何额外的行,但如果有一行比行更多,则它们不会相同其他;)

for i, s in enumerate(zip(PathwayList[0], PathwayList[1]), 1):
    if s[0] == s[1]:
        print i, 'match', s[0]
    else:
        print i, 'non-match', s[0], '!=', s[1]

对于您想要做的事情,您可能需要查看Python中的difflib模块。要进行排序,请查看Mutable Sequence TypessomeListVar.sort()将对someListVar的内容进行排序。

答案 1 :(得分:1)

如果你不需要记住内容的来源,你可以这样做:

PathwayList = []
for InFileName in FileList:
    sys.stderr.write("Processing file %s\n" % InFileName)
    InFile = open(InFileName, 'r')
    PathwayList.append(InFile.readlines())
    InFile.close()  

for contents in PathwayList:
    # do something with contents which is a list of strings
    print contents  

或者,如果要跟踪文件名,可以使用字典:

PathwayList = {}
for InFileName in FileList:
    sys.stderr.write("Processing file %s\n" % InFileName)
    InFile = open(InFileName, 'r')
    PathwayList[InFile] = InFile.readlines()
    InFile.close()

for filename, contents in PathwayList.items():
    # do something with contents which is a list of strings
    print filename, contents  

答案 2 :(得分:1)

您可能需要查看Python的fileinput模块,它是标准库的一部分,允许您一次处理多个文件。

答案 3 :(得分:1)

基本上,您有一个文件列表,并且您想要更改为这些文件的行列表...

有几种方法:

result = [ list(open(n)) for n in sys.argv[1:] ]

这会给你一个像 - >的结果[['alg1','alg2','alg3'],['csr1','csr2'...]]访问将类似于'result [0]',这将导致['alg1','alg2' ,'alg3'] ......

更好的可能是字典:

result = dict( (n, list(open(n))) for n in sys.argv[1:] )

如果你想连接,你只需要链接它:

import itertools
result = list(itertools.chain.from_iterable(open(n) for n in sys.argv[1:]))
# -> ['alg1', 'alg2', 'alg3', 'csr1', 'csr2'...

对初学者来说不是单行...但是现在尝试理解正在发生的事情会是一个很好的练习:)

答案 4 :(得分:0)

您需要为您正在阅读的每个文件“数字”动态创建变量名称。 (我故意故意模糊,知道如何构建这样的变量是非常有价值的,如果你自己发现它会更容易记住)

this之类的东西会给你一个开始

答案 5 :(得分:0)

您需要一个包含PathwayList列表的列表,即列表列表。

一句话:使用大写变量名称非常罕见。对此没有严格的规定,但按照惯例,大多数人只使用大写的名称。