Eu tenho um arquivo JSON que desejo converter para um arquivo CSV. Como posso fazer isso com o Python?
Eu tentei:
import json
import csv
f = open('data.json')
data = json.load(f)
f.close()
f = open('data.csv')
csv_file = csv.writer(f)
for item in data:
csv_file.writerow(item)
f.close()
No entanto, não funcionou. Estou usando o Django e o erro que recebi é:
file' object has no attribute 'writerow'
Eu tentei o seguinte:
import json
import csv
f = open('data.json')
data = json.load(f)
f.close()
f = open('data.csv')
csv_file = csv.writer(f)
for item in data:
f.writerow(item) # ← changed
f.close()
Eu recebo o erro:
sequence expected
Arquivo json de amostra:
[{
"pk": 22,
"model": "auth.permission",
"fields": {
"codename": "add_logentry",
"name": "Can add log entry",
"content_type": 8
}
}, {
"pk": 23,
"model": "auth.permission",
"fields": {
"codename": "change_logentry",
"name": "Can change log entry",
"content_type": 8
}
}, {
"pk": 24,
"model": "auth.permission",
"fields": {
"codename": "delete_logentry",
"name": "Can delete log entry",
"content_type": 8
}
}, {
"pk": 4,
"model": "auth.permission",
"fields": {
"codename": "add_group",
"name": "Can add group",
"content_type": 2
}
}, {
"pk": 10,
"model": "auth.permission",
"fields": {
"codename": "add_message",
"name": "Can add message",
"content_type": 4
}
}
]
jq
, conforme descrito aqui: stackoverflow.com/questions/32960857/…Respostas:
Primeiro, seu JSON possui objetos aninhados, portanto, normalmente não pode ser convertido diretamente em CSV. Você precisa mudar isso para algo assim:
Aqui está o meu código para gerar CSV a partir disso:
Você obterá a saída como:
fonte
[u'
e']
. Qual é a solução alternativa (sem pós-processamento)? se houver um ... :)TypeError: a bytes-like object is required, not 'str'
nof.writerow(['pk', 'model', 'codename', 'name', 'content_type'])
f = csv.writer(open("test.csv", "w", newline=''))
Com a
pandas
biblioteca , isso é tão fácil quanto usar dois comandos!Para converter uma sequência JSON em um objeto pandas (uma série ou um quadro de dados). Então, assumindo que os resultados foram armazenados como
df
:O que pode retornar uma string ou gravar diretamente em um arquivo csv.
Com base na verbosidade das respostas anteriores, todos devemos agradecer aos pandas pelo atalho.
fonte
.to_csv()
realmente poderosa (filtragem de colunas gratuitamente, por exemplo). Eu preciso aprender pandas.orient='records'
deve ser definido, mas cada linha defields
ainda será umdict
, que não é o que o OP solicitou.Estou assumindo que seu arquivo JSON será decodificado em uma lista de dicionários. Primeiro, precisamos de uma função que achatará os objetos JSON:
O resultado da execução desse trecho no seu objeto JSON:
é
Depois de aplicar esta função a cada ditado na matriz de entrada dos objetos JSON:
e localizando os nomes das colunas relevantes:
não é difícil executar isso através do módulo csv:
Eu espero que isso ajude!
fonte
O JSON pode representar uma ampla variedade de estruturas de dados - um "objeto" JS é mais ou menos como um ditado Python (com chaves de seqüência de caracteres), um "array" JS mais ou menos como uma lista Python, e você pode aninha-los enquanto for final " elementos "leaf" são números ou strings.
O CSV pode essencialmente representar apenas uma tabela 2D - opcionalmente com uma primeira linha de "cabeçalhos", ou seja, "nomes de colunas", que podem tornar a tabela interpretável como uma lista de dictos, em vez da interpretação normal, uma lista de listas (novamente, os elementos "folha" podem ser números ou cadeias).
Portanto, no caso geral, você não pode converter uma estrutura JSON arbitrária em um CSV. Em alguns casos especiais, é possível (matriz de matrizes sem aninhamento adicional; matrizes de objetos com todas exatamente as mesmas chaves). Qual caso especial, se houver, se aplica ao seu problema? Os detalhes da solução dependem de qual caso especial você possui. Dado o fato surpreendente de você nem mencionar qual deles se aplica, suspeito que você não tenha considerado a restrição, nenhum caso utilizável de fato se aplica e seu problema é impossível de resolver. Mas, por favor, esclareça!
fonte
Uma solução genérica que converte qualquer lista json de objetos simples em csv.
Passe o arquivo input.json como primeiro argumento na linha de comandos.
fonte
Este código deve funcionar para você, assumindo que os seus dados JSON é em um arquivo chamado
data.json
.fonte
csv_file.writerow
(f.writerow
claro que não, suponho que você cometeu um erro de digitação lá!) Quer uma sequência, não um ditado - e no seu exemplo, cada item é um ditado. Isso funcionaria para o caso especial OTHER, como identifiquei na minha resposta - onde o arquivo JSON tem uma matriz de matrizes; ele não funciona para uma variedade de objetos, que é o caso especial que você parece estar tentando resolver (esse requer umcsv.DictWriter
- e, é claro, você precisa extrair os nomes dos campos e decidir sobre um pedido para instancia-lo ! -).Será fácil de usar
csv.DictWriter()
, a implementação detalhada pode ser assim:Observe que isso pressupõe que todos os seus objetos JSON tenham os mesmos campos.
Aqui está a referência que pode ajudá-lo.
fonte
Eu estava tendo problemas com a solução proposta por Dan , mas isso funcionou para mim:
Onde "test.json" continha o seguinte:
fonte
Use
json_normalize
depandas
:test.json
encoding='utf-8'
pode não ser necessário.pathlib
biblioteca.open
é um método depathlib
Saída CSV:
Outros recursos para objetos JSON mais aninhados:
fonte
Como mencionado nas respostas anteriores, a dificuldade em converter json para csv é porque um arquivo json pode conter dicionários aninhados e, portanto, é uma estrutura de dados multidimensional versus um csv que é uma estrutura de dados 2D. No entanto, uma boa maneira de transformar uma estrutura multidimensional em um CSV é ter vários CSVs vinculados às chaves primárias.
No seu exemplo, a primeira saída csv possui as colunas "pk", "model", "fields" como suas colunas. Os valores para "pk" e "model" são fáceis de obter, mas como a coluna "fields" contém um dicionário, ele deve ser seu próprio csv e como "codename" parece ser a chave principal, você pode usar como entrada para "campos" para concluir o primeiro csv. O segundo csv contém o dicionário da coluna "fields" com o codinome como a chave primária que pode ser usada para vincular os 2 csvs.
Aqui está uma solução para o seu arquivo json que converte dicionários aninhados em 2 csvs.
fonte
Sei que já faz muito tempo desde que essa pergunta foi feita, mas achei que poderia acrescentar à resposta de todos os outros e compartilhar um post do blog que, em minha opinião, explica a solução de uma maneira muito concisa.
Aqui está o link
Abra um arquivo para gravação
Crie o objeto gravador csv
Certifique-se de fechar o arquivo para salvar o conteúdo
fonte
Não é uma maneira muito inteligente de fazer isso, mas tive o mesmo problema e isso funcionou para mim:
fonte
A resposta de Alec é ótima, mas não funciona no caso em que há vários níveis de aninhamento. Aqui está uma versão modificada que suporta vários níveis de aninhamento. Também torna os nomes dos cabeçalhos um pouco mais agradáveis se o objeto aninhado já especificar sua própria chave (por exemplo, dados do Firebase Analytics / BigTable / BigQuery):
fonte
Isso funciona relativamente bem. Nivela o json para gravá-lo em um arquivo csv. Elementos aninhados são gerenciados :)
Isso é para python 3
desfrutar.
fonte
json.loads
não estava funcionando, eu fiz funcionarjson.load
, o que produz um objeto de lista. Terceiro, elementos aninhados foram perdidos.Minha maneira simples de resolver isso:
Crie um novo arquivo Python como: json_to_csv.py
Adicione este código:
Depois de adicionar este código, salve o arquivo e execute no terminal:
Espero que isso lhe ajude.
ATÉ MAIS!
fonte
Surpreendentemente, descobri que nenhuma das respostas postadas aqui até agora lida corretamente com todos os cenários possíveis (por exemplo, dict aninhados, listas aninhadas, nenhum valor etc.).
Esta solução deve funcionar em todos os cenários:
fonte
Tente isto
fonte
Esse código funciona para qualquer arquivo json
fonte
A resposta de Alec McGail modificada para dar suporte ao JSON com listas dentro
Obrigado!
fonte
fonte
Se considerarmos o exemplo abaixo para converter o arquivo no formato json em arquivo no formato csv.
O código abaixo converterá o arquivo json (data3.json) em arquivo csv (data3.csv).
O código acima mencionado foi executado no pycharm instalado localmente e converteu com êxito o arquivo json no arquivo csv. Espero que esta ajuda para converter os arquivos.
fonte
Como os dados parecem estar em um formato de dicionário, parece que você realmente deve usar csv.DictWriter () para realmente exibir as linhas com as informações de cabeçalho apropriadas. Isso deve permitir que a conversão seja tratada de alguma maneira mais fácil. O parâmetro fieldnames configuraria a ordem corretamente, enquanto a saída da primeira linha, como os cabeçalhos, permitiria que ela fosse lida e processada posteriormente por csv.DictReader ().
Por exemplo, Mike Repass usou
No entanto, basta alterar a configuração inicial para output = csv.DictWriter (conjunto de arquivos, nomes de campo = dados [0] .keys ())
Observe que, como a ordem dos elementos em um dicionário não está definida, pode ser necessário criar entradas de nomes de campo explicitamente. Depois de fazer isso, o escritor irá funcionar. As gravações funcionam como mostrado originalmente.
fonte
Infelizmente, não tenho reputação de dar uma pequena contribuição à incrível resposta de @Alec McGail. Eu estava usando Python3 e precisei converter o mapa em uma lista após o comentário do @Alexis R.
Além disso, eu descobri que o gravador csv estava adicionando um CR extra ao arquivo (tenho uma linha vazia para cada linha com dados dentro do arquivo csv). A solução foi muito fácil, seguindo a resposta de @Jason R. Coombs para este segmento: CSV em Python adicionando um retorno de carro extra
Você precisa simplesmente adicionar o parâmetro lineterminator = '\ n' ao csv.writer. Será:
csv_w = csv.writer( out_file, lineterminator='\n' )
fonte
Você pode usar esse código para converter um arquivo json em arquivo csv. Depois de ler o arquivo, estou convertendo o objeto em pandas dataframe e salvando-o em um arquivo CSV
fonte
Talvez eu esteja atrasado para a festa, mas acho que lidei com o mesmo problema. Eu tinha um arquivo json que era assim
Eu só queria extrair algumas chaves / valores desse arquivo json. Então, eu escrevi o código a seguir para extrair o mesmo.
Espero que isso ajude. Para detalhes sobre como esse código funciona, você pode conferir aqui
fonte
Esta é uma modificação da resposta de @ MikeRepass. Esta versão grava o CSV em um arquivo e funciona para o Python 2 e o Python 3.
fonte