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

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

相关产品推荐
方舟 Agent Plan

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

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