Python模拟bash wc功能出现计数偏差与编码报错问题咨询
问题排查及修复方案
现有代码的核心问题
- 基础语法错误:代码中只读取了传入的文件路径参数,未执行文件打开操作,直接遍历了未定义的
file变量,本身无法正常运行。 - 读取模式错误:默认使用文本模式读取文件,会触发编码校验、自动转换换行符两个逻辑,是你遇到两个异常的核心原因。
各异常的具体原因
1. PDF文件抛出UnicodeDecodeError
原生bash的wc命令默认按字节读取文件,不会做任何编码校验或转换,因此可以正常处理PDF等二进制文件。
你的代码用文本模式打开文件时,Python默认会用utf-8编码解码文件内容,而PDF属于二进制文件,存在大量不符合utf-8编码规则的字节,因此读取阶段就会抛出解码错误。
2. CSV文件字节数统计和原生wc不一致
有两个诱因共同导致该问题:
- 如果原CSV文件不是utf-8编码,你先解码为字符串再重新编码为utf-8的操作,会改变实际字节长度,和原文件的字节数不匹配。
- 文本模式读取文件时,Python会自动将不同系统的换行符(比如Windows下的
\r\n)统一转换为\n,你重编码后换行符仅占1字节,但原文件中可能是2字节,累加后就会出现统计值比实际值偏小的情况,和你遇到的偏差一致。
修复后的实现代码
直接使用二进制模式读取文件,完全对齐原生wc的处理逻辑:
import sys path = sys.argv[1] line_count = 0 word_count = 0 byte_count = 0 with open(path, 'rb') as f: for line in f: line_count += 1 byte_count += len(line) # 二进制下按空白分割,自动过滤空串,和wc单词统计逻辑一致 word_count += len(line.split()) print(f"{line_count} {word_count} {byte_count} {path}")
修复后的代码不需要处理编码逻辑,支持所有类型的文件,统计结果和原生wc完全一致。
内容的提问来源于stack exchange,提问作者Hossein
相关产品推荐
相关产品推荐

