【问题标题】:Python : UnicodeEncodeError when I use grepPython:当我使用 grep 时出现 UnicodeEncodeError
【发布时间】:2013-03-22 06:24:16
【问题描述】:

我正在使用一个简单的 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

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

但是当我尝试这样做时

python simple.py | grep pattern

我明白了

UnicodeEncodeError: 'ascii' codec can't encode character u'\xe4' in position 1314: ordinal not in range(128)

【问题讨论】:

标签: python grep python-requests


【解决方案1】:

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

$ PYTHONIOENCODING=utf-8 python simple.py | grep pattern

【讨论】:

    【解决方案2】:

    print 需要在发送到标准输出之前对字符串进行编码,但是当进程在管道中时,sys.stdout.encoding 的值是None,所以print 接收到@987654325 @ 对象,然后它尝试使用 ascii 编解码器对该对象进行编码——如果您在此 unicode 对象中有非 ASCII 字符,则会引发异常。

    您可以在将所有unicode 对象编码 到标准输出之前解决这个问题(但您需要猜测要使用哪个编解码器)。请参阅以下示例:

    文件wrong.py

    # coding: utf-8
    
    print u'Álvaro'
    

    结果:

    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)
    

    文件right.py

    # coding: utf-8
    
    print u'Álvaro'.encode('utf-8')
    # unicode object encoded == `str` in Python 2
    

    结果:

    alvaro@ideas:/tmp
    $ python right.py 
    Álvaro
    alvaro@ideas:/tmp
    $ python right.py | grep a
    Álvaro
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-26
      • 2018-10-23
      • 1970-01-01
      • 2017-02-02
      • 1970-01-01
      相关资源
      最近更新 更多