Python脚本经Bash重定向到文件时ASCII编码错误解决咨询
解决Python2.6中重定向Unicode输出到文件的UnicodeEncodeError问题
这个问题的核心原因是Python在输出到终端时会自动适配终端的字符编码,但当你用Bash重定向>把输出写到文件时,Python会默认使用ASCII编码来处理标准输出,而你的u"café"里包含非ASCII字符(é的Unicode是u'\xe9'),自然就触发了编码错误。
下面是几种可行的解决方案:
方案1:设置PYTHONIOENCODING环境变量(无需修改脚本)
这是最便捷的方法,直接在运行脚本时指定标准输出的编码:
PYTHONIOENCODING=utf-8 python test.py > result.txt
Python2.6及以上版本支持这个环境变量,它会强制Python用指定的编码(这里是utf-8)来处理标准输入、输出和错误流,不管输出目标是终端还是文件。
方案2:在脚本中显式编码Unicode字符串
修改你的test.py,把Unicode字符串编码成utf-8再输出:
# -*- coding: utf-8 -*- print u"café".encode('utf-8')
这样输出的是字节串,Python不会再自动编码,不管重定向到哪里都能正常写入utf-8编码的字符。
方案3:全局设置Python默认编码(谨慎使用)
如果你不想每次都加环境变量,也可以在脚本中修改默认编码,但这个方法会影响全局的字符串编码行为,可能引发其他潜在问题,适合简单脚本场景:
# -*- coding: utf-8 -*- import sys reload(sys) # Python2中需要重新加载sys才能调用setdefaultencoding sys.setdefaultencoding('utf-8') print u"café"
注意:sys.setdefaultencoding在Python初始化后会被移除,所以必须先reload(sys)才能调用。
补充说明:为什么终端运行正常?
当你直接在终端运行脚本时,Python会检测终端的字符编码(比如通过LANG或LC_CTYPE环境变量),并自动用这个编码来输出Unicode字符串,所以café能正常显示。但重定向时,标准输出不再关联终端,Python就会默认使用ASCII编码,导致报错。
内容的提问来源于stack exchange,提问作者fgalan
相关产品推荐
相关产品推荐

