我想要加载到字典中的逗号分隔文件

时间:2010-08-19 04:28:16

标签: python dictionary

我有一个逗号分隔的文件,一行看起来像:

“ABC234234”,23

我想把它加载到字典中,键是第一部分,即“ABC234234”

我也必须远程双引号。

这样做的pythonic方式是什么?

3 个答案:

答案 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