gpt4 book ai didi

python - 读取大型文本文件时即时计算 md5

转载 作者:行者123 更新时间:2023-12-01 03:26:37 33 4
gpt4 key购买 nike

更新的问题

我知道如何使用 python 从文件创建 md5 哈希 http://docs.python.org/3.5/library/hashlib.html#hash-algorithms 。我还知道如何逐行读取文本文件。然而,我的文件可能会变得很大,并且从头到尾读取文件两次效率低下。我想知道是否可以仅从光盘读取一次数据,并且像在流/管道中一样,智能地组合这两个任务。可能是这样的:

  1. 初始化 md5
  2. 以二进制模式打开文件
  3. 将一大块数据(例如 buffer_size=65536)读入缓冲区
  4. 用刚刚读取的 block 更新 md5
  5. 向另一个流提供缓冲区以继续处理数据
  6. 再次使用TextIOWrapper(?)读取数据,不过这次是文本
  7. 逐行阅读文本。当缓冲区被消耗时,向底层请求更多数据,直到EOF。它将读取更多的二进制数据,更新 md5,提供新的缓冲区...我可以继续逐行读取(就像:从步骤 3 重复直到 EOF)
  8. 在 EOF 后,我已经逐行处理了所有文本,并获得了 md5

目标是通过在同一文件上智能地组合二进制 md5 计算和基于文本的处理,仅从光盘读取(大)文件一次而不是两次,从而提高效率。

我希望这能更好地解释它。再次感谢您的帮助。

于尔根

最佳答案

是的,只需创建一个 hashlib.md5() object并用每个 block 更新它:

md5sum = hashlib.md5()

buffer_size = 2048 # 2kb, adjust as needed.

with open(..., 'rb') as fileobj:
# read a binary file in chunks
for chunk in iter(lambda: fileobj.read(buffer_size), b''):
# update the hash object
md5sum.update(chunk)

# produce the final hash digest in hex.
print(md5sum.hexdigest())

如果您还需要以文本形式读取数据,则必须编写自己的包装器:

  • 任一实现 TextIOBase API (实现所有与读取相关的 stub methods),并从每次调用 open(..., 'rb') 生成的 BufferedIOReader 对象中提取数据要求线路。此时您必须自己进行行分割和解码。

  • 或实现 BufferedIOBase API 的一个(再次实现所有 stub 方法),并将其作为缓冲区传递给 TextIOWrapper class .

关于python - 读取大型文本文件时即时计算 md5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41350054/

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