2012-02-07 16 views
26

kullanarak File Pretty-Baskı Heyecan JSON Veri gerekiyor. Verileri alıp dosyayı çok fazla sorun olmadan ayarlıyorum ama hepsi tek bir satırda. Yapmaya çalıştığım veri manipülasyonu için gayet iyi, ama dosya okumak çok gülünç ve çok iyi inceleyemiyorum, veri manipülasyon parçası için kod yazma çok zor.sınıf için bir proje Heyecan JSON veri ayrıştırma içerir Python

herkes dan Python içinde (yani işe alınamıyor komut satırı aracını kullanarak değil) bunun nasıl biliyor mu? Ben belgelerine ve bu tür simplejson beni işaret insanları takdir ediyorum, ama belirttiğimiz gibi, ben zaten o baktım ve yardıma ihtiyaç devam

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: Burada şimdiye kadar benim kod. Gerçekten yararlı bir cevap, orada bulunan örneklerden daha detaylı ve açıklayıcı olacaktır. Teşekkür Ayrıca

: pencereler komut satırında bu çalışılıyor : bu

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

sonuçları:

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

Sana kullanıyorum verileri verirdim, ama çok büyük ve dosyayı yapmak için kullandığım kodu zaten gördünüz.

+1

Ben aslında bu, Windows makineleri için gerekliydi öğretildi ve bugüne kadar benim tüm atamaları için çalıştı – Hamish

+0

("wb") ikili veri yazmak istiyorum şüpheliyim. Bunun neden yanlış olabileceğine dair bir belge sunabiliyorsanız, buna bakmaktan mutluluk duyarım. hattın belirli formu biten nerede ikili dosyalarında veya diğer durumlarda çalışıyorsanız – Zelbinian

+0

Sadece gerekli (örneğin '\ r \ n '\ n'' vs) önemlidir. Http://stackoverflow.com/questions/3257869/difference-between-binary-and-text-i-o-in-python-on-windows adresine bakın.Durumunuzda, windows uyumlu satır sonlarını istiyorsunuz, ancak bunu twitter bitiş noktasından alamayabilirsiniz, bu yüzden metin modunda açmalısınız. – Hamish

cevap

27
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() 
+0

Teşekkür ederim, bu mükemmel ** çalıştı. "Sort_keys" in neden orada olması gerektiğini açıklayabilir misiniz? – Zelbinian

+0

Orada olması gerekmiyor ama çok güzel şeyler yapıyor ve alfabetik olarak sıralanıyor. İnsan tarafından okunabilir çıktı istediğimde onu kullanma eğilimindeyim. – mattbornski

+2

Açıkladı teşekkürler - bir & $ $ # olmaya çalışmayın ama bir dosya yazmak için açık/kapalı teşvik etmiyor, yapısı genellikle tercih edilir: açık ("name_of_file.json", "w" ile ") f: f.write (my_formatted_json_var) ' Dosyanın kapanacağından emin olmanın avantajı, daha büyük snippet'lerde söyle ... –

24

Böyle girintiler ile tekrar sonra çıktı, JSON ayrıştırabilirsiniz:

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

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

+0

Bu çalışmayı, aynı zamanda Simplejson için de görüyor muyum? – Zelbinian

+0

@Zelbinian: Evet, aynı zamanda simplejson için de çalışıyor. Burada bir göz atın http://simplejson.googlecode.com/svn/tags/simplejson-1.9.1/docs/index.html – RanRag

+0

Bu, boş bir dosya ile sonuçlanır. 'başlığı, çıkış = client.request (twitterRequest, yöntem = "GET", vücut = Yok, başlıklar = Yok, force_auth_header = Doğru) ("WB" "twitterData.json"), açık twitterDataFile = json. dumps (json.loads (output), twitterDataFile, indent = 4) twitterDataFile.close() ' – Zelbinian

8

Oldukça baskıya pitonun json modülünü kullanabilirsiniz.

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

Yani, davanızı

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

Bu yolu denediniz ve maalesef düşündüğünüz kadar iyi çalışmıyor. – Zelbinian

+0

@Zelbinian: Exactky ile ne demek istiyorsun? – RanRag

+1

Verileri, tek bir satırda, oldukça basılmış Json sözdizimi yerine Python dict sözdizimi olarak görünüyor çıktı – Zelbinian

-1

yılında bu eski soru olacak bu soru geldi ve basit bir cevap buldum. Sadece filename.json dosyasını python'a yönlendirin ve aracı kullanarak açın ve daha fazla okumak için okuyun.

örnek kod olacak

kedi filename.json | python -m json.tool | Daha sonra dizeyi ayrıştırmak istemiyorsanız sadece basitçe json.dump() kullanın json.dumps() gerekmez

1
import json 

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

fazlası. Çok hızlı.