如何读取文本文件转为字典列表?Python代码异常排查
问题排查:读取文本文件转换为字典列表时结果重复的问题
我有一个名为users.txt的文本文件,内容如下:
admin|123|admin user|123|user
尝试编写Python代码将其读取并转换为字典列表[{}, {}],但运行结果不符合预期,相关信息如下:
实现代码
def read(file, mode, dictionary_keys, split_char): read_lists = [] read_dict = {} try: f = open(file, mode) except FileNotFoundError as e: print(e) return False else: for i in f.readlines(): for j in range(len(dictionary_keys)): key = dictionary_keys[j] value = i.strip().split(split_char)[j] read_dict[key] = value read_lists.append(read_dict) return read_lists
调用方式
user_dict = ['username', 'password', 'role'] a = read('users.txt', 'r', user_dict, '|') print(a)
当前错误输出
[{'username': 'user', 'password': '123', 'role': 'user'}, {'username': 'user', 'password': '123', 'role': 'user'}]
期望输出
[{'username': 'admin', 'password': '123', 'role': 'admin'}, {'username': 'user', 'password': '123', 'role': 'user'}]
问题原因
问题出在字典对象的引用复用:read_dict是在循环外部定义的,每次循环只是修改这个字典里的键值对,而read_lists.append(read_dict)添加的是这个字典的引用,不是新的字典对象。所以最后列表里的两个元素指向的是同一个字典,最终显示的都是最后一次循环修改后的内容。
修复方案
把read_dict = {}的定义放到for i in f.readlines()循环的内部,每次循环创建一个新的字典对象,避免引用复用。
修改后的完整代码
def read(file, mode, dictionary_keys, split_char): read_lists = [] try: f = open(file, mode) except FileNotFoundError as e: print(e) return False else: for i in f.readlines(): # 每次循环创建新的字典 read_dict = {} for j in range(len(dictionary_keys)): key = dictionary_keys[j] value = i.strip().split(split_char)[j] read_dict[key] = value read_lists.append(read_dict) return read_lists
验证后的输出
运行修改后的代码,调用方式不变,输出将符合期望:
[{'username': 'admin', 'password': '123', 'role': 'admin'}, {'username': 'user', 'password': '123', 'role': 'user'}]
内容的提问来源于stack exchange,提问作者James Wong
相关产品推荐
相关产品推荐

