【发布时间】:2014-08-09 01:16:08
【问题描述】:
背景
我对 python 的工作并不多,但我想用它来为我生成一些重复的 XML。现在,我只想解析 CSV,然后将这些值传递到 XML 节中。
有一个问题:我需要在编写 XML 之前重写一些 CSV。我有一些if 语句来为我处理这个问题,我决定通过将其移至单独的函数来减少混乱。
这就是我的问题出现的地方。我的writeTypes 函数似乎按预期工作但是当我返回重新编写的 csvDict 实例时,我无法再打印值。
显然我遗漏了一些东西,可能很简单——但是什么?下面是带有 cmets 的脚本。
脚本
import csv
def parseCSV(vals):
# read the csv
dictReader = csv.DictReader(open(vals, 'rb'), fieldnames=['name', 'type', 'nullable', 'default', 'description', '#'], delimiter=',', quotechar='"')
# some repetitive xml; I will finish this portion later...
stanza = '''
<var name="{0}" precision="1" scale="None" type="{1}">
<label>{2}</label>
<definition><![CDATA[@{3}({4})]]></definition>
</var>'''
# a function that simply writes new values to dictionary entries
writeTypes(dictReader)
# I'm confused here - nothing is printed to the console.
# If i comment my 'writeTypes function, prints as expected
for i in dictReader:
print i
print i['type']
# function to rewrite 'types' key in dictionary set
def writeTypes(d):
for i in d:
if i['type'] == 'text':
i['type'] = 't'
elif i['type'] == 'boolean':
i['type'] = 'l'
elif i['type'] == 'double precision':
i['type'] = 'd'
elif i['type'] == 'integer':
i['type'] = 'i'
else:
i['type'] = i['type']
# unsurprisingly, this function does seem to print the correct values
print i
# it seems as though there's something wrong with this return statement...
return d
CSV 示例
(从 .gov 网站提取的公共数据)
Name,Type,Nullable,Default,Description,#
control,text,true,,,1,false
flagship,boolean,true,,,1,false
groupid,text,true,,,1,false
hbcu,text,true,,,1,false
hsi,text,true,,,1,false
iclevel,text,true,,,1,false
landgrnt,text,true,,,1,false
matched_n_00_10_11,boolean,true,,,1,false
matched_n_05_10_6,boolean,true,,,1,false
matched_n_87_10_24,boolean,true,,,1,false
name,text,true,,,1,false
name_short,text,true,,,1,false
school,text,true,,,1,false
sector,text,true,,,1,false
sector_revised,text,true,,,1,false
top_50,boolean,true,,,1,false
virginia,boolean,true,,,1,false
【问题讨论】:
-
dictReader是一个迭代器,它在您第一次使用for循环对其进行迭代时被消耗。