Python kullanarak JSON Verilerini Dosyaya Pretty-Print


111

Sınıf için bir proje, Twitter JSON verilerinin ayrıştırılmasını içerir. Verileri alıyorum ve çok fazla sorun yaşamadan dosyaya ayarlıyorum, ancak hepsi tek satırda. Bu, yapmaya çalıştığım veri işleme için sorun değil, ancak dosyayı okumak gülünç derecede zor ve çok iyi inceleyemiyorum, bu da veri işleme kısmı için kod yazmayı çok zorlaştırıyor.

Bunu Python içinden nasıl yapacağını bilen var mı (yani, komut satırı aracını kullanmadan, ki işe koyamıyorum)? Şimdiye kadarki kodum:

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

Not İnsanların beni simplejson belgelerine yönlendirmesini takdir ediyorum, ancak daha önce de belirttiğim gibi, buna zaten baktım ve yardıma ihtiyacım var. Gerçekten yardımcı olacak bir yanıt, burada bulunan örneklerden daha ayrıntılı ve açıklayıcı olacaktır. Teşekkürler

Ayrıca: Bunu Windows komut satırında denemek:

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

bununla sonuçlanır:

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

Size kullandığım verileri verirdim, ancak çok büyük ve dosyayı oluşturmak için kullandığım kodu zaten gördünüz.


1
Aslında ikili veri ("wb") yazmak istediğinizden şüpheliyim
Hamish

Bunun Windows makineleri için gerekli olduğu öğretildi ve şimdiye kadar tüm görevlerim için çalıştı. Bunun neden yanlış olabileceğine dair belgeler sunabilirseniz, memnuniyetle bakarım.
Zelbinian

Yalnızca ikili dosyalarla çalışıyorsanız veya belirli satır sonlandırma biçiminin (örneğin \r\nvs \n) önemli olduğu diğer durumlarda gereklidir . Bkz stackoverflow.com/questions/3257869/... . Sizin durumunuzda, Windows dostu satır sonları istiyorsunuz, ancak bunu twitter uç noktasından alamayabilirsiniz, bu nedenle metin modunda açmalısınız.
Hamish

Yanıtlar:


102

İsteğe bağlı bağımsız değişkeni kullanmalısınız 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
Teşekkür ederim, mükemmel çalıştı . "Sort_keys" in neden orada olması gerektiğini açıklayabilir misiniz?
Zelbinian

1
Orada olmasına gerek yok ama her şeyi çok güzel ve alfabetik olarak sıralı hale getiriyor. İnsan tarafından okunabilir çıktı istediğimde kullanmaya meyilliyim.
mattbornski

4
İyi açıklanmış teşekkür ederim - ancak bir & $ & # olmaya çalışmamak, ancak bir dosyayı yazmak için açmak / kapatmak cesaret vermez, genellikle with yapısı tercih edilir: with open("name_of_file.json", "w") as f: f.write(my_formatted_json_var) Avantaj, dosyanın kapanacağından emin olmanız, örneğin daha büyük parçalar üzerinde ...
logicOnAbstractions

withsözdizimi kesinlikle daha güzel, ancak yanıtlarımı izleyicilerime göre ölçeklendirmeye çalışıyorum
mattbornski

73

JSON'u ayrıştırabilir, ardından aşağıdaki gibi girintilerle tekrar çıktı alabilirsiniz:

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

Daha fazla bilgi için http://docs.python.org/library/json.html bakın .


@Zelbinian: evet, simplejson için de çalışıyor.Buraya bir göz atın simplejson.googlecode.com/svn/tags/simplejson-1.9.1/docs/…
RanRag

Bu, boş bir dosya ile sonuçlanır. 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.dumpsbir dizge döndürür. json.dumpbir dosyaya yazar.
dkamins

65
import json

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

json.dumps()Dizeyi daha sonra ayrıştırmak istemiyorsanız ihtiyacınız yok, sadece kullanın json.dump(). Aynı zamanda daha hızlı.


14

Güzel yazdırmak için python'un json modülünü kullanabilirsiniz .

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

Yani senin durumunda

>>> print json.dumps(json_output, indent=4)

Bu rotayı denedim ve bu maalesef düşündüğünüz kadar iyi sonuç vermiyor.
Zelbinian

@Zelbinian: Kesinlikle ne demek istiyorsun doesn't work as well.?
RanRag

1
Verileri, güzel basılmış Json sözdizimi yerine Python dikte sözdizimi gibi görünen tek bir satırda çıktı
Zelbinian

Sorunuzdaki çıktıyı bir düzenleme olarak dahil edin, böylece görebiliriz.
RanRag

bunu kullanarak, diziler her bir değerden çok sayıda satır olarak listelenir, diziyi tek satırda tutmak iyi olur.
günah

4

Zaten biçimlendirmek istediğiniz mevcut JSON dosyalarınız varsa, bunu kullanabilirsiniz:

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

3

Yeni * .json oluşturuyorsanız veya mevcut josn dosyasını değiştiriyorsanız, güzel görünüm json biçimi için "girinti" parametresini kullanın.

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

Bu kod soruyu yanıtlayabilirken, bu kodun soruyu neden ve / veya nasıl yanıtladığına ilişkin ek bağlam sağlamak , uzun vadeli değerini artırır.
Tan

-2

Bir dosyayı python'a yönlendirebilir ve aracı kullanarak açabilir ve daha fazlasını okumak için kullanabilirsiniz.

Örnek kod,

cat filename.json | python -m json.tool | more
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.