首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将python脚本输出输出到文件时出现Unicode错误

将python脚本输出输出到文件时出现Unicode错误
EN

Stack Overflow用户
提问于 2012-04-05 03:51:49
回答 4查看 11K关注 0票数 17

代码如下:

代码语言:javascript
复制
print '"' + title.decode('utf-8', errors='ignore') + '",' \
      ' "' + title.decode('utf-8', errors='ignore') + '", ' \
      '"' + desc.decode('utf-8', errors='ignore') + '")'

title和desc是由Beautiful Soup3 (p.text和p.prettify)返回的,据我从BeautifulSoup3文档中了解,它们都是UTF8编码的。

如果我运行

代码语言:javascript
复制
python.exe script.py > out.txt

我得到以下错误:

代码语言:javascript
复制
Traceback (most recent call last):
  File "script.py", line 70, in <module>
    '"' + desc.decode('utf-8', errors='ignore') + '")'
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf8' in position 264
: ordinal not in range(128)

但是,如果我运行

代码语言:javascript
复制
python.exe script.py

我没有得到任何错误。只有在指定了输出文件时才会发生这种情况。

如何在输出文件中获得良好的UTF-8数据?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-04-05 04:44:09

您可以使用编解码器模块将unicode数据写入文件

代码语言:javascript
复制
import codecs
file = codecs.open("out.txt", "w", "utf-8")
file.write(something)

‘'print’输出到standart输出,如果您的控制台不支持utf-8,那么即使您通过管道将stdout输出到一个文件,它也会导致这样的错误。

票数 12
EN

Stack Overflow用户

发布于 2012-04-05 06:08:20

这种情况下的Windows行为有点复杂。您应该听取其他建议,并在内部使用unicode作为字符串,并在输入过程中进行解码。

对于您的问题,您需要打印编码的字符串(只有您知道哪种编码!)在标准输出重定向的情况下,但在简单屏幕输出的情况下,您必须打印unicode字符串( python或windows控制台处理到正确编码的转换)。

我建议你这样组织你的脚本:

代码语言:javascript
复制
# -*- coding: utf-8 -*- 
import sys, codecs
# set up output encoding
if not sys.stdout.isatty():
    # here you can set encoding for your 'out.txt' file
    sys.stdout = codecs.getwriter('utf8')(sys.stdout)

# next, you will print all strings in unicode
print u"Unicode string ěščřžý"

更新:另请参阅其他类似问题:Setting the correct encoding when piping stdout in Python

票数 7
EN

Stack Overflow用户

发布于 2012-04-05 05:30:45

为了打印文本而将文本转换为unicode是没有意义的。在unicode中处理您的数据,将其转换为某种编码以进行输出。

您的代码执行的是什么:您使用的是Python2,所以默认的字符串类型(str)是字节字符串。在您的语句中,您从一些utf编码的字节字符串开始,将它们转换为unicode,然后用引号将它们括起来(为了组合成一个字符串,将常规str强制转换为unicode )。然后将此unicode字符串传递给print,后者将其推送到sys.stdout。为此,它需要将其转换为字节。如果你正在写Windows控制台,它会以某种方式协商,但如果你重定向到一个常规的哑文件,它会回到ascii并抱怨,因为没有不损失的方法可以做到这一点。

解决方案:不要给print提供unicode字符串。自己将其“编码”为您选择的表示形式:

代码语言:javascript
复制
print "Latin-1:", "unicode über alles!".decode('utf-8').encode('latin-1')
print "Utf-8:", "unicode über alles!".decode('utf-8').encode('utf-8')
print "Windows:", "unicode über alles!".decode('utf-8').encode('cp1252')

当您重定向时,所有这些都应该可以正常工作。它可能在你的屏幕上看起来不对劲,但是用记事本或其他东西打开输出文件,看看你的编辑器是否设置了查看格式。(Utf-8是唯一有希望被检测到的。cp1252可能是Windows默认值)。

一旦你了解了这一点,清理你的代码,并避免使用打印文件输出。使用codecs模块,并使用codecs.open打开文件,而不是普通的打开。

PS。如果你正在解码一个utf-8字符串,转换成unicode应该是无损的:你不需要errors=ignore标志。当您转换为ascii或拉丁文-2或其他任何格式,并且您只想删除目标代码页中不存在的字符时,这是合适的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10018271

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档