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