我有一个有趣的问题。
我会收到每封电子邮件的报告,并使用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')"
答案 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样式的值。
感谢您的评论让我走上正轨!