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)
如果sys.stdout.isatty()为false(输出重定向到文件/管道),则PYTHONIOENCODING在脚本外部配置envvar。始终打印Unicode,不要在脚本中硬编码环境的字符编码:
$ PYTHONIOENCODING=utf-8 python simple.py | grep pattern
Run Code Online (Sandbox Code Playgroud)