Python 要加载到字典中的逗号分隔文件
我有一个逗号分隔的文件,一行看起来像: “ABC234234”,23 我想将其加载到字典中,键是第一部分,即“ABC234234” 我还得遥控双引号 python的方法是什么?我建议(像往常一样)用Python 要加载到字典中的逗号分隔文件,python,dictionary,Python,Dictionary,我有一个逗号分隔的文件,一行看起来像: “ABC234234”,23 我想将其加载到字典中,键是第一部分,即“ABC234234” 我还得遥控双引号 python的方法是什么?我建议(像往常一样)用with语句打开CSV文件(这确保完成后它将被关闭!)——除此之外,@carl的答案通常是好的: import csv d = dict(csv.reader(open("foo.txt", "rb"))) import csv with open('yourfile.csv', 'rb') as
with
语句打开CSV文件(这确保完成后它将被关闭!)——除此之外,@carl的答案通常是好的:
import csv
d = dict(csv.reader(open("foo.txt", "rb")))
import csv
with open('yourfile.csv', 'rb') as f:
thedict = dict(csv.reader(f))
然后根据需要自由使用ICT
请注意,值(当然也包括键)将是字符串。如果您知道第二列始终有一个整数,并且希望将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)
当然,如果你愿意,也可以进一步细分
这在Python2.6或更高版本中有效。如果你坚持使用2.5,为了让它工作,添加
from __future__ import with_statement
在模块的顶部--我的其余建议仍然适用;-) 您要求的是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
我不知道,但这可能是一个很好的开始:这是一个CSV文件,还是一个看起来像你描述的手工制作的文件格式?对于外观稍有不同的线条,这必须有多坚固?键可以包含逗号吗?每行只有1个逗号。始终打开文件以与
csv.reader
一起使用mode='rb'
(Python 2.x)或newline='
(Python 3.x),我以前使用for
循环来执行此操作。从不知道迪克特能做到这一点。(但我在2个月前才开始学习Python:P)如果显式关闭文件,这个答案会更好。要将的功能与
匹配,您应该使用try/finally
来确保文件关闭,即使csv.reader出现异常。例如,我还必须去掉双引号。哦,我得到的文件实际上是用urllib2从网上下载的,所以它不在磁盘上。@Blankman,(1):cvs的一部分工作是从引号中的字段周围删除引号——你在抱怨之前试过吗?-)(2):urllib2.urlopen
的结果是一个类似文件的对象,它非常适合作为参数传递给csv.reader
,就像open
(实际的文件对象)的结果一样,更直接,可以在插入dic时进行修改(更可读)。