Python CSV文件处理问题:字典修改后无法重新打印求排查
问题分析与解决方案
我帮你找到了代码里的关键问题,咱们一步步来搞定:
1. 核心问题:csv.DictReader返回的是一次性迭代器
csv.DictReader生成的不是可重复遍历的列表,而是一个一次性迭代器。当你在modify_dict里第一次调用print_csv_file(file_dict)时,已经把迭代器里的所有元素遍历完了,后续再尝试遍历file_dict(修改操作和第二次打印)时,迭代器已经没有剩余元素,这两步自然不会执行。
解决办法很简单:把迭代器转换成列表,这样就能反复遍历了。修改parse_ral_file里的这一行:
file_dict = list(csv.DictReader(dict_file, delimiter=','))
2. 语法兼容性问题(针对Python3)
如果你用的是Python3,代码里有两处语法会报错:
print dict_item是Python2的写法,Python3必须加括号:print(dict_item)dict_item.iteritems()在Python3中已被移除,换成dict_item.items()
修改后的对应函数:
def print_csv_file(file_dict): for dict_item in file_dict: print(dict_item) def modify_dict(file_dict): print_csv_file(file_dict) for dict_item in file_dict: for k, v in dict_item.items(): # 替换iteritems() if k == "ral_file": dict_item[k] = v.strip("_regs") print_csv_file(file_dict)
额外小修正:函数调用匹配问题
我还注意到parse_ral_file里,你用csv.reader生成的file_read调用了print_csv_file,但这个函数是为遍历字典设计的,这里应该调用print_csv_list才对,我也帮你修正了这个小失误。
完整修改后的代码
import sys import csv def print_csv_list(list_in): """ function takes a list of lists and prints # of lines instructed by counter parameter :param list_in: list of lists :return: no return """ counter = 0 for line in list_in: if counter < 2: for item in line: sys.stdout.write(item.strip(",") + "\t") sys.stdout.flush() print("\n") counter +=1 def print_csv_file(file_dict): for dict_item in file_dict: print(dict_item) def modify_dict(file_dict): print_csv_file(file_dict) for dict_item in file_dict: for k, v in dict_item.items(): if k == "ral_file": dict_item[k] = v.strip("_regs") print_csv_file(file_dict) def parse_ral_file(csvfile): with open(csvfile, 'r')as print_file: file_read = csv.reader(print_file, delimiter=',') print_csv_list(file_read) with open(csvfile, 'r')as dict_file: file_dict = list(csv.DictReader(dict_file, delimiter=',')) modify_dict(file_dict) if __name__ == "__main__": x = sys.argv[1] parse_ral_file(x)
现在运行代码,就能看到修改前的字典、修改后的字典正常打印出来了。
内容的提问来源于stack exchange,提问作者Dibyendu Dey
相关产品推荐
相关产品推荐

