【问题标题】:Fastest Method to read many files line by line in Python在 Python 中逐行读取多个文件的最快方法
【发布时间】:2020-07-21 01:19:25
【问题描述】:

我有一个概念性问题。我是 Python 新手,我正在寻找涉及处理更大日志文件的任务。其中一些可以达到 5 和 6GB

我需要解析一个位置的许多文件。这些是文本文件。

我知道 with open() 方法,最近刚刚遇到了 pathlib。因此,我不仅需要逐行读取文件以提取要上传到数据库的值,还需要获取 Pathlib 为您提供的文件属性并上传它们。

使用 open 和在它下面是否更快,调用一个从中读取文件的路径对象......像这样:

for filename in glob('**/*.*', recursive=False):
    fpath = Path(filename)
    with open(filename, 'rb', buffering=102400) as logfile:
        for line in logfile:
            #regex operation
            print(line)

还是使用 Pathlib 会更好:

with Path("src/module.py") as f:
    contents = open(f, "r")
    for line in contents:
        #regex operation
        print(line)

另外,因为我从来没有使用 Pathlib 打开文件进行阅读。说到这里:Path.open(mode=’r’, buffering=-1, encoding=None, errors=None, newline=None)

换行和错误是什么意思?我假设这里的缓冲和 with open 函数中的缓冲是一样的?

我还看到了这个与路径对象结合使用的装置,虽然它是如何工作的,但我不知道:

path = Path('.editorconfig')
with open(path, mode='wt') as config:
    config.write('# config goes here')

【问题讨论】:

  • 没有人可以在没有访问您的数据和数据库的情况下为您回答这个问题。我建议安装 ipython/jupyter 并在一小部分数据上使用 %timeit 魔术命令
  • @PaulH 一般来说呢?什么通常更快?或者是与 open() 相同的 Path.open()
  • 我不知道。我会使用%timeit 魔法来找出答案。
  • 您会发现grep 非常适合将文件行与正则表达式匹配,并且由专业人士用 c 语言实现,速度非常快。如果你喜欢它,可以用 python 重新实现,但可以把它当作一种学术追求。

标签: python python-3.x pathlib


【解决方案1】:

pathlib 旨在成为与文件系统交互的更优雅的解决方案,但这不是必需的。它会增加少量的固定开销(因为它封装了其他较低级别的 API),但不应以任何有意义的方式改变性能扩展方式。

如前所述,由于pathlib 主要是对较低级别API 的封装,您应该知道Path.open 是根据open 实现的,并且参数对两者都意味着相同的东西;阅读the docs for the built-in open 将描述这些论点。

至于您问题的最后一点(将Path 对象传递给内置open),这是因为大多数文件相关的API 都已更新为支持任何实现the os.PathLike ABC 的对象。

【讨论】:

  • 所以我可以只使用 Path.open() 并且不会发生明显的开销吗?
  • @edo101:是的,通过pathlib 包装层的固定开销微不足道,但相对于磁盘 I/O 的成本而言,它通常是噪音;为一个需要几毫秒的操作浪费几微秒是没有意义的。
  • 最终使用 'with open(path obj, 'rb')' 而不是 Path.open()。由于我没有使用路径包装器,所以我认为会稍微快一点?
  • @edo101:无论哪种方式都没有意义; Path 对象包装器仍然在那里被调用,但它所要做的就是通过PathLike ABC 的接口将自己转换为字符串。在这两种情况下,实际打开文件时付出的开销都是微不足道的,但生成的文件对象是相同的,具有相同的性能。
  • 我应该尽量不使用 Pathlib 吗?还是我对 Pathlib 可能带来的性能影响感到偏执?
猜你喜欢
  • 2011-08-13
  • 1970-01-01
  • 2013-10-19
  • 2018-07-10
  • 2021-12-08
  • 1970-01-01
  • 2011-12-23
  • 2012-10-20
相关资源
最近更新 更多