Python新手 - 如何将多个文件内容读取到唯一列表中?

1 投票
6 回答
5791 浏览
提问于 2025-04-17 02:14

我想从几个文件中读取内容,并把这些内容放到不同的列表里,以便以后可以调用。最终,我想把这些列表转换成集合,然后进行交集和差集的操作。这可能是个很简单的问题,但我在看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 个回答

1

你可以看看Python的fileinput模块。这个模块是Python标准库的一部分,可以让你一次处理多个文件。

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 模块。关于排序的内容,可以查看 可变序列类型,使用 someListVar.sort() 这个方法可以直接对someListVar里的内容进行排序。

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  

撰写回答