我想将几个文件中的内容读入我以后可以调用的唯一列表中 - 最终,我想将这些列表转换为集合并对它们执行交叉和减法。这一定是一个非常天真的问题,但在仔细研究了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']
这些列表是正确的,但是我如何将每个列表分配给一个唯一的变量,以便我以后可以调用它们(例如,通过在变量名中包含索引#)?
非常感谢指出一个完整的编程初学者正确的方向!
答案 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 Types,someListVar.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列表的列表,即列表列表。
一句话:使用大写变量名称非常罕见。对此没有严格的规定,但按照惯例,大多数人只使用大写的名称。