csvcut管道调用时忽略-e编码选项的问题排查与修复咨询
问题原因与修复方案
为什么两种调用方式结果不同?
csvcut的-e/--encoding选项仅对直接指定的文件输入生效。当输入来自管道(标准输入stdin)时,csvcut会忽略这个参数,转而使用Python的系统默认编码(通常是UTF-8)来解码输入流,这就导致含扩展ASCII字符(比如示例中的Ñ,十六进制0xd1)的内容解码失败,抛出UnicodeDecodeError。
修复方法
有两种可靠的解决方式:
1. 设置PYTHONIOENCODING环境变量
这个环境变量会强制Python使用指定编码处理标准输入/输出,覆盖默认的UTF-8。执行命令时直接前置环境变量即可:
PYTHONIOENCODING=latin-1 cat input.txt | csvcut -v -c AGE,NAME
注:这里无需再加-e latin-1参数,因为环境变量已经指定了标准输入的解码编码。
2. 用iconv预先转码
先把latin-1编码的文件转成UTF-8,再通过管道传给csvcut:
iconv -f latin-1 -t utf-8 input.txt | csvcut -v -c AGE,NAME
内容的提问来源于stack exchange,提问作者Ed Beighe
相关产品推荐
相关产品推荐

