1

我想将多个文件中的内容读取到以后可以调用的唯一列表中 - 最终,我想将这些列表转换为集合并对它们执行交集和减法。这一定是一个非常幼稚的问题,但是在仔细研究了 Lutz 的“Learning 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']

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

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

4

6 回答 6

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 的内容进行排序。

于 2011-09-13T20:31:41.020 回答
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  
于 2011-09-13T21:02:59.037 回答
1

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

于 2011-09-13T21:07:30.557 回答
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'...

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

于 2011-09-13T21:41:04.820 回答
0

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

这样的事情会给你一个开始

于 2011-09-13T20:29:33.137 回答
0

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

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

于 2011-09-13T20:50:16.910 回答