<p>我的一句话是这样说的:</p>
<pre><code>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
</code></pre>
<p>输出:</p>
^{pr2}$
<p>由于<code>catalog</code>仍然是一个<code>list</code>,因此仍然需要一个<code>for</code>循环来顺序访问它的每个元素,但是访问每个元素的字段现在就不那么麻烦了。在</p>
<p><strong>更新</strong></p>
<p>如果您真的想避免<code>for</code>循环并提前知道代码,可以执行以下操作,创建一个<code>catalog</code>字典,该字典由每个记录的第一个字段中的代码值键入,而每行的其余值映射到嵌套的<code>AttrDict</code>字典中的字段名:</p>
<pre><code>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)
</code></pre>
<p>输出:</p>
<pre class="lang-none prettyprint-override"><code>{'c321': {'description': 'white glove', 'price': '52'},
'd654': {'description': 'orange hat', 'price': '65'},
'd658': {'description': 'red scarf', 'price': '85'}}
c321: 'white glove' 52
</code></pre>