Pretty-Print Data JSON ke File menggunakan Python

111

Proyek untuk kelas melibatkan penguraian data JSON Twitter. Saya mendapatkan data dan menyetelnya ke file tanpa banyak masalah, tetapi semuanya dalam satu baris. Ini bagus untuk manipulasi data yang saya coba lakukan, tetapi file tersebut sangat sulit dibaca dan saya tidak dapat memeriksanya dengan baik, membuat penulisan kode untuk bagian manipulasi data menjadi sangat sulit.

Adakah yang tahu bagaimana melakukan itu dari dalam Python (yaitu tidak menggunakan alat baris perintah, yang saya tidak bisa mulai bekerja)? Inilah kode saya sejauh ini:

header, output = client.request(twitterRequest, method="GET", body=None,
                            headers=None, force_auth_header=True)

# now write output to a file
twitterDataFile = open("twitterData.json", "wb")
# magic happens here to make it pretty-printed
twitterDataFile.write(output)
twitterDataFile.close()

Catatan Saya menghargai orang yang mengarahkan saya ke dokumentasi simplejson dan semacamnya, tetapi seperti yang telah saya nyatakan, saya telah melihatnya dan terus membutuhkan bantuan. Balasan yang benar-benar membantu akan lebih detail dan jelas daripada contoh yang ditemukan di sana. Terima kasih

Juga: Mencoba ini di baris perintah windows:

more twitterData.json | python -mjson.tool > twitterData-pretty.json

menghasilkan ini:

Invalid control character at: line 1 column 65535 (char 65535)

Saya akan memberi Anda data yang saya gunakan, tetapi itu sangat besar dan Anda sudah melihat kode yang saya gunakan untuk membuat file tersebut.

Zelbinian
sumber
1
Saya ragu Anda benar-benar ingin menulis data biner ("wb")
Hamish
Saya diajari bahwa ini diperlukan untuk mesin Windows dan sejauh ini telah berhasil untuk semua tugas saya. Jika Anda dapat menawarkan dokumentasi tentang mengapa ini mungkin salah, saya akan dengan senang hati melihatnya.
Zelbinian
Ini hanya diperlukan jika Anda bekerja dengan file biner, atau kasus lain di mana bentuk spesifik dari akhiran baris (misalnya \r\nvs \n) penting. Lihat stackoverflow.com/questions/3257869/… . Dalam kasus Anda, Anda ingin akhiran baris ramah windows, tetapi Anda mungkin tidak mendapatkannya dari titik akhir twitter, jadi Anda harus membuka dalam mode teks.
Hamish
Apakah ini menjawab pertanyaan Anda? Bagaimana cara prettyprint file JSON?
wesinat0r

Jawaban:

102

Anda harus menggunakan argumen opsional indent.

header, output = client.request(twitterRequest, method="GET", body=None,
                            headers=None, force_auth_header=True)

# now write output to a file
twitterDataFile = open("twitterData.json", "w")
# magic happens here to make it pretty-printed
twitterDataFile.write(simplejson.dumps(simplejson.loads(output), indent=4, sort_keys=True))
twitterDataFile.close()
mattbornski
sumber
1
Terima kasih, itu bekerja dengan sempurna . Bisakah Anda menjelaskan mengapa "sort_keys" perlu ada di sana?
Zelbinian
1
Itu tidak perlu ada di sana tetapi itu membuat semuanya sangat cantik dan diurutkan menurut abjad. Saya cenderung menggunakannya ketika saya ingin keluaran yang dapat dibaca manusia.
mattbornski
4
Dijelaskan dengan baik terima kasih -tetapi tidak mencoba menjadi & $ & # tetapi buka / tutup untuk menulis file tidak mendorong, struktur with umumnya lebih disukai: with open("name_of_file.json", "w") as f: f.write(my_formatted_json_var) Keuntungannya adalah Anda yakin file akan ditutup, katakan pada cuplikan yang lebih besar ...
logicOnAbstractions
withsintaks jelas lebih baik, tetapi saya mencoba untuk mengukur jawaban saya kepada audiens saya
mattbornski
73

Anda dapat mengurai JSON, lalu mengeluarkannya lagi dengan indentasi seperti ini:

import json
mydata = json.loads(output)
print json.dumps(mydata, indent=4)

Lihat http://docs.python.org/library/json.html untuk info lebih lanjut.

dkamins
sumber
@Zelbinian: ya ini juga berfungsi untuk simplejson. Lihat di sini simplejson.googlecode.com/svn/tags/simplejson-1.9.1/docs/…
RanRag
Ini menghasilkan file kosong. header, output = client.request(twitterRequest, method="GET", body=None, headers=None, force_auth_header=True) twitterDataFile = open("twitterData.json", "wb") json.dumps(json.loads(output), twitterDataFile, indent=4) twitterDataFile.close()
Zelbinian
5
@Zelbinian - json.dumpsmengembalikan string. json.dumpmenulis ke file.
dkamins
65
import json

with open("twitterdata.json", "w") as twitter_data_file:
    json.dump(output, twitter_data_file, indent=4, sort_keys=True)

Anda tidak perlu json.dumps()jika tidak ingin mengurai string nanti, cukup gunakan json.dump(). Lebih cepat juga.

Andras Dosztal
sumber
14

Anda dapat menggunakan modul json python untuk mencetak cantik.

>>> import json
>>> print json.dumps({'4': 5, '6': 7}, sort_keys=True, indent=4)
{
    "4": 5,
    "6": 7
}

Jadi, dalam kasus Anda

>>> print json.dumps(json_output, indent=4)
RanRag
sumber
Sudah mencoba rute itu dan sayangnya tidak bekerja sebaik yang Anda pikirkan.
Zelbinian
@Zelbinian: Persis apa yang Anda maksud dengan doesn't work as well.?
RanRag
1
Ini mengeluarkan data dalam satu baris dalam apa yang tampak seperti sintaks Python dict alih-alih sintaks Json yang dicetak cantik
Zelbinian
Sertakan output dalam pertanyaan Anda sebagai edit. Jadi, kita bisa melihatnya.
RanRag
menggunakan ini, array didaftarkan sebanyak baris dari setiap nilai, alangkah baiknya untuk menjaga array dalam satu baris.
scape
4

Jika Anda sudah memiliki file JSON yang ingin Anda format cantik, Anda dapat menggunakan ini:

    with open('twitterdata.json', 'r+') as f:
        data = json.load(f)
        f.seek(0)
        json.dump(data, f, indent=4)
        f.truncate()
locke14
sumber
3

Jika Anda membuat * .json baru atau memodifikasi file josn yang ada, gunakan parameter "indent" untuk format json tampilan cantik.

import json
responseData = json.loads(output)
with open('twitterData.json','w') as twitterDataFile:    
    json.dump(responseData, twitterDataFile, indent=4)
Praveen SN
sumber
1
import json
def writeToFile(logData, fileName, openOption="w"):
  file = open(fileName, openOption)
  file.write(json.dumps(json.loads(logData), indent=4)) 
  file.close()  
Peter
sumber
Meskipun kode ini dapat menjawab pertanyaan, memberikan konteks tambahan tentang mengapa dan / atau bagaimana kode ini menjawab pertanyaan tersebut meningkatkan nilai jangka panjangnya.
Tân
-2

Anda dapat mengarahkan file ke python dan membuka menggunakan alat tersebut dan untuk membacanya gunakan lebih banyak.

Kode sampelnya adalah,

cat filename.json | python -m json.tool | more
Ramya
sumber