当前位置: 首页 > 面试题库 >

遍历多个文件的所有行的最pythonic方法是什么?

东门楚
2023-03-14
问题内容

我想将许多文件都当作一个文件来对待。用生成器/不将整个文件读入内存的[文件名] => [文件对象] => [行]的正确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程序设计有所帮助。