在Python字典中使用Unicode键

16

我正在使用Python 2.7.x学习有关Twitter API的知识。我已经保存了许多随机推文,并正在尝试处理它们。每个推文都会使用json.loads将其转换为一个字典,所有字典都是列表的一部分。

对于单个推文,我希望能够从字典中提取特定字段。键都是unicode字符串。如果我通过循环遍历键,我没有问题地打印出值:

for i in tweet.keys():
    print i, tweet[i]
所以上述循环工作正常,但我一直没有成功地找出如何手动指定关键字。 "u'text'"是实际推文内容的关键字(用户的实际帖子)。如果我尝试打印tweet['text'],我会得到一个KeyError。我天真地尝试了tweet[u'text'],但这也会导致KeyError。
我想知道循环遍历tweet.keys()时正在执行的操作与我手动指定关键字时所做的操作之间的区别。请注意,如果在上面的循环中打印i的值,则会打印出关键字名称,但没有unicode包装。当键是“u'text'”时,i的值只是“text”,或者至少是打印到终端上的值。

那么不同之处必须在于您正在查看不同的字典。一个没有'text'键的字典。 - Martijn Pieters
注意:对于其他读者,这在Python3中是不同的,其中比较b'text' != 'text'甚至不被允许。 - wim
@wim:但是没有Unicode字符串会显示带有u前缀。 - Martijn Pieters
哦,如果推文在一个列表中,那么在你的循环中怎么样使用 tweet[i]['text'] - Joachim Isaksson
@MartijnPieters:完成了,谢谢。我通过检查是否存在“text”元素,“lang”元素以及tweet ['lang'] == 'en'(仅需要英语语言的推文)来过滤掉所有我不感兴趣的内容,因为这是我正在处理的内容。 - drumboots
显示剩余5条评论
2个回答

23

如果文本可以被编码为ASCII,Python 2会自动透明地处理strunicode键之间的转换:

>>> d = {u'text': u'Foo'}
>>> d.keys()
[u'text']
>>> 'text' in d
True
>>> u'text' in d
True
>>> d['text']
u'Foo'
>>> d[u'text']
u'Foo'
这意味着,如果您在tweet['text']中遇到KeyError,那么该字典中没有这样的键

1
在我的案例中,我正在迭代从推特流中提取的一系列随机推文。我只对实际发布和原始消息感兴趣,而不是转发、其他非推文帖子等,但我没有对这些进行过滤。向@MartijnPieters表示感谢,让我清醒了头脑。 - drumboots
最后一句话有些令人困惑,或者说它仍然受到“只要文本可以编码为ASCII”的限制。如果给定 d = {u"ä": 1},使用 d["ä"] 会导致键错误,反之亦然。我的结论是:如果您不知道查询值是否可ASCII编码,则必须将键和查询值都转换为 strunicode(如果您希望它们匹配)。 - bluenote10
@bluenote10:'text' ASCII。然而,并非所有的数据都包含该键。 - Martijn Pieters
@bluenote10:请注意,我的答案条件“文本可以编码为ASCII”开头: - Martijn Pieters
@bluenote10:最后但并非不重要的是,问题在于OP假设他们保存的所有字典都有一个“text”键,然后错误地解释了异常而没有重新审视他们的假设。 - Martijn Pieters
我想说的是,第一句和最后一句让我感到困惑。对我来说,它听起来像是:如果你得到了一个关于“ä”的KeyError,那么你可以确定既没有键“ä”,也没有键u"ä",但事实并非如此。 - bluenote10

-1
Python 2.7.8 (default, Jun 30 2014, 16:03:49) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> d = {u'text': u'Foo'}
>>> print "d:{text}".format(**d)
d:Foo

4
虽然这可能回答了作者的问题,但缺少一些解释性语言和链接文档。裸露的代码片段没有周围的一些短语是不太有帮助的。 您还可以在如何写出好的答案中找到很多有用的信息。请修改您的答案。 - hellow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接