Python:当我使用grep时的UnicodeEncodeError

Dee*_*eyi 10 python grep python-requests

我使用一个简单的python脚本来获取我的CID的预订结果 simple.py:

data = {"minorRev":"current minorRev #","cid":"xxx","apiKey":"xxx","customerIpAddress":"  ","creationDateStart":"03/31/2013","}

url = 'http://someservice/services/rs/'                      
req = requests.get(url,params=data)                        
print req                                                                 
print req.text                                                                
print req.status_code
Run Code Online (Sandbox Code Playgroud)

现在在命令提示符下,如果我这样做python simple.py运行完美并打印req.text变量

但是,当我尝试做的时候
simple.py

我明白了
python simple.py

Álv*_*ten 19

print 需要发送到stdout前的字符串进行编码,但是当该方法是在一个管中,值的sys.stdout.encodingIS None,使print接收unicode对象,然后它会尝试使用以编码该对象ascii的编解码器-如果你有非ASCII字符在此unicode对象,将提出例外.

将所有unicode对象发送到标准输出之前,您可以解决此问题的编码问题(但您需要猜测要使用哪个编解码器).看这些例子:

档案wrong.py:

# coding: utf-8

print u'Álvaro'
Run Code Online (Sandbox Code Playgroud)

结果:

alvaro@ideas:/tmp
$ python wrong.py 
Álvaro
alvaro@ideas:/tmp
$ python wrong.py | grep a
Traceback (most recent call last):
  File "wrong.py", line 3, in <module>
    print u'Álvaro'
UnicodeEncodeError: 'ascii' codec can't encode character u'\xc1' in position 0: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)

档案right.py:

# coding: utf-8

print u'Álvaro'.encode('utf-8')
# unicode object encoded == `str` in Python 2
Run Code Online (Sandbox Code Playgroud)

结果:

alvaro@ideas:/tmp
$ python right.py 
Álvaro
alvaro@ideas:/tmp
$ python right.py | grep a
Álvaro
Run Code Online (Sandbox Code Playgroud)


jfs*_*jfs 5

如果sys.stdout.isatty()为false(输出重定向到文件/管道),则PYTHONIOENCODING在脚本外部配置envvar。始终打印Unicode,不要在脚本中硬编码环境的字符编码:

$ PYTHONIOENCODING=utf-8 python simple.py | grep pattern
Run Code Online (Sandbox Code Playgroud)