You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:28:03