我有一个逗号分隔的文件,一行看起来像:
“ABC234234”,23
我想把它加载到字典中,键是第一部分,即“ABC234234”
我也必须远程双引号。
这样做的pythonic方式是什么?
答案 0 :(得分:6)
我建议(像往常一样)使用with
语句打开CSV文件(确保 将在您完成后关闭!) - 除此之外,@ carl的答案一般都很好:
import csv
with open('yourfile.csv', 'rb') as f:
thedict = dict(csv.reader(f))
然后根据需要自由使用thedict
。
请注意,值(当然,作为键)将是 strings 。如果您知道第二列始终具有整数,并且希望将int
s作为值,则可以使用
thedict = dict((k, int(v)) for k, v in csv.reader(f))
或者,如果您希望避免代码中的过度紧凑/密度,请将此最新语句分解为,例如:
ks_vs = ((k, int(v)) for k, v in csv.reader(f))
thedict = dict(ks_vs)
或者,如果你愿意,可以进一步细分。
这适用于Python 2.6或更高版本。如果您坚持使用2.5,要使其正常工作,请添加
from __future__ import with_statement
在模块的顶部 - 我的其他建议仍然适用; - )。
答案 1 :(得分:4)
import csv
d = dict(csv.reader(open("foo.txt", "rb")))
答案 2 :(得分:3)
您要求 Pythonic 。如果您希望遵循Python的Zen中的一条规则(“错误永远不会无声地传递”),并且您想要检查数据中是否没有重复的密钥,或者进行其他错误检查或清理(示例:密钥可以不是一个空字符串,想要去掉前导/尾随空格,你需要编写更详细的代码。
#untested example
import csv
with open('the_file.csv', 'rb') as f:
reader = csv.reader(f)
the_dict = {}
for rownum, row in enumerate(reader, start=1):
if len(row) != 2:
error('row length is not 2', rownum, row)
continue
k, v = [item.strip() for item in row]
if not k:
error('key is empty string', ...); continue
if k in the_dict:
error(...); continue
the_dict[k] = v