2011-10-24 93 views
1

我正在使用for循环来添加字典到字典列表(我打电话data_file),使用data_file.append()如何将词典列表添加到另一个词典列表?

它工作正常:)但后来我尝试添加一些更多的字典data_file在另一个循环,我再次使用data_file.append(),它不起作用。它不会将这些字典添加到data_file

有谁知道我在做什么错?

我没有收到错误。它只产生一个只有来自massage_generators的字典的文件。它不包含travel_generators中的任何内容。

我甚至试过注释掉第一个for循环,第一个用于massage_generators,在那种情况下,它添加在travel_generators字典中。这就像我不能使用.append()两次?

任何帮助将不胜感激请!

对不起,它不是很优雅,我只是在学习这个编码的东西! :)

感谢

import csv 
import copy 
import os 
import sys 


generators = list() 

for filename in os.listdir(os.getcwd()): 
    root, ext = os.path.splitext(filename) 
    if root.startswith('Travel Allowance Auto Look up') and ext == '.csv': 
     travel = filename 

open_file = csv.DictReader(open(travel)) 
generators.append(open_file)  

travel_generators = generators[:] 
massage_generators = generators[:] 

data_file = [] # result will be stored here (List of dicts) 


travel_remap = {'FINAL_TRAVEL_ALL':'AMOUNT'} 
massage_remap = {'MASSAGE_BIK':'AMOUNT'} 


for generator in massage_generators: 
    for dictionary in generator: 
    dictionary['PAYMENT_TYPE_CODE'] = 'MASSAGE_BIK' 
    dictionary['COMMENT'] = 'Massage BIK' 
    dictionary['IS_GROSS'] = 'FALSE' 
    dictionary['PAYMENT_TO_DATE'] = '01/01/2099' 
    dictionary['PAID MANUALLY'] = 'FALSE' 
    for old_key, new_key in massage_remap.iteritems(): 
     if old_key not in dictionary: 
     continue 
     dictionary['AMOUNT'] = dictionary['MASSAGE_BIK'] 
     del dictionary['MASSAGE_BIK'] 
     if (dictionary['AMOUNT'] != '0' and dictionary['AMOUNT'] != ''): 
      data_file.append(dictionary) 

for generator in travel_generators: 
    for dictionary in generator: 
    dictionary['PAYMENT_TYPE_CODE'] = 'TRANSPORTATION_ALLOWANCE' 
    dictionary['COMMENT'] = 'Annual travel allowance paid in monthly installments' 
    dictionary['IS_GROSS'] = 'TRUE' 
    dictionary['PAYMENT_TO_DATE'] = '01/01/2099' 
    dictionary['PAID MANUALLY'] = 'FALSE' 
    for old_key, new_key in travel_remap.iteritems(): 
     if old_key not in dictionary: 
     continue 
     dictionary['AMOUNT'] = dictionary['FINAL_TRAVEL_ALL'] 
     del dictionary['FINAL_TRAVEL_ALL'] 
     if (dictionary['AMOUNT'] != 'Not Applicable' and dictionary['AMOUNT'] != '0' and dictionary['AMOUNT'] != '' and dictionary['AMOUNT'] != '#N/A'): 
      data_file.append(dictionary) 


keys = ['EMPID', 'Common Name', 'PAYMENT_TYPE_CODE', 'CURRENCY', 'AMOUNT', 'EFFECTIVE_DATE', 
     'COMMENT', 'PAYMENT_FROM_DATE', 'PAYMENT_TO_DATE', 'IS_GROSS', 'HIDDEN_UNTIL', 'PAID MANUALLY', 'PAYMENT_DATE'] 

bulk_upload = open('EMEA Bulk Upload.csv', 'wb') 
dict_writer = csv.DictWriter(bulk_upload, keys, restval='', extrasaction='ignore') 
dict_writer.writer.writerow(keys) 
dict_writer.writerows(data_file) 

print "Everything saved! Look up EMEA Bulk Upload.csv" 
+8

您是否收到错误消息?你能发布你的代码吗? – thegrinner

+0

嗨!我没有收到任何错误,只是第二次添加任何内容而没有添加任何内容。我已经添加了我的代码,对不起,这不是很好看! –

+1

在每个'data_file.append(dictionary)'之前用'print len(data_file),dictionary'添加一行并检查它是否正在打印您正在等待的数据。 – eumiro

回答

1

这是你的问题:

open_file = csv.DictReader(open(travel)) 
generators.append(open_file)  

travel_generators = generators[:] 
massage_generators = generators[:] 

travel_generatorsmassage_generators名单都使用相同的打开文件遍历和获取数据;那个问题就是一旦文件被csv.DictReadermassage_generators中被迭代一次,它已经被用尽,并且当你尝试在travel_generators中再次读取它时没有更多的数据。

试试这个:

generators.append(travel)  # just the filename  

travel_generators = generators[:] 
massage_generators = generators[:] 

,然后在你的循环:

for filename in massage_generators: 
    for dictionary in csv.DictReader(open(filename)): 

而且,你在哪里收集文件名的第一个循环:注意循环只保存最后匹配的文件名。如果这是你的意图,你可以通过在travel = filename之后在线上添加break来清除它。

+0

谢谢! :)这解决了我的问题。对不起,什么菜鸟错误! –

0

在您提供的示例中,generatorstravel_generatorsmassage_generators都完全相同,并且每个都包含相同的open_file实例。当您迭代massage_generators时,您会到达文件的末尾。然后当迭代travel_generators时,在open_file中没有什么可以迭代的了。

最起码,你可以更改以下行:

open_file = csv.DictReader(open(travel)) 

要:现在

open_file = map(None, csv.DictReader(open(travel))) 

open_file是一个列表,而不是一台发电机,并可以重复和再重复。

但是,我建议您迭代一次文件,然后构建两个字典,并在每次迭代中写入一个DictWriter实例。

open_file = csv.DictReader(open(travel)) 
... 
dict_writer = csv.DictWriter(bulk_upload, keys, restval='', extrasaction='ignore') 
dict_writer.writer.writerow(keys) 

for line in open_file: 
    massage_dictionary={} 
    massage_dictionary.update(line) 
    ... # manipulate massage_dictionary 
    dict_writer.writerow(massage_dictionary) 

    travel_dictionary={} 
    travel_dictionary.update(line) 
    ... # manipulate travel_dictionary 
    dict_writer.writerow(travel_dictionary) 
+0

非常感谢您的帮助:)关于解决方案的一个问题。我看到你在做'映射'到csv.DictReader(打开(旅行))。我们不需要定义什么地图呢?第一个理由是什么?它在None中。也许这是开放了一大堆我不熟悉的东西。再次感谢! –

+0

map()的第一个参数是一个函数,它被应用于第二个参数中的每个项目,它必须是一个可迭代的。如果“无”,则假定身份函数 - 也就是说,它不做任何操纵。它与'open_file = [line for csv.DictReader(open(travel))]''一致 –