我有一个包含特殊字符的列表(例如é
或空格),当我打印列表时,这些字符用Unicode代码打印,如果我单独打印列表元素则打印正确:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
my_list = ['éléphant', 'Hello World']
print(my_list)
print(my_list[0])
print(my_list[1])
此代码的输出是
['\xc3\xa9l\xc3\xa9phant', 'Hello World']
éléphant
Hello World
我希望第一次输出['éléphant', 'Hello World']
。我应该改变什么?
答案 0 :(得分:3)
如果可能,请切换到Python 3,您将获得预期的结果。
如果你必须在Python 2中使用它,那么使用unicode
字符串:
my_list = [u'éléphant', u'Hello World']
现在的方式,Python将第一个字符串解释为一系列值为'\xc3\xa9l\xc3\xa9phant'
的字节,只有在正确UTF-8解码后才会转换为Unicode代码点:'\xc3\xa9l\xc3\xa9phant'.decode('utf8') == u'\xe9l\xe9phant'
如果您希望打印列表repr
并获取" unicode" out,你必须手动将其编码为UTF-8(如果你的终端了解的话)。
>>> print repr(my_list).decode('unicode-escape').encode('utf8')
[u'éléphant', u'Hello World']
但手动格式化更容易:
>>> print ", ".join(my_list)
éléphant, Hello World
答案 1 :(得分:3)
简短的回答,如果你想以这种格式保存输出,你必须自己实现它:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
my_list = ['éléphant', 'Hello World']
def print_list (l):
print ("[" + ", ".join(["'%s'" % str(x) for x in l]) + "]")
print_list (my_list)
生成预期的
['éléphant', 'Hello World']
但请注意,它会将所有元素放在引号内(例如偶数),因此如果您希望列表中的字符串以外的其他内容,则可能需要更复杂的实现。
问题在于Python在打印之前运行str(my_list)
。反过来,它会在每个列表元素上运行repr()
。
现在,字符串上的repr()
返回字符串的仅ASCII表示形式。那就是那些' \ xc3'你看到的是一个真正的反斜杠,一个真实的反弹' c'和一个实际的' 3'字符。
你可以解决这个问题,因为问题在于list.__str__ ()
的实施。
下面是一个演示该程序的示例程序。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# vi: ai sts=4 sw=4 et
import pprint
my_list = ['éléphant', 'Hello World']
# under the hood, python first runs str(my_list), before printing it
my_list_as_string = str(my_list)
# str() on a list runs repr() on each of the elements.
# However, it seems that __repr__ on a string transforms it to an
# ASCII-only representation
print ('str(my_list) = %s' % str(my_list))
for c in my_list_as_string:
print c
print ('len(str(my_list)) = %s' % len(str(my_list)))
print ("\n")
# Which we can confirm here, where we can see that it it also adds the quotes:
print ('repr("é") == %s' % repr("é"))
for c in repr("é"):
print c
print ('len(repr("é")) == %s' % len(repr("é")))
print ("\n")
# Even pprint fails
print ("pprint gives the same results")
pprint.pprint(my_list)
# It's useless to try to encode it, since all data is ASCII
print "Trying to encode"
print (my_list_as_string.encode ("utf8"))
产生这个:
str(my_list) = ['\xc3\xa9l\xc3\xa9phant', 'Hello World']
[
'
\
x
c
3
\
x
a
9
l
\
x
c
3
\
x
a
9
p
h
a
n
t
'
,
'
H
e
l
l
o
W
o
r
l
d
'
]
len(str(my_list)) = 41
repr("é") == '\xc3\xa9'
'
\
x
c
3
\
x
a
9
'
len(repr("é")) == 10
pprint gives the same results
['\xc3\xa9l\xc3\xa9phant', 'Hello World']
Trying to encode
['\xc3\xa9l\xc3\xa9phant', 'Hello World']