Saya memiliki file JSON yang ingin saya konversi menjadi file CSV. Bagaimana saya bisa melakukan ini dengan Python?
Saya mencoba:
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()
Namun, itu tidak berhasil. Saya menggunakan Django dan kesalahan yang saya terima adalah:
file' object has no attribute 'writerow'
Saya kemudian mencoba yang berikut:
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()
Saya kemudian mendapatkan kesalahan:
sequence expected
Contoh file json:
[{
"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
, seperti dijelaskan di sini: stackoverflow.com/questions/32960857/…Jawaban:
Pertama, JSON Anda memiliki objek bersarang, jadi biasanya tidak dapat langsung dikonversi ke CSV. Anda perlu mengubahnya menjadi sesuatu seperti ini:
Ini kode saya untuk menghasilkan CSV dari itu:
Anda akan mendapatkan output sebagai:
sumber
[u'
dan']
. Apa solusinya (non-pasca-pemrosesan)? jika ada satu ... :)TypeError: a bytes-like object is required, not 'str'
dif.writerow(['pk', 'model', 'codename', 'name', 'content_type'])
f = csv.writer(open("test.csv", "w", newline=''))
Dengan
pandas
perpustakaan , ini semudah menggunakan dua perintah!Untuk mengonversi string JSON ke objek panda (baik seri atau bingkai data). Kemudian, dengan asumsi hasil disimpan sebagai
df
:Yang dapat mengembalikan string atau menulis langsung ke file csv.
Berdasarkan verbositas dari jawaban sebelumnya, kita semua harus berterima kasih pada panda untuk pintasan.
sumber
.to_csv()
sangat kuat (misalnya, pemfilteran kolom gratis). Saya perlu belajar panda.orient='records'
harus ditetapkan, tetapi setiap barisfields
masih akan menjadidict
, yang bukan apa yang diminta OP.Saya mengasumsikan bahwa file JSON Anda akan diterjemahkan ke dalam daftar kamus. Pertama kita membutuhkan fungsi yang akan meratakan objek JSON:
Hasil menjalankan cuplikan ini pada objek JSON Anda:
adalah
Setelah menerapkan fungsi ini untuk setiap dikt dalam input array objek JSON:
dan menemukan nama kolom yang relevan:
tidak sulit menjalankan ini melalui modul csv:
Saya harap ini membantu!
sumber
JSON dapat mewakili berbagai macam struktur data - "objek" JS kira-kira seperti dict Python (dengan kunci string), JS "array" kira-kira seperti daftar Python, dan Anda dapat membuat sarangnya selama final " elemen daun adalah angka atau string.
CSV pada dasarnya hanya dapat mewakili tabel 2-D - opsional dengan baris pertama "header", yaitu, "nama kolom", yang dapat membuat tabel ditafsirkan sebagai daftar dicts, alih-alih interpretasi normal, daftar daftar (sekali lagi, elemen "daun" bisa berupa angka atau string).
Jadi, dalam kasus umum, Anda tidak dapat menerjemahkan struktur JSON sewenang-wenang ke CSV. Dalam beberapa kasus khusus Anda dapat (array array tanpa bersarang lebih lanjut; array objek yang semuanya memiliki kunci yang persis sama). Kasus khusus mana, jika ada, yang berlaku untuk masalah Anda? Rincian solusi tergantung pada kasus khusus yang Anda miliki. Mengingat fakta yang mencengangkan bahwa Anda bahkan tidak menyebutkan yang mana yang berlaku, saya curiga Anda mungkin tidak mempertimbangkan kendala, tidak ada kasus yang dapat digunakan sebenarnya berlaku, dan masalah Anda tidak mungkin diselesaikan. Tapi tolong lakukan klarifikasi!
sumber
Solusi umum yang menerjemahkan daftar flat json apa saja objek ke csv.
Lewati file input.json sebagai argumen pertama pada baris perintah.
sumber
Kode ini harus bekerja untuk Anda, dengan asumsi bahwa data JSON Anda ada dalam file bernama
data.json
.sumber
csv_file.writerow
(tidak adaf.writerow
tentu saja, saya menganggap Anda membuat kesalahan ketik di sana!) Ingin urutan, bukan dict - dan dalam contoh Anda, setiap item adalah dict. Ini akan bekerja untuk kasus khusus LAIN, seperti yang saya identifikasi dalam jawaban saya - di mana file JSON memiliki array array; itu tidak berfungsi untuk array objek, yang merupakan kasus khusus yang tampaknya Anda coba selesaikan (yang membutuhkancsv.DictWriter
- dan tentu saja Anda perlu mengekstrak nama bidang dan memutuskan pesanan untuk membuat instantiate itu ! -).Ini akan mudah digunakan
csv.DictWriter()
, implementasi terperinci bisa seperti ini:Perhatikan bahwa ini mengasumsikan bahwa semua objek JSON Anda memiliki bidang yang sama.
Berikut ini referensi yang dapat membantu Anda.
sumber
Saya mengalami masalah dengan solusi yang diusulkan Dan , tetapi ini berhasil bagi saya:
Di mana "test.json" berisi yang berikut:
sumber
Gunakan
json_normalize
daripandas
:test.json
encoding='utf-8'
mungkin tidak perlu.pathlib
perpustakaan.open
adalah metodepathlib
Output CSV:
Sumberdaya lain untuk objek JSON yang lebih berat:
sumber
Seperti disebutkan dalam jawaban sebelumnya, kesulitan dalam mengubah json ke csv adalah karena file json dapat berisi kamus bersarang dan karenanya menjadi struktur data multidimensi ayat csv yang merupakan struktur data 2D. Namun, cara yang baik untuk mengubah struktur multidimensi menjadi csv adalah memiliki beberapa csv yang diikat bersama dengan kunci primer.
Dalam contoh Anda, keluaran csv pertama memiliki kolom "pk", "model", "bidang" sebagai kolom Anda. Nilai untuk "pk", dan "model" mudah didapat tetapi karena kolom "bidang" berisi kamus, itu haruslah csv sendiri dan karena "codename" tampaknya menjadi kunci utama, Anda dapat menggunakan input untuk "bidang" untuk menyelesaikan csv pertama. Csv kedua berisi kamus dari kolom "bidang" dengan nama kode sebagai kunci utama yang dapat digunakan untuk mengikat 2 csv bersama-sama.
Ini adalah solusi untuk file json Anda yang mengubah kamus bersarang menjadi 2 csvs.
sumber
Saya tahu sudah lama sejak pertanyaan ini ditanyakan tetapi saya pikir saya dapat menambahkan jawaban orang lain dan membagikan posting blog yang menurut saya menjelaskan solusinya dengan cara yang sangat ringkas.
Inilah tautannya
Buka file untuk ditulis
Buat objek csv writer
Pastikan untuk menutup file untuk menyimpan konten
sumber
Ini bukan cara yang sangat cerdas untuk melakukannya, tetapi saya memiliki masalah yang sama dan ini berhasil bagi saya:
sumber
Jawaban Alec luar biasa, tetapi tidak berfungsi jika ada beberapa tingkat bersarang. Berikut ini adalah versi yang dimodifikasi yang mendukung banyak level penyarangan. Itu juga membuat nama header sedikit lebih bagus jika objek bersarang sudah menentukan kunci sendiri (misalnya Firebase Analytics / BigTable / BigQuery data):
sumber
Ini bekerja relatif baik. Ini meratakan json untuk menulisnya ke file csv. Elemen bersarang dikelola :)
Itu untuk python 3
Nikmati.
sumber
json.loads
tidak berfungsi, saya membuatnya bekerja denganjson.load
, yang dengan baik menghasilkan objek daftar. Ketiga, elemen bersarang hilang.Cara sederhana saya untuk menyelesaikan ini:
Buat file Python baru seperti: json_to_csv.py
Tambahkan kode ini:
Setelah menambahkan kode ini, simpan file dan jalankan di terminal:
Saya harap ini membantu Anda.
SAMPAI JUMPA!
sumber
Anehnya, saya menemukan bahwa tidak ada jawaban yang diposting di sini sejauh ini dengan benar menangani semua skenario yang mungkin (misalnya, dicts bersarang, daftar bersarang, Nilai tidak ada, dll).
Solusi ini harus bekerja di semua skenario:
sumber
Coba ini
sumber
Kode ini berfungsi untuk semua file json yang diberikan
sumber
Jawaban Alec McGail yang dimodifikasi untuk mendukung JSON dengan daftar di dalamnya
Terima kasih!
sumber
sumber
Jika kita perhatikan contoh di bawah ini untuk mengonversi file berformat json menjadi file berformat csv.
Kode di bawah ini akan mengonversi file json (data3.json) menjadi file csv (data3.csv).
Kode yang disebutkan di atas telah dieksekusi di pycharm yang diinstal secara lokal dan telah berhasil mengkonversi file json ke file csv. Semoga bantuan ini dapat mengonversi file.
sumber
Karena data tampak dalam format kamus, maka Anda harus benar-benar menggunakan csv.DictWriter () untuk benar-benar menampilkan baris dengan informasi header yang sesuai. Ini seharusnya memungkinkan konversi ditangani agak lebih mudah. Parameter fieldnames kemudian akan mengatur pesanan dengan benar sementara output dari baris pertama sebagai header akan memungkinkannya untuk dibaca dan diproses kemudian oleh csv.DictReader ().
Misalnya, Mike Repass digunakan
Namun, ubah saja pengaturan awal menjadi output = csv.DictWriter (pengaturan file, fieldnames = data [0] .keys ())
Perhatikan bahwa karena urutan elemen dalam kamus tidak ditentukan, Anda mungkin harus membuat entri fieldnames secara eksplisit. Setelah Anda melakukan itu, penulis akan bekerja. Penulisan kemudian bekerja seperti yang ditunjukkan pada awalnya.
sumber
Sayangnya saya tidak memiliki reputasi untuk memberikan kontribusi kecil untuk jawaban @Alec McGail yang luar biasa. Saya menggunakan Python3 dan saya harus mengubah peta menjadi daftar setelah komentar @Alexis R.
Tambahan lagi saya telah menemukan penulis csv menambahkan CR ekstra ke file (saya memiliki baris kosong untuk setiap baris dengan data di dalam file csv). Solusinya sangat mudah mengikuti jawaban @Jason R. Coombs untuk utas ini: CSV dengan Python menambahkan carriage return tambahan
Anda hanya perlu menambahkan parameter lineterminator = '\ n' ke csv.writer. Boleh jadi:
csv_w = csv.writer( out_file, lineterminator='\n' )
sumber
Anda dapat menggunakan kode ini untuk mengonversi file json ke file csv Setelah membaca file tersebut, saya mengonversi objek ke bingkai data panda dan kemudian menyimpannya ke file CSV
sumber
Saya mungkin terlambat ke pesta, tapi saya pikir, saya sudah berurusan dengan masalah yang sama. Saya punya file json yang terlihat seperti ini
Saya hanya ingin mengekstrak beberapa kunci / nilai dari file json ini. Jadi, saya menulis kode berikut untuk mengekstrak yang sama.
Saya harap ini akan membantu. Untuk detail tentang cara kerja kode ini, Anda dapat memeriksa di sini
sumber
Ini adalah modifikasi dari jawaban @ MikeRepass. Versi ini menulis CSV ke file, dan berfungsi untuk Python 2 dan Python 3.
sumber