我有一个有趣的问题。
我收到每封电子邮件的报告,并使用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 (€)']),因为它拒绝接受欧元符号作为密钥。

我尝试创建一个带有€的unicode字符串,并将其用作键,但这也行不通。
我想按原样访问值(显然),或者干脆放弃€。

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

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

最佳答案

经过更多研究后,我发现了如何正确执行此操作。正如我所见,使用BOM / UTF-8和DictReader在Google / Stackoverflow上遇到了各种各样的问题,下面是完整的代码:

情况:
您得到了一个CSV文件,该文件的字节序名称(BOM)0xEF,0xBB,0xBF在字段名称中带有特殊字符(例如€äöµ@或类似字符),并且想要正确地读取它以便以后访问key:value对。

在我的示例中,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样式的值。

感谢您的评论使我步入正轨!

关于python - 如果键在Python 3中具有特殊字符,是否可以访问列表值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33786425/

10-10 18:55