如何命名从CSV文件导入的dict变量?在Python中

时间:2015-01-04 11:52:23

标签: python csv dictionary

我知道如何从CSV文件导入字典类型变量,如:

code;description;price
c321;white glove;52
d654;orange hat;65
d658;red scarf;85

使用此代码:

import csv

inputfile = open("myfile.csv")
reader_dict = csv.DictReader(inputfile, delimiter=';')

catalog=[]

for line in reader_dict:
    catalog.append(line)

当我需要使用list变量" catalog"中包含的dict变量时我必须使用" for循环"像:

for item in catalog:
    if item["code"]=="code I am looking for":
        print ("now can I use the item am interested in!!")

这是优雅吗?

Othewise有一种方法可以为"目录"中包含的每个dict变量命名。列表?

名称可以是与字典中的键相关联的一个值(例如,与"代码"键相关联的值),我想自动创建变量,如:

c321 = {'code': 'c321', 'descritpion': 'white glove', 'price':'52'}

如果可以的话,我可以轻松地使用带有他名字的变量,而不是使用" for循环"每一次。

2 个答案:

答案 0 :(得分:2)

这是我在其中一条评论中的意思:

import csv
import collections

with open("myfile.csv", 'rb') as inputfile:
    reader = csv.reader(inputfile, delimiter=';')
    Record = collections.namedtuple('Record', next(reader))  # use header row
    catalog = [Record._make(row) for row in reader]

for item in catalog:
    print item.code, item.description, item.price

输出:

c321 white glove 52
d654 orange hat 65
d658 red scarf 85

由于catalog仍然是list,因此仍需要for循环来顺序访问其每个元素,但访问每个元素的字段现在会稍微不那么尴尬

<强>更新

如果你真的想避免for循环并提前知道代码,你可以执行以下操作,创建一个catalog字典,由每个字段的第一个字段中的代码值键入记录每行的其余部分的值映射到嵌套的AttrDict字典中的字段名称:

class AttrDict(dict):  # from http://code.activestate.com/recipes/576972-attrdict
    def __init__(self, *args, **kwargs):
        super(AttrDict, self).__init__(*args, **kwargs)
        self.__dict__ = self

with open("myfile.csv", 'rb') as inputfile:
    reader = csv.reader(inputfile, delimiter=';')
    fields = next(reader)  # header row
    # row[0] is dict key with remaining values mapped to fieldnames
    catalog = {row[0]: AttrDict(zip(fields[1:], row[1:])) for row in reader}

print catalog
c321 = catalog['c321']
print 'c321:', repr(c321.description), int(c321.price)

输出:

{'c321': {'description': 'white glove', 'price': '52'},
 'd654': {'description': 'orange hat', 'price': '65'},
 'd658': {'description': 'red scarf', 'price': '85'}}
c321: 'white glove' 52

答案 1 :(得分:0)

扩展我对OP的评论:

  

当然可以创建这样的变量,问题是,做到了   你真的想要吗?恕我直言,这是相当不融洽的。你也愿意   可能必须跟踪您创建的所有(变量)名称   供以后使用。我的建议是使用(嵌套)字典,例如   使您的目录成为字典并添加csv文件中的记录   以您选择的名称作为关键。

import csv

catalog = {}
with open("myfile.csv") as inputfile:
  rows = csv.DictReader(inputfile, delimiter=';')
  for row in rows:
    key = row['code']
    catalog[key] = row

print( catalog["some_code"]["description"] )

或纳入 martineau 的建议: ( EDIT1:调整以改善优雅) ( EDIT2:已修复错误,因此它实际上按预期工作)

import csv
import collections

catalog = {}
with open("myfile.csv", 'rb') as inputfile:
  row_iterator = csv.reader(inputfile, delimiter=';')
  Record = collections.namedtuple('Record', next(row_iterator))
  # EDIT2: each row is a list here, so we have to use the columnindex to specify the key
  catalog = {row[0]: Record._make(row) for row in row_iterator}    


print( catalog["some_code"].description )