我有一个有趣的问题。
我收到每封电子邮件的报告,并使用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/