Ini kode saya, hal yang sangat sederhana ...
import csv
import json
csvfile = open('file.csv', 'r')
jsonfile = open('file.json', 'w')
fieldnames = ("FirstName","LastName","IDNumber","Message")
reader = csv.DictReader( csvfile, fieldnames)
out = json.dumps( [ row for row in reader ] )
jsonfile.write(out)
Deklarasikan beberapa nama kolom, pembaca menggunakan CSV untuk membaca file, dan nama kolom untuk membuang file ke format JSON. Inilah masalahnya ...
Setiap record di file CSV berada di baris yang berbeda. Saya ingin keluaran JSON dengan cara yang sama. Masalahnya adalah ia membuang semuanya dalam satu garis besar dan panjang.
Saya sudah mencoba menggunakan sesuatu seperti for line in csvfile:
dan kemudian menjalankan kode saya di bawah yang reader = csv.DictReader( line, fieldnames)
dengannya loop melalui setiap baris, tetapi itu melakukan seluruh file pada satu baris, kemudian loop melalui seluruh file di baris lain ... berlanjut sampai kehabisan baris .
Ada saran untuk memperbaiki ini?
Sunting: Untuk memperjelas, saat ini saya memiliki: (setiap catatan di baris 1)
[{"FirstName":"John","LastName":"Doe","IDNumber":"123","Message":"None"},{"FirstName":"George","LastName":"Washington","IDNumber":"001","Message":"Something"}]
Apa yang saya cari: (2 catatan pada 2 baris)
{"FirstName":"John","LastName":"Doe","IDNumber":"123","Message":"None"}
{"FirstName":"George","LastName":"Washington","IDNumber":"001","Message":"Something"}
Tidak setiap bidang individu menjorok / pada baris terpisah, tetapi setiap catatan pada barisnya sendiri.
Beberapa masukan sampel.
"John","Doe","001","Message1"
"George","Washington","002","Message2"
[{..row..},{..row..},...]
tidak menghasilkan{..row..}{..row..}..
. Artinya, outputnya akan terlihat seperti array json dari objek json, bukan aliran objek json yang tidak terhubung.Jawaban:
Masalah dengan keluaran yang Anda inginkan adalah bahwa itu bukan dokumen json yang valid ,; itu aliran dokumen json !
Tidak apa-apa, jika itu yang Anda butuhkan, tetapi itu berarti bahwa untuk setiap dokumen yang Anda inginkan dalam keluaran Anda, Anda harus memanggil
json.dumps
.Karena baris baru yang Anda inginkan untuk memisahkan dokumen Anda tidak terdapat dalam dokumen-dokumen itu, Anda siap untuk memasoknya sendiri. Jadi kita hanya perlu menarik loop keluar dari panggilan ke json.dump dan memasukkan baris baru untuk setiap dokumen yang ditulis.
sumber
DictReader
tanpa memberikanfieldnames
argumen; itu kemudian akan membaca baris pertama untuk mendapatkan nama field dari file.csvfile = open('file.csv', 'r',encoding='utf-8')
danjsonfile = open('file.json', 'w',encoding='utf-8')
Anda dapat menggunakan Pandas DataFrame untuk melakukannya, dengan Contoh berikut:
sumber
Saya mengambil respons @ SingleNegationElimination dan menyederhanakannya menjadi tiga baris yang dapat digunakan dalam pipeline:
sumber
Dokumentasi json.dumps ()
sumber
Anda dapat mencoba ini
Edit:
Pendekatan yang lebih sederhana
sumber
csvmapper
,, untuk melakukan ini (dan mungkin di mana mendapatkannya) sebagai lawan dari sesuatu yang ada di dalamnya.Tambahkan
indent
parameter kejson.dumps
Perhatikan juga bahwa, Anda dapat menggunakan
json.dump
dengan terbukajsonfile
:sumber
Saya melihat ini sudah tua tetapi saya membutuhkan kode dari SingleNegationElimination namun saya memiliki masalah dengan data yang mengandung karakter non utf-8. Ini muncul di bidang yang tidak terlalu saya pedulikan, jadi saya memilih untuk mengabaikannya. Namun itu membutuhkan usaha. Saya baru mengenal python jadi dengan beberapa trial and error saya membuatnya berfungsi. Kode tersebut adalah salinan SingleNegationElimination dengan penanganan ekstra utf-8. Saya mencoba melakukannya dengan https://docs.python.org/2.7/library/csv.html tetapi pada akhirnya menyerah. Kode di bawah ini berfungsi.
sumber
Bagaimana dengan menggunakan Pandas untuk membaca file csv menjadi DataFrame ( pd.read_csv ), kemudian memanipulasi kolom jika Anda mau (menghapusnya atau memperbarui nilai) dan terakhir mengubah DataFrame kembali ke JSON ( pd.DataFrame.to_json ).
Catatan: Saya belum memeriksa seberapa efisien ini akan tetapi ini jelas merupakan salah satu cara termudah untuk memanipulasi dan mengonversi csv besar ke json.
sumber
Sebagai sedikit peningkatan pada jawaban @MONTYHS, iterasi melalui tup nama bidang:
sumber
sumber
DictReader
, jadi kode ini menebak nama kolom dari baris pertama file input: John, Doe, 5, "None", bukan "FirstName, lastname," dan seterusnya ...TypeError: expected string or buffer