Python字典赋值异常:CSV数据分配后多字典内容错误求助
问题排查与修复
问题根源
你的代码里这一行是核心错误:
dict_pkey = dict_url = dict_ticket = {}
在Python中,这种链式赋值会让三个变量指向同一个字典对象。也就是说,你后续对dict_url或dict_ticket的赋值操作,其实都是在修改同一个字典,最终三个变量自然会显示完全相同的内容。
修复方案
把三个字典分开初始化,每个都创建独立的空字典:
dict_pkey = {} dict_url = {} dict_ticket = {}
修复后的完整代码
import sys import os import csv def capture_csv_data(): try: input_list=[] with open("C:\\Personal\\Learning\\python\\request-data.csv") as csv_file: reader = csv.reader(csv_file) next(reader) for row_element in reader: input_list.append(row_element) # with语句会自动关闭文件,无需手动调用csv_file.close() process_csv_data(input_list) except (KeyError, ValueError) as e: print("\n Exception at capture_csv_data: ") print(e) def process_csv_data(input_list): try: # 分开初始化三个独立字典 dict_pkey = {} dict_url = {} dict_ticket = {} pkee = repo_url = ticket_number = "" for input_item in input_list: list_elements = list(input_item) pkee = str(list_elements[0]) repo_url = str(list_elements[1]) ticket_number = str(list_elements[2]) print("Key: " + pkee + " - URL: " + repo_url + " - ticket: " + ticket_number) dict_pkey[pkee] = pkee dict_url[pkee] = repo_url dict_ticket[pkee] = ticket_number print(dict_pkey) print(dict_url) print(dict_ticket) except (KeyError, ValueError) as e: print("\n Exception at process_csv_data: ") print(e) def main(): capture_csv_data() if __name__ == "__main__": main()
额外优化建议
可以使用csv.DictReader直接按列名读取数据,代码更简洁易读,避免手动索引出错:
def capture_csv_data(): try: with open("C:\\Personal\\Learning\\python\\request-data.csv") as csv_file: reader = csv.DictReader(csv_file) process_csv_data(reader) except (KeyError, ValueError) as e: print("\n Exception at capture_csv_data: ") print(e) def process_csv_data(reader): try: dict_pkey = {} dict_url = {} dict_ticket = {} for row in reader: pkee = row['Project_Key'] repo_url = row['URL'] ticket_number = row['Ticket_Number'] print(f"Key: {pkee} - URL: {repo_url} - ticket: {ticket_number}") dict_pkey[pkee] = pkee dict_url[pkee] = repo_url dict_ticket[pkee] = ticket_number print(dict_pkey) print(dict_url) print(dict_ticket) except (KeyError, ValueError) as e: print("\n Exception at process_csv_data: ") print(e)
内容的提问来源于stack exchange,提问作者Guna
相关产品推荐
相关产品推荐

