Como limpar uma matriz e redefinir os valores em um loop enquanto a construção de uma string JSON?

votos
0

Estou looping através de cada linha em uma folha de excel usando a importação openpyxl para finalmente construir uma grande string JSON que eu possa alimentar a uma API.

Estou loop através de cada linha e construir a minha estrutura JSON, eu preciso dividir um valor de célula por || e, em seguida, para cada valor que precisa ser adicionado como uma matriz aninhada dentro de uma seção json. Eu atualmente estou usando o seguinte código e meu problema é que eu construir a minha lista de objetos no meu loop e anexar o pedaço JSON para uma matriz maior e mantém acrescentando minha lista valores durante cada loop. Então eu usei o método .Clear () na lista para limpá-la após cada loop ... mas então quando eu compilar meu resultado final a minha lista está vazia. faz o seu, como não manter seus valores quando ele é adicionado à lista de cada loop. Eu sou novo para Python e deu-lhe uma boa turbilhão. Todas as sugestões na direção certa seria apreciada. É quase como cada loop precisa de sua própria gama única de usar e manter os valores. A seção de etiquetas do JSON é esvaziado no resultado final para cada linha json ... quando deveria ter os valores para cada iteração única nele.

Meu conjunto de dados (i tem 3 linhas em excel). Você pode ver que eu tenho valores que eu quero dividir na 7ª coluna. Essa é a coluna estou loop através de dividir os valores como eles vão ser aninhados em meu JSON.

A linha 1 (células) = ​​ABC, Testing, Testing Novamente, DATA, DATA, vazios, A || || B C.

Linha 2 (células) = ​​ABC 2, Teste 2, Testing Novamente 2, DATA, DATA, Vazio, X Y || || Z.

Linha 3 (células) = ​​ABC 3, Teste 3, Testing Novamente 3, DATA, DATA, vazios, vazios.

My Code.

#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))

E então meu resultado desejado seria algo como isto. Eu só preciso descobrir a sintaxe adequada para o manuseio lista ... e não consigo encontrar um exemplo a base de fora.

[
    {
        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: [           
        ]
    }
]
Publicado 19/03/2020 em 21:54
fonte usuário
Em outras línguas...                            


1 respostas

votos
0

Você não está fazendo uma cópia tagsquando você colocá-lo no dicionário ou chamada tags.clear(), você está apenas colocando uma referência à mesma lista. Você precisa criar uma nova lista no início de cada iteração do loop, não reutilizar a mesma lista.

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) 
Respondeu 19/03/2020 em 21:59
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more