首选文件逐行读取Python中的习语
作者:互联网
几乎每次我用Python读取文件时,我都想要的是:
with open("filename") as file_handle:
for line in file_handle:
#do something
这真的是首选的成语吗?这种双重缩进所有文件读取逻辑,这有点让我感到恼火.有没有办法将这个逻辑折叠成一行或一层?
解决方法:
对于简单的情况,是的,两级with和for是惯用的.
对于缩进成为问题的情况,这里与Python中的任何其他地方一样,惯用的解决方案是找到一些东西分解成一个函数.
你可以编写包装来帮助它.例如,这是解决您使用的一些问题的简单方法(例如,即使在最好的情况下,文件在完成循环后仍然存在,直到范围结束 – 可能是几天之后,或者永远不会,如果范围是主事件循环或生成器或其他东西……):
def with_iter(iterable):
with iterable:
yield from iterable
for line in with_iter(open("filename")):
# do something
for line in with_iter(open("other_filename")):
# do something else
当然它并不能解决所有问题. (有关详细信息,请参阅this ActiveState recipe.)
如果你知道它做你想要的,那很好.如果你不理解差异……坚持什么是惯用的;它是惯用的原因.
那么,你如何重构代码呢?最简单的方法通常是将循环体转换为函数,因此您可以使用map或理解:
def do_with_line(line):
return line
with open("filename") as f:
process = [do_with_line(line) for line in f]
但如果问题是for上面或下面的代码太深,你将不得不在不同的层次上进行重构.
标签:python,idioms,file-io 来源: https://codeday.me/bug/20190529/1177073.html