Python循环中向列表追加字典的问题及修正需求
解决JSON读取后生成连续ID字典列表的问题
看起来你现在遇到的问题是:读取students.txt后得到的字典列表里全是重复的{'id': 1, 'first_name': 'name1'},但你想要的是id从1到10的连续字典列表对吧?我来帮你分析下原因和解决办法:
问题根源
你的代码逻辑本身没问题,但当前students.txt文件里的每一行都是完全相同的JSON对象(都是id=1的那条),所以循环读取10次后,自然会得到10个重复的字典。另外你的打印代码还有个小笔误:print(studentList)应该写成print(student),不然每次会打印整个列表而不是单个元素。
解决方案分两种情况:
情况1:你想基于文件里的基础模板生成10条连续ID的数据
如果students.txt里只有一条基础JSON(比如就是那行id=1的数据),想扩展成id从1到10的列表,可以这么改代码:
import json studentsList = [] # 先读取文件里的基础模板数据 with open('students.txt') as f: # 假设文件里只有一行基础JSON base_student = json.loads(f.readline()) # 生成id从1到10的字典列表 for i in range(1, 11): # 复制基础字典,避免所有元素指向同一个对象 student = base_student.copy() student['id'] = i # 如果名字也需要对应id,可以改成下面这样,不需要的话可以删掉 student['first_name'] = f'name{i}' studentsList.append(student) # 打印结果 print("生成的ID连续的字典列表:") for student in studentsList: print(student)
情况2:你希望读取文件里本来就有的10条不同ID的数据
这种情况下需要先修正students.txt的内容,确保每一行是不同id的JSON,比如:
{"id":1,"first_name":"name1"} {"id":2,"first_name":"name2"} {"id":3,"first_name":"name3"} {"id":4,"first_name":"name4"} {"id":5,"first_name":"name5"} {"id":6,"first_name":"name6"} {"id":7,"first_name":"name7"} {"id":8,"first_name":"name8"} {"id":9,"first_name":"name9"} {"id":10,"first_name":"name10"}
然后修正你原来代码里的打印笔误即可:
import json studentsList = [] print("Started Reading JSON file which contains multiple JSON document") with open('students.txt') as f: for jsonObj in f: studentDict = json.loads(jsonObj) studentsList.append(studentDict) print("Printing each JSON Decoded Object") for student in studentsList: print(student) # 这里把studentList改成student
关键提醒
- 用
copy()复制字典很重要,如果直接修改原字典再append,所有列表元素都会指向同一个对象,最后所有id都会变成10。 - 打印时要注意变量名拼写,别把单个元素的变量写成列表名了。
内容的提问来源于stack exchange,提问作者Nazia
相关产品推荐
相关产品推荐

