1

到目前为止,这是我的脚本:

#!/usr/bin/env python
import fileinput
from optparse import OptionParser

op = OptionParser()
(options, files) = op.parse_args()
print options
print files
content = []
for line in fileinput.input(files):
    # print "reading from " + fileinput.filename()
    if (fileinput.isfirstline()):
        content.append([])
        # print "is reading from the first line"
    content[-1].append(line.rstrip())

如您所见,我正在读取所有文件中的所有行并构建这样的结构

[["contents", "file 1"], ["file 2; is one line"], ["file 3", "has", "3 lines in it"]]

据我所知,fileinput这不允许我根据行分开,所以我求助于isfirstline()每一行,看看我是否已经进入下一个文件。

是不是我不能使用列表推导优雅地完成这项工作?因为我似乎仅限于所有线路的单个循环。有什么聪明的方法可以让我把文件分开吗?

4

2 回答 2

2

是不是我不能使用列表推导优雅地完成这项工作?因为我似乎仅限于所有线路的单个循环。

一般来说,您应该抵制在列表理解中过多投入的冲动。它会使代码更难阅读和调试。也就是说,列表推导与itertools.chain配合得很好,您可以在一个列表推导中放置多个 for 循环,甚至可以下一个列表推导。

所以,很多答案都是可能的。以下是其中的几个:

[map(str.rstrip, f.readlines()) for f in files]

[[line.rstrip() for line in f] for f in files]
于 2013-05-12T03:25:48.720 回答
0

除非我误解了您的代码,否则如果您想通过换行符拆分它,这应该可以工作:

content = [[final for final in line] for line in fileinput.input(files)]
于 2013-05-12T03:29:42.420 回答