如果密钥在Python 3中有特殊字符,是否可以访问列表值?

时间:2015-11-18 17:23:36

标签: python csv

我有一个有趣的问题。 我会收到每封电子邮件的报告,并使用csv.DictReader解析CSV,如下所示:

with open(extracted_report_uri) as f:
    reader = csv.DictReader(f)
    for row in reader:
        report.append(row)

不幸的是,CSV包含一个名为"eCPM (€)"的列,它为我留下了如下列表: {'eCPM (€)': '1.42'}

Python真的不喜欢print(report[0]['eCPM (€)']),因为它拒绝接受欧元符号作为关键。

我尝试使用€inside创建一个unicode字符串并将其用作键但这也不起作用。 我要么按原样访问该值(显然),要么只是删除€。

建议的重复答案涵盖了删除BOM而不是访问我的密钥的主题。我也按照那里的评论中的建议通过report[0][u'eCPM (€)']尝试了它。不行。 KeyError: 'eCPM (�)'

评论中的建议对我也不起作用。使用report[0][u'eCPM (%s)' % '€'.encode('unicode-escape')]会产生KeyError: "eCPM (b'\\\\u20ac')"

1 个答案:

答案 0 :(得分:1)

经过一些研究后,我发现如何正确地做到这一点。正如我在BOM / UTF-8和DictReader上看到Google / Stackoverflow上的各种问题,这里是完整的代码:

情况: 您有一个CSV文件,其字节顺序标记(BOM)0xEF,0xBB,0xBF在字段名中包含€äöµ@或类似的特殊字符,并且想要正确读取它以访问密钥:值对后面。

在我的示例中,CSV有一个字段名eCPM (€),以及它的工作原理:

import csv
report = []

with open('test.csv', encoding='utf-8-sig') as f:
    reader = csv.DictReader(f)
    for row in reader:
        report.append(row)

print(report[0][u'eCPM (€)'])

在此解决方案之前,我使用函数删除了BOM,但实际上并不需要这样做。如果您将open()encoding='utf-8-sig一起使用,它将自动正确处理BOM并正确编码整个文件。

使用[u'€'],您可以轻松访问生成的列表unicode样式的值。

感谢您的评论让我走上正轨!