Python在被重定向到文件时无法打印Unicode。

7 浏览
0 Comments

Python在被重定向到文件时无法打印Unicode。

当将Python程序的输出进行管道处理时,Python解释器会对编码产生困惑,并将其设置为None。这意味着像这样的程序:\n

# -*- coding: utf-8 -*-
print u"åäö"

\n在正常运行时会正常工作,但在管道序列中使用时会出错:\n

\nUnicodeEncodeError: \'ascii\' codec can\'t encode character u\'\\xa0\' in position 0: ordinal not in range(128)\n

\n如何在进行管道处理时让它正常工作呢?我能否告诉它使用shell/文件系统/其他的任何编码?\n迄今为止,我看到的建议是直接修改site.py文件,或使用以下hack方式硬编码默认编码:\n

# -*- coding: utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
print u"åäö"

\n是否有更好的方法使管道处理正常工作?

0
0 Comments

Python在被导向文件时无法打印Unicode的原因可能是由于sys.stdout.encoding没有正确设置为utf_8,而是默认为ascii。在这种情况下,可以通过更改sys.stdout来解决该问题。具体解决方法是使用sys.stdout = codecs.getwriter(encoding)(sys.stdout)来更改sys.stdout的编码设置。

另外,也可以尝试将环境变量"PYTHONIOENCODING"设置为"utf_8"。这可以通过在Python程序中设置os.environ["PYTHONIOENCODING"] = "utf_8"来实现。这样做可以确保Python能够正确地将Unicode打印到文件中。

总之,无论是更改sys.stdout.encoding还是设置PYTHONIOENCODING环境变量,都可以解决Python在导向文件时无法打印Unicode的问题。这样可以确保Python能够正确地处理Unicode字符,并将其正确地输出到文件中。

0
0 Comments

Python在将输出重定向到文件时无法打印Unicode的问题是由于sys.stdout默认使用的是ASCII编码导致的。解决方法是将sys.stdout重新定义为使用所选编码进行编码。

以下是一种解决方法:

import sys
import codecs
sys.stdout = codecs.getwriter('utf8')(sys.stdout)

然而,将sys.stdout定义为仅接受unicode会导致许多库出现问题,因为这些库期望接受编码的字节字符串。

另一种解决方法是定义自己的unicode打印函数,并在需要打印unicode时使用它。可以通过检查sys.stdout.encoding来自动检测终端编码,但是需要考虑sys.stdout.encoding为None的情况(即重定向输出到文件时),因此仍然需要一个单独的函数。

需要注意的是,这个解决方法可能在同时支持Python2和Python3的代码中出现问题。

Python在将输出重定向到文件时无法打印Unicode的问题可以通过重新定义sys.stdout来解决。如果遇到同时支持Python2和Python3的情况,需要小心使用这个解决方法。

0
0 Comments

问题出现的原因是当使用管道将Python脚本的输出重定向到文件时,Python无法打印Unicode字符。这是因为Python在脚本内部将输出编码为终端应用程序使用的编码格式,但是当使用管道重定向输出时,需要自行进行编码处理。

解决方法是始终在脚本内部使用Unicode。对于接收到的输入数据进行解码,对于发送的输出数据进行编码。

以下是一个示例,演示了如何在Python脚本中处理编码转换:

# -*- coding: utf-8 -*-
print u"åäö".encode('utf-8')

另一个示例是一个Python程序,用于在ISO-8859-1和UTF-8之间进行转换,并将中间的所有字符转换为大写:

import sys
for line in sys.stdin:
    # 解码接收到的输入数据:
    line = line.decode('iso8859-1')
    # 在内部使用Unicode进行处理:
    line = line.upper()
    # 对发送的输出数据进行编码:
    line = line.encode('utf-8')
    sys.stdout.write(line)

设置系统默认编码是一个坏主意,因为您使用的某些模块和库可能依赖于ASCII编码。不要这样做。

问题在于用户不想显式指定编码。他只想在IO中使用Unicode。而且他使用的编码应该是locale设置中指定的编码,而不是终端应用程序设置的编码。据我所知,Python 3在这种情况下使用locale编码。更改sys.stdout似乎是一种更舒适的方式。

下面的回答是错误的。您不应该在程序的每个输入和输出上手动进行转换;这是脆弱且完全无法维护的。

正确的答案是,如果您在Python 2中重定向了脚本的stdout,不要修改脚本本身,而是设置PYTHONIOENCODING。

实际上,解码和编码是一个良好的实践,正如Python文档中所述:“软件应该仅在内部使用Unicode字符串,在尽早解码输入数据并仅在最后编码输出时。”

参考来源:https://stackoverflow.com/questions/4545661

0