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.


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()

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.


@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.


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)

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()

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)

1
import json
def writeToFile(logData, fileName, openOption="w"):
  file = open(fileName, openOption)
  file.write(json.dumps(json.loads(logData), indent=4)) 
  file.close()  

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.