gpt4 book ai didi

python - 只处理非空行

转载 作者:太空狗 更新时间:2023-10-30 00:03:34 26 4
gpt4 key购买 nike

我得到了以下代码片段

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对于我自己更好地理解涉及迭代器的 [] 和 () 之间的区别非常有用。

最佳答案

编写的代码没有任何问题,可读性强,效率高。

另一种方法是将其编写为生成器推导式:

def send(self, queue, fd):
non_blank_lines = (line.strip() for line in fd if line.strip())
for line in non_blank_lines:
queue.write(json.loads(data))

如果您正在应用一个可以采用迭代器的函数,这种方法可能是有益的(更简洁):例如python3打印

non_blank_lines = (line.strip() for line in fd if line.strip())
print(*non_blank_lines, file='foo')

为了消除对 strip() 的多次调用,将生成器理解链接在一起

stripped_lines = (line.strip() for line in fd)
non_blank_lines = (line for line in stripped_lines if line)

请注意,生成器表达式不会对内存产生不利影响,详见 pep .

要更深入地了解这种方法和一些性能基准,请查看这组 notes .

最后请注意,如果您不需要 strip() 的完整行为,rstrip() 将优于 strip()。

关于python - 只处理非空行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13688522/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com