Python文件处理:复制文件内容时如何过滤#开头的注释行
问题原因
你的代码无法过滤注释行的核心问题是使用了'rb'二进制模式打开文件:
- 二进制模式下读取到的每一行是
bytes类型,buf[0]取到的是字节对应的ASCII整数值,和字符串'#'的判断永远不成立,所以所有行都会被写入目标文件。 - 原有逻辑还存在遗漏:没有处理行首带缩进、空格的注释行,这类行的第一个字符不是
#也会被保留。
修正后的代码
推荐直接用文本模式打开文件,处理逻辑更简单,也能避免编码问题:
with open("essays.txt", 'r', encoding='utf-8') as f1: with open("myfile.txt", 'w', encoding='utf-8') as f2: # 直接遍历文件对象逐行读取,不需要手动控制读取结束 for line in f1: # 先去除行首所有空白字符,再判断是否为注释行 if not line.lstrip().startswith('#'): f2.write(line) print("File Copied")
可选调整说明
如果你的需求是仅过滤第一个字符为#的行,缩进后的注释不需要过滤,把判断条件改为if not line.startswith('#')即可。
如果确实需要使用二进制模式操作,把判断条件改为if buf[0] == ord('#')即可,但不推荐这种做法,二进制模式处理文本容易出现编码适配问题。
内容的提问来源于stack exchange,提问作者Python Learner
相关产品推荐
相关产品推荐

