Я пытаюсь создать дамп json с координатами xyz в python, однако цикл 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 с координатами расположенных точек следующим образом:

[ [ Х, у, г ] [ х, у, г ] [ х, у, г ] [ х, у, г ] [ х, у, г ] [ х, у, г ] и т.д. ... ] .

Каждая скобка для размещенной точки, текущий результат:

[ [ Х, у, г ] [ х, у, г ] [ х, у, г ] [ х, у, г ] [ х, у, г ] [ х, у, г ] [ х, у, г ] [ х, у, г ] ] .

Всего 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)

Выходные данные печати (данные):

[ [ +17,006101346674598 , -24,222496770994944 , 95,14869919154683 ] , [ +22,30318006424494 , -21,376267007401097 , +94,70820903177969 ] , [ -24,066693590510965 , +21,205230021220736 , +96,57992975278633 ] , [ -7,9541006992288885 , +20,3986457061961 , +103,06739548846576 ] , [ -28,291138300128495 , 33,5422782651503 , 99,22546203301508 ] , [ -40,61999270785583 , 40.90496355476136, 90.2356807538543], [-39.293698815625135, 52.39636618754361, 96.72998820004932], [-28.29463915487483, 48.772250886978405, 102.25119515066885]]

0
Mart Krol 2 Май 2019 в 13:36

4 ответа

Лучший ответ

В цикле for вы перезаписываете data на каждой итерации с помощью data = coords_data. Если data является списком, используйте вместо него data.append(coords_data) для добавления новых данных к нему на каждой итерации. Обратите внимание, что вам нужно инициализировать его перед циклом for с data = []

По существу :

data = []
for grp_str in group_strings:
   data.append(self.point_dict[grp_str]['Coords'])
3
glhr 2 Май 2019 в 10:45

Вы перезаписываете свою переменную 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)
1
chitown88 2 Май 2019 в 10:47

Ваш with блок находится вне цикла for, поэтому он выполняется после завершения цикла и имеет доступ только к последнему элементу, потому что это состояние, с которым завершается цикл.

Но если вы каждый раз открываете внутри внутри блока цикла, вы снова получаете тот же результат, поэтому вы должны открыть его с помощью режима добавления '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)
1
Shuvojit 2 Май 2019 в 10:43

Вам нужно добавить coords_data в список, где они будут запомнены, а затем записать этот список в файл, прямо сейчас data = coords_data запоминает только последнее значениеordins_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)
0
Devesh Kumar Singh 2 Май 2019 в 10:46