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

遍历目录内文件时触发IsADirectoryError错误求助

问题原因

你的SHA256_HASHES_pack1列表里混进了目录路径(比如hard_signatures),而open()函数只能打开文件,尝试打开目录就会触发IsADirectoryError。

解决方案

根据你的实际需求,有两种常见处理方式:

1. 过滤列表里的非文件路径

如果SHA256_HASHES_pack1本来就应该只包含文件路径,只是不小心混进了目录,就在循环里加判断,跳过非文件的路径:

用os模块实现

import os
import hashlib

BUF_SIZE = 65536  # 假设你已定义该变量

for i in SHA256_HASHES_pack1:
    # 判断当前路径是否为文件
    if not os.path.isfile(i):
        print(f"跳过非文件: {i}")
        continue
    with open(i, 'rb') as f:
        md5 = hashlib.md5()
        sha1 = hashlib.sha1()
        while True:
            data = f.read(BUF_SIZE)
            md5.update(data)
            sha1.update(data)
            if not data:
                break  # 文件读完后退出循环
        # 可在此处输出或保存哈希结果
        print(f"{i} - MD5: {md5.hexdigest()}, SHA1: {sha1.hexdigest()}")

用pathlib(Python 3.4+推荐)

from pathlib import Path
import hashlib

BUF_SIZE = 65536

for path_str in SHA256_HASHES_pack1:
    path = Path(path_str)
    if not path.is_file():
        print(f"跳过非文件: {path}")
        continue
    with path.open('rb') as f:
        md5 = hashlib.md5()
        sha1 = hashlib.sha1()
        while True:
            data = f.read(BUF_SIZE)
            md5.update(data)
            sha1.update(data)
            if not data:
                break
        print(f"{path} - MD5: {md5.hexdigest()}, SHA1: {sha1.hexdigest()}")

2. 遍历目录下的所有文件

如果hard_signatures是你要处理的目标目录,原本逻辑是要处理该目录下的所有文件,那应该调整获取文件路径的方式,而不是直接把目录放进列表:

用os模块遍历目录

import os
import hashlib

BUF_SIZE = 65536
target_dir = "hard_signatures"

# 遍历目录下所有条目,过滤出文件
for filename in os.listdir(target_dir):
    file_path = os.path.join(target_dir, filename)
    if os.path.isfile(file_path):
        with open(file_path, 'rb') as f:
            md5 = hashlib.md5()
            sha1 = hashlib.sha1()
            while True:
                data = f.read(BUF_SIZE)
                md5.update(data)
                sha1.update(data)
                if not data:
                    break
            print(f"{file_path} - MD5: {md5.hexdigest()}, SHA1: {sha1.hexdigest()}")

用pathlib的glob遍历(更简洁)

from pathlib import Path
import hashlib

BUF_SIZE = 65536
target_dir = Path("hard_signatures")

# 遍历目录下所有文件(需遍历子目录的话用"**/*",并添加recursive=True参数)
for file_path in target_dir.glob("*"):
    if file_path.is_file():
        with file_path.open('rb') as f:
            md5 = hashlib.md5()
            sha1 = hashlib.sha1()
            while True:
                data = f.read(BUF_SIZE)
                md5.update(data)
                sha1.update(data)
                if not data:
                    break
            print(f"{file_path} - MD5: {md5.hexdigest()}, SHA1: {sha1.hexdigest()}")

注意:你原本的代码中while True循环缺少退出条件,文件读完后会无限空读,记得补上break语句。

内容的提问来源于stack exchange,提问作者Abdul Manan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 02:45:33