Python读取大文件触发OSError: [Errno 22] Invalid Argument问题排查
解决macOS下Python计算大文件SHA256校验和时的OSError问题
你遇到的这个问题是因为一次性读取超大文件到内存导致的。你的代码里用f.read()直接把整个Raspbian镜像文件(通常几个GB)加载到内存,在macOS的Python环境下,这种操作会触发系统级的I/O限制,从而抛出OSError: [Errno 22] Invalid argument。
先看你原来的代码:
import sys import os import hashlib file = '/Users/Me/Downloads/2017-11-29-raspbian-stretch.img' with open(file, 'rb') as f: contents = f.read() print('SHA256 of file is %s' % hashlib.sha256(contents).hexdigest())
问题原因
f.read()默认会尝试读取文件的全部内容到内存中。当文件体积过大(比如超过系统允许的单个内存块大小),macOS的Python解释器就会返回无效参数的错误。这种方式不仅容易触发错误,还会占用大量内存,影响系统运行。
解决方案:分块读取文件计算哈希
正确的做法是分块读取文件,逐块更新SHA256哈希对象,这样不需要把整个文件加载到内存,既能避免错误,又更高效。
修改后的代码如下:
import hashlib def calculate_sha256(file_path, chunk_size=4096): sha256_hash = hashlib.sha256() with open(file_path, 'rb') as f: # 分块读取文件,每次读chunk_size字节 for chunk in iter(lambda: f.read(chunk_size), b''): sha256_hash.update(chunk) return sha256_hash.hexdigest() if __name__ == "__main__": file_path = '/Users/Me/Downloads/2017-11-29-raspbian-stretch.img' sha256 = calculate_sha256(file_path) print(f'SHA256 of file is {sha256}')
代码解释
chunk_size=4096:设置每次读取的块大小(4KB是比较通用的合理值,你也可以根据需要调整为更大的数值,比如65536即64KB)iter(lambda: f.read(chunk_size), b''):创建一个迭代器,持续读取文件块直到返回空字节串(文件读取完毕)sha256_hash.update(chunk):每读一块就更新哈希对象,逐步计算整个文件的SHA256值
这种方法可以高效处理任意大小的文件,不会因为文件过大而触发内存或I/O错误,在macOS和其他系统上都能稳定运行。
内容的提问来源于stack exchange,提问作者Hallvard
相关产品推荐
相关产品推荐

