遍历目录内文件时触发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
相关产品推荐
相关产品推荐

