我想将许多文件都当作一个文件来对待。用生成器/不将整个文件读入内存的[文件名] => [文件对象] => [行]的正确pythonic方法是什么?
我们都知道打开文件的正确方法:
with open("auth.log", "rb") as f:
print sum(f.readlines())
而且我们知道将多个迭代器/生成器链接为一个长链的正确方法:
>>> list(itertools.chain(range(3), range(3)))
[0, 1, 2, 0, 1, 2]
但是如何将多个文件链接在一起并保留上下文管理器?
with open("auth.log", "rb") as f0:
with open("auth.log.1", "rb") as f1:
for line in itertools.chain(f0, f1):
do_stuff_with(line)
# f1 is now closed
# f0 is now closed
# gross
我可以忽略上下文管理器并执行类似的操作,但是感觉不对:
files = itertools.chain(*(open(f, "rb") for f in file_names))
for line in files:
do_stuff_with(line)
还是这种异步IO-PEP
3156
用途是什么,我只需要稍后再等待优雅的语法?
总有fileinput
。
for line in fileinput.input(filenames):
...
但是,阅读源代码似乎fileinput.FileInput
不能用作上下文管理器1。为了解决这个问题,可以使用实例,contextlib.closing
因为FileInput
实例具有合理实现的close
方法:
from contextlib import closing
with closing(fileinput.input(filenames)) as line_iter:
for line in line_iter:
...
使用上下文管理器的另一种方法是编写一个简单的函数,遍历文件并随行产生以下行:
def fileinput(files):
for f in files:
with open(f,'r') as fin:
for line in fin:
yield line
itertools.chain
这里不需要真正的恕我直言…这里的魔力在于yield
语句,该语句用于将普通函数转换为异常懒惰的生成器。
1顺便说一句,从python3.2开始,fileinput.FileInput
被
实现为上下文管理器,它执行与我们之前所做的完全一样的操作contextlib
。现在我们的示例变为:
# Python 3.2+ version
with fileinput.input(filenames) as line_iter:
for line in line_iter:
...
尽管另一个示例也适用于python3.2 +。
问题内容: 假设我有两个或两个以上相同长度的列表。遍历它们的好方法是什么? ,是列表。 要么 还是我缺少任何变体? 使用一个相对于另一个有什么特别的优势吗? 问题答案: 通常的方法是使用: 这将停止两个iterables时较短且耗尽。另外值得注意的是:(仅适用于Python 2)和(适用于Python 3)。
问题内容: 目前,我正在使用类似: 我对这种方法不是很满意,因为它会创建大量数组(可以包含一本书)。 有没有更好的解决方案来迭代a的行? 问题答案: 您可以使用: 并使用方法:
本文向大家介绍C#遍历指定目录下所有文件的方法,包括了C#遍历指定目录下所有文件的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#遍历指定目录下所有文件的方法。分享给大家供大家参考。具体分析如下: 先通过DirectoryInfo打开指定的目录,然后通过GetFiles()方法读取文件夹下的所有文件 希望本文所述对大家的C#程序设计有所帮助。
本文向大家介绍python中遍历文件的3个方法,包括了python中遍历文件的3个方法的使用技巧和注意事项,需要的朋友参考一下 今天写一个在windows下批量修改文件名的python脚本,用到文件的遍历。用python进行文件遍历有多种方法,这里列举并说明一下。 os.path.walk() 这是一个传统的用法。 walk(root,callable,args)方法有三个参数:要遍历的目录,回调
问题内容: 我想按顺序对数据帧中的财务数据执行自己的复杂操作。 例如,我正在使用以下来自的 MSFT CSV文件: 然后,我执行以下操作: 那是最有效的方法吗?考虑到对熊猫速度的关注,我认为必须有一些特殊的函数来迭代这些值,使它们也可以检索索引(可能通过生成器来提高内存效率)?不幸的是,只能逐列进行迭代。 问题答案: 熊猫的最新版本现在包括用于遍历行的内置函数。 或者,如果你想更快地使用它 但是,
本文向大家介绍PHP遍历XML文档所有节点的方法,包括了PHP遍历XML文档所有节点的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP遍历XML文档所有节点的方法。分享给大家供大家参考。具体实现方法如下: 1. contact.xml代码: 2. php代码: 希望本文所述对大家的php程序设计有所帮助。