2013-04-07 8 views
0

Я пытаюсь разрешить проблемы с импортом в dictreader, когда поля не отформатированы так, как ожидалось, заставляя все имена полей в верхнем регистре (или в нижнем регистре) разрешать это.DictReader сменяет ключи на верхние

Вот базовый код, который я использую, хотя я не могу обновить строки в dict.

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 = dict ((k.upper(), v) для k, v в r.iteritems()), а затем использовать' r' * в этом цикле *, чтобы делать то, что вы хотели сделать. –

ответ

1

Если вы хотите новый список:

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

Или, если вы хотите, чтобы сделать один Dict в то время:

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

Спасибо большое! – jpedder

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, урожай - новая функция для меня, спасибо за thsi. – jpedder

1

Чтобы избежать перебора всего файла, изменить атрибут fieldnames на DictReader, как:

f = open(sourceFile,'rb') 
reader = csv.DictReader(f, dialect='excel') 
reader.fieldnames = [name.upper() for name in reader.fieldnames] 
Смежные вопросы