Как очистить массив и сбросить значения в для l oop при построении строки Json? - PullRequest
0 голосов
/ 19 марта 2020

Я перебираю каждую строку в листе Excel, используя импорт openpyxl, чтобы в конечном итоге создать большую строку Json, которую я могу передать в API.

Я перебираю каждую строку и выстраиваю свои json структура, мне нужно разделить значение ячейки на «||», а затем для каждого значения его необходимо добавить в качестве вложенного массива в секции json. В настоящее время я использую следующий код, и моя проблема в том, что я строю свой объект списка в моем для l oop и добавляю блок json к большему массиву, и он продолжает добавлять значения моего списка в течение каждого l oop. Поэтому я использовал метод .Clear () в списке, чтобы очистить его после каждого l oop ... но потом, когда я скомпилировал свой окончательный результат, мой список пуст. Это похоже на то, что он не сохраняет свои значения при добавлении в список каждый l oop. Я новичок в Python и дал ему хороший круговорот. Любые предложения в правильном направлении будут оценены. Почти как каждый l oop нуждается в своем собственном уникальном массиве для использования и хранения значений. Раздел тегов Json очищается в конечном выводе для каждой строки json ... когда в нем должны быть значения для каждой уникальной итерации.

Мой набор данных (у меня есть 3 строки в Excel). Вы можете видеть, что у меня есть значения, которые я хочу разделить в 7-м столбце. Это столбец, который я перебираю, чтобы разделить значения, поскольку они будут вложены в мою json.

Строка 1 (ячейки) = "AB C", "Тестирование", "Повторное тестирование" , "ДАТА", "ДАТА", Пусто, "A || B || C".

Строка 2 (ячейки) = "AB C 2", "Тестирование 2", "Тестирование Снова 2 "," ДАТА "," ДАТА ", Пусто," X || Y || Z ".

Строка 3 (ячейки) =" AB C 3 "," Проверка 3 "," Тестирование снова 3 "," ДАТА "," ДАТА ", Пусто, Пусто.

Мой код.

#from openpyxl import Workbook
import json
from openpyxl import load_workbook

output_table = input_table.copy()

var_path_excel_file = flow_variables['Location']

workbook = load_workbook(filename=var_path_excel_file)
sheet = workbook.active

#create a null value to be used
emptyString = "Null"

#list out all of the sections of the json that we want to print out - these are based on the inputs
jsonFull = []
jsondata = {}
tags = []

for value in sheet.iter_rows(min_row=2,min_col=0,max_col=40,values_only=True):  

    #I add my split values to an array so that way when i add the array to the json it will have the proper brackets i need for the API to run correctly
    if value[6] is not None:
        data = value[6].split(" || ")
        for temp in data:           
            tags.append(temp)           

    #I build out the json structure here that will be added for each excel row basically
    jsondata = {
        "name": value[0],
        "short_description": value[1],
        "long_description": value[2],
        "effective_start_date": value[3],
        "effective_end_date": value[4],
        "workflow_state": emptyString,              
        "tags": tags
        }

    #Add the jsondata row to the larger collection
    jsonFull.append(jsondata)   
    tags.clear()

print(json.dumps(jsonFull))

И тогда желаемый результат будет примерно таким это. Мне просто нужно выяснить правильный синтаксис для обработки списка ... и я не могу найти пример, основанный на.

[
    {
        "name": "ABC", 
        "short_description": "Testing", 
        "long_description": "Testing Again", 
        "effective_start_date": "2020-03-04T14:45:22Z", 
        "effective_end_date": "2020-03-04T14:45:22Z", 
        "workflow_state": "Null", 
        "tags": [
            "A",
            "B",
            "C"
        ]
    }, 
    {
        "name": "ABC 2", 
        "short_description": "Testing 2", 
        "long_description": "Testing Again 2", 
        "effective_start_date": "2020-03-04T14:45:22Z", 
        "effective_end_date": "2020-03-04T14:45:22Z", 
        "workflow_state": "Null", 
        "tags": [
            "X",
            "Y",
            "Z"
        ]
    }, 
    {
        "name": "ABC 3", 
        "short_description": "Testing 3", 
        "long_description": "Testing Again 3", 
        "effective_start_date": "2020-03-04T14:45:22Z", 
        "effective_end_date": "2020-03-04T14:45:22Z", 
        "workflow_state": "Null", 
        "tags": [           
        ]
    }
]

1 Ответ

1 голос
/ 19 марта 2020

Вы не делаете копию tags, когда помещаете ее в словарь или вызываете tags.clear(), вы просто помещаете ссылку в тот же список. Вам нужно создавать новый список в начале каждой итерации l oop, а не использовать один и тот же список.

for value in sheet.iter_rows(min_row=2,min_col=0,max_col=40,values_only=True):  

    #I add my split values to an array so that way when i add the array to the json it will have the proper brackets i need for the API to run correctly
    if value[6] is not None:
        tags = value[6].split(" || ")
    else:
        tags = []         

    #I build out the json structure here that will be added for each excel row basically
    jsondata = {
        "name": value[0],
        "short_description": value[1],
        "long_description": value[2],
        "effective_start_date": value[3],
        "effective_end_date": value[4],
        "workflow_state": emptyString,              
        "tags": tags
        }

    #Add the jsondata row to the larger collection
    jsonFull.append(jsondata) 
...