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

原文地址:https://www.cnblogs.com/suanec/p/10732536.html

时间: 2024-10-16 09:59:59

python print 中文重定向失败的相关文章

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

import sys import os class Logger(object): def __init__(self, filename="log.txt"): self.terminal = sys.stdout self.log = open(filename, "a") def write(self, message): self.terminal.write(message) self.log.write(message) def flush(self)

Python:print输出中文

python3 print输出unicode字符时出现以下错误: UnicodeEncodeError: 'gbk' codec can't encode character '\u30fb 解决方法: sys.stdout = io.TextIOWrapper(sys.stdout.buffer, errors = 'replace', line_buffering = True) Python:print输出中文

python print &#183; sys.stdout &#183; sys.stderr

参考文档 Python重定向标准输入.标准输出和标准错误 http://blog.csdn.net/lanbing510/article/details/8487997 python重定向sys.stdin.sys.stdout和sys.stderr http://www.cnblogs.com/guyuyuan/p/6885448.html 1.print print obj 事实上是调用了sys.stdout.write(obj+'\n'),注意多了一个换行符 1a. print在pytho

Python print报ascii编码异常的靠谱解决办法

之前遇到此异常UnicodeEncodeError: 'ascii' codec can't encode characters...,都是用这种方式解决:sys.setdefaultencoding('utf-8') 今天看到如下文章,阐述了此方式的弊端: http://blog.ernest.me/post/python-setdefaultencoding-unicode-bytes 但此文章只考虑了未使用第三方库的情况下的解决办法,而第三方库里如果也有print的话,就束手无策了,总不能

Python读取中文txt文件错误:UnicodeEncodeError: &#39;gbk&#39; codec can&#39;t encode character

1 with open(file,'r') as f: 2 line=f.readline() 3 i=1 4 while line: 5 line=line.decode('utf-8') 6 print str(i)+": "+line7 line=f.readline() 8 i=i+1 用以上代码读取一个包含中文的txt文件时,在正确地读取并打印了六百多行之后,print str(i)+": "+line这一行报错: UnicodeEncodeError:

python 处理中文文件时的编码问题,尤其是utf-8和gbk

python代码文件的编码 py文件默认是ASCII编码,中文在显示时会做一个ASCII到系统默认编码的转换,这时就会出错:SyntaxError: Non-ASCII character.需要在代码文件的第一行或第二行添加编码指示: # coding=utf-8 ##以utf-8编码储存中文字符 print '中文'像上面那样直接输入的字符串是按照代码文件的编码来处理的,如果用unicode编码,有以下2种方式: s1 = u'中文' #u表示用unicode编码方式储存信息 s2 = uni

Python中中文路径处理问题的研究

a = '你' 为 str 对象 a = u'你' 为 unicode 对象 1. >>> print 'u'  + '你' >>> u浣 输出乱码 2. >>> print 'u'  + u'你' >>> u你 正常 3. >>> print 'u你' >>> u浣 输出乱码 4. >>> print 'u你' + 'u' >>> u浣爑 输出乱码 5. >

{转}Python IDLE中文乱码

http://hi.baidu.com/yobin/item/166e3a46537781d3c1a59257 乱码原因:因为你的文件声明为utf-8,并且也应该是用utf-8的编码保存的源文件.但是windows的本地默认编码是cp936,也就是gbk编码,所以在控制台直接打印utf-8的字符串当然是乱码了. 解决方法:在控制台打印的地方用一个转码就ok了,打印的时候这么写:print myname.decode('UTF-8').encode('GBK') 比较通用的方法应该是:import

Python解决中文乱码问题

在Python中内部所有编码都是Unicode,Unicode属于中转码,一般来说,是先把乱码转化为中转码,再转化为我 们需要的编码,转换过程为decode -> unicode -> encode. #coding:utf-8 #-*- coding:utf-8 -*- import sys print sys.getdefaultencoding() print '中国' f = open('Hello.txt') data = f.read() f.close() print data.