打印字符串在Python中的字符串之前打印'u'?

时间:2013-10-03 23:30:40

标签: python unicode printing python-2.x

'u'在打印列表中的元素之前?我没有在我的代码中输入你。

hobbies = []

#prompt user three times for hobbies
for i in range(3):
    hobby = raw_input('Enter a hobby:')
    hobbies.append(hobby)

#print list stored in hobbies
print hobbies

当我运行它时,它会打印列表,但格式如下:

Enter a hobby: Painting
Enter a hobby: Stargazing
Enter a hobby: Reading
[u'Painting', u'Stargazing', u'Reading']
None

那些'你'来自列表中每个元素之前的位置?

4 个答案:

答案 0 :(得分:12)

我认为你在这里真正感到惊讶的是,打印单个字符串并不像打印字符串列表那样做 - 无论他们是否是Unicode都是如此:

>>> hobby1 = u'Dizziness'
>>> hobby2 = u'Vértigo'
>>> hobbies = [hobby1, hobby2]
>>> print hobby1
Dizziness
>>> print hobbies
[u'Dizziness', u'V\xe9rtigo']

即使没有u,你也可以得到那些额外的引号,更不用说反斜杠了。如果你使用str字节字符串而不是unicode字符串尝试相同的事情,你仍然会有引号和转义(如果你的源文件和你的终端有你的话,你可能会有mojibake字符)不同的编码...但忘记那部分。


在Python中,每个对象都可以有两种不同的表示形式:最终用户友好的表示形式str和程序员友好的表示形式repr。对于字节字符串,这些表示分别为Painting'Painting'。对于Unicode字符串,他们需要Paintingu'Painting'

print语句使用str,因此print hobby1打印出Painting,没有引号(或u,如果它是Unicode )。

但是,列表的str使用其每个元素的repr,而不是str。因此,当您打印hobbies时,每个元素都有引号(如果它是Unicode,则为u。)

这一开始可能看起来很奇怪,但这是一个有意的设计决定,一旦你习惯它就有意义了。打印出[foo, bar, baz]是不明确的 - 是三个字符串的列表,还是两个字符串的列表,其中一个字符串中间有一个逗号?但是,更重要的是,无论你如何打印它,列表已经不是用户友好的东西。 My hobbies are [Painting, Stargazing]看起来和My hobbies are ['Painting', 'Stargazing']一样丑陋。当您想要向最终用户显示列表时,您总是希望以某种有意义的方式显式地对其进行格式化。

通常,你想要的就是这么简单:

>>> print 'Hobbies:', ', '.join(hobbies)
Hobbies: Painting, Stargazing

或者,对于Unicode字符串:

>>> print u'Hobbies:', u', '.join(hobbies)
Hobbies: Painting, Stargazing

答案 1 :(得分:6)

'u'不是字符串的一部分,但表示字符串是unicode字符串。

答案 2 :(得分:6)

您没有打印字符串,而是打印包含字符串的列表的表示。

for hobby in hobbies:
  print hobby

答案 3 :(得分:0)

如果要将unicode转换为字符串。你可以简单地使用 str(unicodedString)或unicode(normalString)用于其他方式转换

<强>代码

hobbies = []

#prompt user three times for hobbies
for i in range(3):
    hobby = raw_input('Enter a hobby:')
    # converting the normal string to unicode
    hobbies.append(unicode(hobby))

# Printing the unicoded string
print("Unicoded string")
print(hobbies)
hobbies = [str(items) for items in hobbies]

# Printing the converted string
print("Normal string from unicoded string")
print(hobbies)

<强>输出

Enter a hobby:test1
Enter a hobby:Test2
Enter a hobby:Test3

Unicoded string
[u'test1', u'Test2', u'Test3']

Normal string from unicoded string
['test1', 'Test2', 'Test3']