2013-04-07 27 views
0

我试图解决dictreader中字段未按预期格式化时的导入问题,强制所有字段名为大写(或小写)将解决该问题。DictReader更改上键

下面是我使用的基本代码,虽然我似乎无法更新字典中的行。

f = open(sourceFile,'rb') 
reader = csv.DictReader(f, dialect='excel') 
for r in reader: 
    r.update(dict((k.upper(), v) for k, v in r.iteritems())) 

所需的输出是相同的词典列表,但所有键都将设置为大写。

我错过了'更新',我很好写入一个新的列表。只是有点沮丧。

+0

您的代码将重复键,这些都还没有大写是开始。否则,它工作得很好,但你似乎没有*使用*每一行。你可以在r.iteritems()中使用'r = dict((k.upper(),v)),然后在该循​​环中使用'r' *来做你想做的事情。 – 2013-04-07 18:00:25

回答

1

如果你想有一个新的列表:

new = [{k.upper(): v for k, v in r.iteritems()} for r in reader] 

或者,如果你想使一个字典进行查询:

for r in reader: 
    r = {{k.upper(): v for k, v in r.iteritems()} 
    # use r 
+0

非常感谢! – jpedder 2013-04-07 18:03:23

2

你可以使用一个发电机返回一个大写的按键字典每个行:

def uppercased(reader): 
    for r in reader: 
     yield {k.upper(): v for k, v in r.iteritems()} 

然后以此为:

with open(sourceFile,'rb') as f: 
    reader = csv.DictReader(f, dialect='excel') 
    for r in uppercased(reader): 
     # use `r` like you normally would 
+0

感谢Martijn,yield对我来说是一种新功能,感谢thsi。 – jpedder 2013-04-07 18:35:15

1

为了避免通过你的整个文件迭代,修改对DictReader的fieldnames属性,如:

f = open(sourceFile,'rb') 
reader = csv.DictReader(f, dialect='excel') 
reader.fieldnames = [name.upper() for name in reader.fieldnames]