[Python] Problema a registar dados no ficheiro .json

Oi galera, tenho um programa que tá colocando dados de uma agenda de pessoas dentro de um arquivo .json, o problema é que só aparece a primeira pessoa no arquivo .json, estou usando um “for” pra conseguir percorrer o array todo e inserir… Não sei qual é o problema e não consigo descobrir, irei deixar aqui o código para quem me puder ajudar. Obrigado a todos

Código do “for”:

def teste(pessoas,outputFileName,nomedoficheiro):
	for pessoa in pessoas:
		print("passou")
		agenda = {
			"pessoa": [
				{"id": "1", "nome": pessoa.getNome(), "numero": pessoa.getNumero(), "idade": pessoa.getIdade(), "altura": pessoa.getAltura(), "peso": pessoa.getPeso()}
			]
		}
	with open(nomedoficheiro+'.json', 'w') as f:
		json.dump(agenda, f, indent=4, ensure_ascii=False)

Como o arquivo se encontra quando abro:

image

(Deveria ter outra pessoa por baixo mas com o id 2 e os dados diferentes, só tá colocando a primeira pessoq que encontra no array)

#Como eu queria que estivesse:
image

Talvez mudando um pouco a ordem resolva:

with open(nomedoficheiro+'.json', 'w') as f:
    for pessoa in pessoas:
        print("passou")
        agenda = {
            "pessoa": [
               {"id": "1", "nome": pessoa.getNome(), "numero": pessoa.getNumero(), "idade": pessoa.getIdade(), "altura": pessoa.getAltura(), "peso": pessoa.getPeso()}
            ]
        }
        json.dump(agenda, f, indent=4, ensure_ascii=False)

Fala ai @Ruben_Ribeiro boa noite, não sou expert em python mas na linha do

agenda = {

não deveria ter algo estilo

agenda = agenda + ‘…’

Abraços
Max

Mas esse “with” não está dentro do “for” como ele vai repetir mais que uma vez se existir mais que uma pessoa no array?

Olá, o que é que voce quer que eu coloque no agenda = agenda + ‘…’ nos “…”

Bom dia @Ruben_Ribeiro, acredito que algo assim:

Só tem que checar qual o operador de concatenação no python, coloquei o + mas nao sei se é ele mesmo.

Abraços
Max

1 curtida

do jeito que vc tinha feito o with não estava dentro do for, mas um nivel abaixo no mesmo alinhamento, lembre-se que python usa identação para saber onde cada bloco se encontra, logo, se vc colocar:

for...
with...

Eles não estão um dentro do outro, mas sim um ao lado do outro, pegou? Vc teria que ter…

for...
    with...

E ainda correra o risco de abrir e fechar o arquivo a cada rodada do for, pense nisso, além disso, a lógica que te mostrei é tão dificil assim de entender? simplesmente indiquei:

abrir o arquivo (with)
percorrer o array (for)
guardar cada item do array no arquivo (json.dump)

E pela lógica do seu código apenas o ultimo registro (sim, apesar de vc declarar agenda dentro do for, ela ainda “sobrevive” fora dele após terminar) que foi percorrido pelo for entrara no arquivo…

Boa sorte!

1 curtida

Não está dando :frowning:
coloquei assim

Mano, valeu ! me ajudou muito! consegui, realmente não fazia sentido abrir no final do for e colocar tudo dentro do arquivo… valeu… vc sempre me ajuda mano…

Valeu pela ajuda irmão, já consegui resolver! obrigado!

ok, agora vou apontar outra coisa que vc pode pensar no json e não no código…

Quando se usa:

pessoa: [...]

Você está dizendo para quem ler esse json que há uma lista de pessoas, já que [] representa array, enquanto {} representa um item/objeto… tendo isso em mente, vale a pena ter?

pessoa: [
    {id...}
]
...
pessoa: [
    {id...}
]
...

Ou seria mais coerente ter:

pessoas: [
    {id...},
    {id...},
    {id...}
]

Perceba que coloquei pessoas no plural ao invés do singular, pode parecer idiota mas nomes bem identificados no futuro pra vc mesmo ou pra outras pessoas que lerem esse json fará todo sentido…

E pensando em js por exemplo (ja que é a linguagem mais comum de se manipular json por ser nativo) e pensando em api, quando alguém precisar acessar cada pessoa da lista basta:

for (var i=0; i<pessoas.length; i++) {
    var pessoa = pessoas[i]; //{id...}
    console.log(pessoa.id);
}

Enquanto que do jeito que está hoje, teria:

for (var i=0; i<json.length; i++) {
    var pessoas = json[i].pessoa; //pessoa: [...]
    for (var j=0; j<pessoas.length; j++) {
        var pessoa = pessoa[j];
        console.log(pessoa.id);
    }
}

Percebeu a diferença na navegação? Fica a dica de melhoria no seu código, vale a pena pensar a respeito…

Sucesso!

Valeu, certamente irei optar por essa forma.