应使用 line.strip().startswith('#') 判断并跳过注释行,配合 with open(..., encoding='utf-8-sig') 避免 BOM 问题,封装清洗逻辑为独立函数,复杂格式应改用专用解析器。

读取文件时用 if line.startswith('#') 判断跳过注释行
Python 本身没有内置的“跳过注释”开关,必须手动判断每行是否为注释。最常见、最安全的方式是检查行首是否以 # 开头(注意:要先 strip(),否则空格或制表符会导致判断失败)。
- 只用
line.startswith('#')不够——如果行前有空格(如# config),会漏判 - 正确做法是
line.strip().startswith('#')或更严谨地line.strip() == '' or line.strip().startswith('#')(同时跳过空行) - 注意:这种判断只适用于类 Shell/Python 风格的单行注释,不处理
#出现在中间的情况(如value=123 # default),如需保留这类行,不能直接跳过整行
在 for line in open(...) 循环里嵌套 if 过滤
不要试图在 for 行里写条件(Python 不支持 for line in open(...) if not line.startswith('#') 这种语法),必须把判断写在循环体内。
- 推荐写法:
with open('config.txt') as f: for line in f: stripped = line.strip() if not stripped or stripped.startswith('#'): continue # 处理有效行 print(stripped) - 务必用
with open(...),避免文件句柄泄露;不用readlines(),它会一次性加载全部内容到内存,对大文件不友好 - 如果后续要按字段分割(如
=或:),建议在跳过注释后立刻做split(),避免重复strip()
遇到 \ufeff BOM 头导致 startswith('#') 失效
Windows 上用记事本保存的 UTF-8 文件常带 BOM(\ufeff),它会出现在第一行开头,使 line.strip().startswith('#') 返回 False——因为实际是 '\ufeff# comment'。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 解决方法:打开文件时显式指定编码并忽略 BOM:
open('file.txt', encoding='utf-8-sig') -
utf-8-sig会自动剥离 BOM,且兼容无 BOM 的 UTF-8 文件 - 不推荐用
replace('\ufeff', '')手动清理,容易漏掉或误删其他 Unicode 字符
想支持多行注释或内联注释?别硬改 if 判断
如果配置格式变复杂(比如要识别 /* */、//、或保留 key=value # comment 中的值),单纯靠 if line.strip().startswith('#') 就不够用了。
立即学习“Python免费学习笔记(深入)”;
- 此时应换专用解析器:对 INI 用
configparser,对 YAML 用PyYAML,对 TOML 用tomllib(Python 3.11+)或tomli - 自己写状态机解析多行注释极易出错(比如引号内
#是否算注释),不值得为简单场景增加复杂度 - 一个容易被忽略的点:注释判断逻辑一旦写死在业务循环里,后期想升级格式就很难解耦——建议把“读取 + 清洗”封装成独立函数,比如
read_config_lines(path)

















