Python代码输出正常但管道至wc -l时触发UnicodeEncodeError
解决Python管道输出时的UnicodeEncodeError问题
嘿,这个问题我太熟悉了!咱们先把问题理清楚:
你运行这段Python代码的时候,直接执行能正常输出vägen:
#! /usr/bin/env python # -*- coding: UTF-8 -*- import xml.etree.ElementTree as ET print(ET.fromstring('<?xml version="1.0" encoding="UTF-8" standalone="yes"?><root><road>vägen</road></root>').find('road').text)
但把脚本保存为ETerr.py,用管道传给wc -l命令时:
./ETerr.py | wc -l
就触发了UnicodeEncodeError,对吧?
问题根源
这是Python处理标准输出编码的机制导致的:
- 当你直接在终端运行脚本时,Python会检测到stdout是终端设备,自动使用终端的编码(一般是UTF-8)来输出Unicode字符,所以
å能正常显示。 - 但通过管道输出时,stdout变成了非终端的管道设备,Python会默认切换到ASCII编码,而
å不在ASCII字符集里,自然就编码失败报错了。
几种解决方案
1. 在脚本里强制设置stdout编码
直接修改脚本,把stdout的编码固定为UTF-8,不管输出到终端还是管道都能用:
#! /usr/bin/env python # -*- coding: UTF-8 -*- import xml.etree.ElementTree as ET import sys # 重新设置stdout为UTF-8编码 sys.stdout = open(sys.stdout.fileno(), mode='w', encoding='utf-8', buffering=1) road_text = ET.fromstring('<?xml version="1.0" encoding="UTF-8" standalone="yes"?><root><road>vägen</road></root>').find('road').text print(road_text)
2. 运行时设置环境变量
不用修改脚本,在执行时通过PYTHONIOENCODING环境变量指定编码:
PYTHONIOENCODING=utf-8 ./ETerr.py | wc -l
这个方法适合临时调整,不用改动代码。
3. 手动编码输出字符串
如果只是为了过wc -l,也可以手动把Unicode字符串编码成UTF-8字节串输出:
#! /usr/bin/env python # -*- coding: UTF-8 -*- import xml.etree.ElementTree as ET road_text = ET.fromstring('<?xml version="1.0" encoding="UTF-8" standalone="yes"?><root><road>vägen</road></root>').find('road').text # 手动编码为UTF-8字节 print(road_text.encode('utf-8'))
不过要注意,这样输出的是字节串,如果后续还有其他文本处理步骤,可能需要再解码,所以前两种方法更通用。
内容的提问来源于stack exchange,提问作者cpaitor
相关产品推荐
相关产品推荐

