python print 中文重定向失败

Posted 苏轶然

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python print 中文重定向失败相关的知识,希望对你有一定的参考价值。

一直以来认为解决python字符集编码,不一定需要通过sys.setdefaultencoding。因为既然python实现过程中,默认禁用了该操作,说明是不推荐的。
通过不断的字符转换,也cover了一些问题。
但今天在把python输出的中文重定向到文件作为日志输出时,遇到了问题。
直接打屏没问题,但重定向到文件就会有问题。

日志

calculate for cc with result list offset 0 -> 255
Traceback (most recent call last):
  File "hive_stats_sql_operation.py", line 325, in <module>
    print job_report(_result_file = result_file, _pre_job_key = pre_job_key)
  File "hive_stats_sql_operation.py", line 286, in job_report
    print dict_format(reduce(lambda x,y : x + y, local_result_list), ensure_ascii=False)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 31-32: ordinal not in range(128)

问题复现与排查

#!/bin/env python
#coding:utf8
import sys
print sys.stdout.encoding
#first
python code.py
#UTF-8
#second 
python code.py > debug ; cat debug
# None

问题的解决

  • 问题的原因也知道了,那么解决方法也就很明了了,就是让字符串正确的decode就ok了,所以有如下几种方法:

    • 在代码的开始调用reload(sys);sys.setdefaultencoding(‘utf8’)通过这种方式,我们制定了默认的encode字符集为utf8因此修正了以上错误
    • 在print u1的地方改成print u1.decode(‘utf8’).encode(‘utf8’)由我们来指定调用的字符集防止其调用默认的ascii

以上是关于python print 中文重定向失败的主要内容,如果未能解决你的问题,请参考以下文章

python重定向原理及实例

Python print输出重定向到文件和屏幕,超简单

数据当用户在验证失败(Python,Django)时被重定向回表单时如何保留表单?

301重定向没有片段[重复]

Python 标准输出 sys.stdout 重定向

jsp初识servlet转发转发与重定向的比较