擅长:python、mysql、java
<p>您当前正在导入<code>csv</code>模块,但没有使用它。如果<em>正在使用它,那么可以使用<a href="http://docs.python.org/3.3/library/csv.html#csv.DictReader" rel="nofollow">^{<cd2>}</a>类为文件中的每一行创建一个字典,而不是一个列表。可以使用关键字参数构造<code>namedtuple</code>,但它不会忽略伪参数。因此,您仍然需要手动筛选它们-但现在可以使用dict理解来完成此操作,而不是使用不同的namedtuple:</p>
<pre><code>for line in csvfile:
yield BSYMRecord(**{k:v for k,v in line if k in BSYMRecord._fieldnames})
</code></pre>
<p>诀窍是首先设置听写器。它需要一个生成字符串的类似文件的对象;<code>ZipFile.open</code>提供一个文件类对象,该对象产生<em>字节</em>,并且不能接受编码。<a href="http://docs.python.org/3.3/library/codecs.html" rel="nofollow">codecs</a>模块在这里起到了拯救作用-您可以获得一个StreamReader,它可以透明地将utf8字节解码为字符串,如下所示:</p>
^{pr2}$
<p>然后像这样使用它:</p>
<pre><code>for filename in zipfile.namelist():
with zipfile.open(filename) as f:
csvfile = csv.DictReader(utf8(f))
for line in csvfile:
yield BSYMRecord(**{k:v for k,v in line if k in BSYMRecord._fieldnames})
</code></pre>