栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

读取()一个大文件时出现“ OSError:[Errno 22]无效参数”

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

读取()一个大文件时出现“ OSError:[Errno 22]无效参数”

在Python的历史上,存在
多个
问题(在最新版本中已修复),从文件句柄一次读取超过2-4
GB的数据(该问题的无法修复的版本也发生在32位版本的Python上,但它们根本缺乏)分配缓冲区的虚拟地址空间;与I /
O不相关,但最常见的是处理大型文件。可用于散列的一种变通方法是以固定大小的块更新散列(无论如何,这是一个好主意,因为指望RAM大于文件大小是一个糟糕的主意)。最直接的方法是将代码更改为:


with open(file, 'rb') as f:    hasher = hashlib.sha256()  # Make empty hasher to update piecemeal    while True:        block = f.read(64 * (1 << 20)) # Read 64 MB at a time; big, but not memory busting        if not block:  # Reached EOF break        hasher.update(block)  # Update with new blockprint('SHA256 of file is %s' % hasher.hexdigest())  # Finalize to compute digest

如果您喜欢,可以使用two-arg

iter
和一些
functools
魔术“简化”循环,将整个
while
循环替换为:

for block in iter(functools.partial(f.read, 64 * (1 << 20)), b''):    hasher.update(block)

在Python
3.8+上,使用walrus运算符,

:=
它更简单,无需导入或不可读的代码:

while block := f.read(64 * (1 << 20)):  # Assigns and tests result in conditional!    hasher.update(block)


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/645939.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号