以下代码在Python 3.x中使用TypeError: must be str, not bytes
失败,因为现在encode()
返回bytes
而print()
只需要str
。
#!/usr/bin/python
from __future__ import print_function
str2 = "some unicode text"
print(str2.encode('raw_unicode_escape'))
如何使用print()
打印Unicode字符串转义表示?我正在寻找一种适用于Python 2.6或更高版本的解决方案,包括3.x
下面的行适用于3.x但它不适用于2.6,生成AttributeError: 'file' object has no attribute 'buffer'
sys.stdout.buffer.write(str2.encode('raw_unicode_escape'))
答案 0 :(得分:5)
我只是使用:
print(str2.encode('raw_unicode_escape').decode('ascii'))
如果你想在Python 3和Python 2.6中使用相同的代码(否则你可以在2.6中使用repr
,在Python 3中使用ascii
,但这并不是真的“相同”; - )。
答案 1 :(得分:1)
我无法重现您的问题,请参阅previous revisions of this answer了解我的尝试记录(解释了我在评论中的链接)。
然而:
看起来你正试图通过自己完成所有的工作来强制编写文件。但是在Python 3中,open()
接受encoding
参数,为您完成所有魔法。
badp@delta:~$ python3
Python 3.1.2 (r312:79147, Apr 15 2010, 12:35:07)
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> foo = open("look mah, utf-32", "w", encoding="utf-32")
>>> foo.write("bar")
3
>>> foo.close()
>>> foo = open("look mah, utf-32", "rb")
>>> foo.read()
b'\xff\xfe\x00\x00b\x00\x00\x00a\x00\x00\x00r\x00\x00\x00'
如果您正在寻找等效的Python 2,您似乎真的想要使用io.open()
。
答案 2 :(得分:0)
http://docs.python.org/py3k/library/functions.html#ascii
作为repr(),返回一个包含对象的可打印表示的字符串,但使用\ x,\ u或\ U转义转义repr()返回的字符串中的非ASCII字符。这会生成一个类似于Python 2中repr()返回的字符串。
结果字符串确实是str
类型,而不是bytes
。
示例:
>>> a = '''Ⴊ ⇠ ਐ ῼ இ ╁ ଠ ୭ ⅙ ㈣'''
>>> ascii(a)
"'\\u10aa \\u21e0 \\u0a10 \\u1ffc \\u0b87 \\u2541 \\u0b20 \\u0b6d \\u2159 \\u3223'"
>>> print(ascii(a))
'\u10aa \u21e0 \u0a10 \u1ffc \u0b87 \u2541 \u0b20 \u0b6d \u2159 \u3223'
如果你想删除多余的引号,你可以print(ascii(a)[1:-1])
。
repr
而不是ascii
。他的解决方案确实适用于Python 2和3,但是如果你计划进行很多转换(因此更喜欢更容易输入多次),一种可能性是在程序开头添加一个条件如下:
import sys
if sys.version_info[0] == 3:
unic = ascii
else:
unic = repr
然后,只要在Python 2中使用unic
,在Python 3中使用repr
,就可以使用ascii
(或任何你想要的名称)。
...虽然我想如果你想要更加小心,可以使用elif sys.version_info[0] == 2:
代替else:
。