重定向python';文件的标准输出失败,出现UnicodeEncodeError

重定向python';文件的标准输出失败,出现UnicodeEncodeError,python,linux,file,io-redirection,output-redirect,Python,Linux,File,Io Redirection,Output Redirect,我有一个python脚本,它连接到Twitter Firehose并向下游发送数据进行处理。以前它工作得很好,但现在我只想得到文本主体。(这不是我应该如何从Twitter中提取数据或如何编码/解码ascii字符的问题)。因此,当我像这样直接启动脚本时: python -u fetch_script.py 它工作得很好,我可以看到屏幕上出现了消息。例如: root@domU-xx-xx-xx-xx:/usr/local/streaming# python -u fetch_script.py

我有一个python脚本,它连接到Twitter Firehose并向下游发送数据进行处理。以前它工作得很好,但现在我只想得到文本主体。(这不是我应该如何从Twitter中提取数据或如何编码/解码ascii字符的问题)。因此,当我像这样直接启动脚本时:

python -u fetch_script.py
它工作得很好,我可以看到屏幕上出现了消息。例如:

root@domU-xx-xx-xx-xx:/usr/local/streaming# python -u fetch_script.py 
Cuz I'm checking you out >on Facebook<
RT @SearchlightNV: #BarryLiesSince nobody's jumped in yet, here's my shot. Python sets stdout's encoding when writing to a console but not when writing to a file. This script reproduces the problem:

import sys

msg = {'text':u'\2026'}
sys.stderr.write('default encoding: %s\n' % sys.stdout.encoding)
print msg['text']
root@domU-xx xx xx:/usr/local/streaming#python-u fetch_script.py
因为我正在Facebook上查看你

RT@SearchlightNV:#Barryles既然还没有人跳进去,这是我的照片。Python在写入控制台时设置标准输出的编码,但在写入文件时不设置标准输出的编码。此脚本再现了问题:

$ python bad.py>/tmp/xxx
default encoding: None
Traceback (most recent call last):
  File "fix.py", line 5, in <module>
    print msg['text']
UnicodeEncodeError: 'ascii' codec can't encode character u'\x82' in position 0: ordinal not in range(128)
运行上述命令时,会显示错误:

import sys

msg = {'text':u'\2026'}
sys.stderr.write('default encoding: %s\n' % sys.stdout.encoding)
encoding = sys.stdout.encoding or 'utf-8'
print msg['text'].encode(encoding)
问题解决了:


一个简单的脚本也会遇到同样的问题:
print u'\u2026'
,所以不要担心添加上下文!问题是python在写入终端时设置了输出编码,但在写入文件时却没有设置。我不确定当前修复它的最佳实践是什么,我对答案很感兴趣。这是一个很好的观点,我必须用谷歌搜索它,但为什么我在将整个负载插入文件时没有问题???就像我在P.S部分中解释的那样。这是因为您打印了dict的字符串表示形式。
打印{'text':u'\2026'}
输出
{'text':u'\x826'}
,也就是说,它打印转义unicode字符的ascii视图。可能是您摇滚的人的复制品!非常感谢!)我真想不到该怎么做。这不是小事:)谢谢。你的回答为我节省了很多时间。这真的很有用。谢谢,这在另一种情况下有效,我使用ASCII颜色代码。
$ python good.py >/tmp/xxx
default encoding: None
$ cat /tmp/xxx
6