Python 3遍历目录时如何跳过无法读取的文件(如.DS_STORE)
解决读取特殊编码文件时的程序崩溃问题
嘿,这个问题太常见了——像.DS_STORE这类特殊文件(或者其他编码异常、无读取权限的文件)总容易搞砸批量处理脚本。你的核心问题是没处理文件读取过程中的异常,所以一遇到无法正常读取的文件就直接崩溃了。
我给你调整了代码,加入了异常处理和文件类型判断,这样就能自动跳过所有无法读取的文件:
import os path = "/home/me/Work/myprojectvirtualenv/myproject/homepage/templates/" for item in os.listdir(path): item_path = os.path.join(path, item) # 先跳过子目录,避免尝试读取文件夹导致报错 if not os.path.isfile(item_path): continue print(f"Checking {item}") try: # 使用with语句自动管理文件资源,比直接open更安全 with open(item_path, 'r', encoding='utf-8') as f: content = f.read() if 'userType' in content: print(f"FOUND USERTYPE IN {item}") # 捕获常见的读取异常:编码错误、权限不足、IO错误 except (UnicodeDecodeError, PermissionError, IOError) as e: # 可选:打印跳过的原因方便排查,不需要的话可以删掉这行 print(f"Skipping {item}: {str(e)}") continue
关键改进点:
- 跳过目录:用
os.path.isfile判断当前item是否是文件,避免尝试读取子目录引发错误 - 异常捕获:专门捕获
UnicodeDecodeError(比如.DS_STORE是二进制文件,用文本模式读取会触发这个错误)、PermissionError(没有文件读取权限)和IOError(其他IO相关问题),遇到这些情况就直接跳过该文件 - 安全的文件操作:使用
with语句打开文件,它会自动帮你关闭文件,避免资源泄漏
如果你想更针对性地跳过.DS_STORE,可以在循环开头加一行if item == '.DS_STORE': continue,但异常处理的方式更通用,能覆盖所有意料之外的无法读取的文件情况。
内容的提问来源于stack exchange,提问作者wanderer0810
相关产品推荐
相关产品推荐

