我有以下代码片段
def send(self, queue, fd):
for line in fd:
data = line.strip()
if data:
queue.write(json.loads(data))
哪个当然工作得很好,但我有时想知道是否有一种“更好”的方式来编写你只在非空白行上操作的构造。
挑战在于这应该使用“fd”读取的迭代特性,并且能够处理 100+ MB 范围内的文件。
更新 - 在您急于获得这个问题的分数时,您忽略了一个导入部分,即内存使用情况。例如表达式:
non_blank_lines = (line.strip() for line in fd if line.strip())
将整个文件缓冲到内存中,更不用说执行两次 strip() 操作了。这适用于小文件,但当您有 100+MB 的数据(或偶尔 100GB)时会失败。
部分挑战是以下作品,但阅读起来很困难:
for line in ifilter(lambda l: l, imap(lambda l: l.strip(), fd)):
queue.write(json.loads(line))
寻找魔术师!
最终更新:PEP-289对我自己更好地理解 [] 和 () 与迭代器之间的区别非常有用。