我正在尝试在python中使用xyz坐标创建json转储,但是用于遍历不同组的for循环即时消息只会返回最后一个组
self.group_strings = ['CHIN', 'L_EYE_BROW', 'R_EYE_BROW', 'L_EYE', 'R_EYE', 'T_NOSE', 'B_NOSE', 'O_LIPS', 'I_LIPS']
if reply == QMessageBox.Yes:
for grp_str in self.group_strings:
coords_data = self.point_dict[grp_str]['Coords']
data = coords_data
with open("data_file.json", "w") as write_file:
json.dump(data, write_file)
预期结果是一个JSON文件,其放置点的坐标如下:
[[[x,y,z] [x,y,z] [x,y,z] [x,y,z] [x,y,z] [x,y,z]等... ]。
放置点的每个括号中,当前出现的是:
[[x,y,z] [x,y,z] [x,y,z] [x,y,z] [x,y,z] [x,y,z] [x,y ,z] [x,y,z]]。
由于最后一组的大小为8,因此只有8个值
尝试了一些解决方案后,我得出了以下结论:
data = []
if reply == QMessageBox.Yes:
for grp_str in self.group_strings:
data.append(self.point_dict[grp_str]['Coords'])
with open("data_file.json", "w") as write_file:
json.dump(data, write_file)
print(data)的输出是:
[[[17.006101346674598,-24.222496770994944,95.14869919154683],[22.30318006424494,-21.376267007401097,94.70820903177969],[-24.066693590510965,21.205230021220736,96.57992975278633],[-7.9541006992288,308.292.288。 -40.61999270785583、40.90496355476136、90.2356807538543],[-39.293698815625135、52.39636618754361、96.72998820004932],[-28.29463915487483、48.772250886978405、102.25119515066885]]
答案 0 :(得分:3)
在for
循环中,您每次使用data
覆盖data = coords_data
。如果data
是一个列表,请在每次迭代时使用data.append(coords_data)
向其中添加新数据。请注意,您需要在for
的{{1}}循环之前对其进行初始化
本质上:
data = []
答案 1 :(得分:1)
在data
循环中的每次迭代之后,您都将覆盖for
变量,因此,您只会得到最后一次迭代。您需要初始化一些东西,以将数据的每次迭代转储到某种“结果”数据中:
self.group_strings = ['CHIN', 'L_EYE_BROW', 'R_EYE_BROW', 'L_EYE', 'R_EYE', 'T_NOSE', 'B_NOSE', 'O_LIPS', 'I_LIPS']
data = []
if reply == QMessageBox.Yes:
for grp_str in self.group_strings:
data.append(self.point_dict[grp_str]['Coords'])
with open("data_file.json", "w") as write_file:
json.dump(data, write_file)
答案 2 :(得分:1)
您的with
块位于for循环之外,因此它在循环结束后执行,并且只能访问最后一个元素,因为这是循环终止的状态。
但是,如果每次在循环块中打开with,都会再次得到相同的结果,因此必须使用附加模式'a +'来打开它
self.group_strings = ['CHIN', 'L_EYE_BROW', 'R_EYE_BROW', 'L_EYE', 'R_EYE', 'T_NOSE', 'B_NOSE', 'O_LIPS', 'I_LIPS']
if reply == QMessageBox.Yes:
for grp_str in self.group_strings:
coords_data = self.point_dict[grp_str]['Coords']
data = coords_data
# with is now inside the for loop
with open("data_file.json", "a+") as write_file:
json.dump(data, write_file)
更好的方法是在上下文管理器中运行循环。
self.group_strings = ['CHIN', 'L_EYE_BROW', 'R_EYE_BROW', 'L_EYE', 'R_EYE', 'T_NOSE', 'B_NOSE', 'O_LIPS', 'I_LIPS']
if reply == QMessageBox.Yes:
with open("data_file.json", "w") as write_file:
for grp_str in self.group_strings:
coords_data = self.point_dict[grp_str]['Coords']
data = coords_data
json.dump(data, write_file)
答案 3 :(得分:0)
您需要将coords_data
添加到一个列表中,将在其中记住这些列表,然后将该列表写入文件中,现在data = coords_data
仅记住coords_data的最后一个值,并写入该值到文件上。
self.group_strings = ['CHIN', 'L_EYE_BROW', 'R_EYE_BROW', 'L_EYE', 'R_EYE', 'T_NOSE', 'B_NOSE', 'O_LIPS', 'I_LIPS']
if reply == QMessageBox.Yes:
datas = []
for grp_str in self.group_strings:
#Append all values to a list
datas.append(self.point_dict[grp_str]['Coords'])
#Write that list to file
with open("data_file.json", "w") as write_file:
json.dump(datas, write_file)