Ładnie wydrukuj dane JSON do pliku za pomocą języka Python

111

Projekt dla zajęć obejmuje analizę danych JSON Twittera. Pobieram dane i ustawiam je do pliku bez większego problemu, ale wszystko jest w jednej linii. Jest to dobre w przypadku manipulacji danymi, które próbuję zrobić, ale plik jest absurdalnie trudny do odczytania i nie mogę go bardzo dobrze zbadać, co sprawia, że ​​pisanie kodu dla części dotyczącej manipulacji danymi jest bardzo trudne.

Czy ktoś wie, jak to zrobić z poziomu Pythona (tj. Nie używając narzędzia wiersza poleceń, którego nie mogę uruchomić)? Oto mój dotychczasowy kod:

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

Uwaga Doceniam osoby wskazujące mi na prostą dokumentację i tym podobne, ale jak już powiedziałem, już się temu przyjrzałem i nadal potrzebuję pomocy. Naprawdę pomocna odpowiedź będzie bardziej szczegółowa i wyjaśniająca niż przykłady tam znalezione. Dzięki

Ponadto: próbując tego w wierszu poleceń systemu Windows:

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

powoduje to:

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

Podałbym dane, których używam, ale są bardzo duże i już widziałeś kod, którego użyłem do utworzenia pliku.

Zelbinian
źródło
1
Wątpię, czy rzeczywiście chcesz zapisać dane binarne („wb”)
Hamish,
Nauczono mnie, że jest to konieczne dla komputerów z systemem Windows i jak dotąd działało przy wszystkich moich zadaniach. Jeśli możesz zaoferować dokumentację wyjaśniającą, dlaczego może to być nieprawidłowe, z przyjemnością się tym zajrzę.
Zelbinian,
Jest to konieczne tylko wtedy, gdy pracujesz z plikami binarnymi lub w innych przypadkach, w których ważna jest konkretna forma zakończenia linii (np. \r\nVs \n). Zobacz stackoverflow.com/questions/3257869/… . W twoim przypadku chcesz, aby zakończenia linii były przyjazne dla systemu Windows, ale możesz nie uzyskać tego z punktu końcowego Twittera, więc powinieneś otworzyć w trybie tekstowym.
Hamish,
Czy to odpowiada na twoje pytanie? Jak ładnie wydrukować plik JSON?
wesinat0r

Odpowiedzi:

102

Powinieneś użyć opcjonalnego argumentu 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
źródło
1
Dziękuję, zadziałało idealnie . Czy możesz wyjaśnić, dlaczego „sort_keys” musi tam być?
Zelbinian,
1
Nie musi tam być, ale sprawia, że ​​wszystko jest bardzo ładne i uporządkowane alfabetycznie. Zwykle używam go, gdy chcę, aby wynik był czytelny dla człowieka.
mattbornski
4
Dobrze wyjaśnione dziękuję - ale nie próbowanie bycia & $ & #, ale otwieranie / zamykanie, aby zapisać plik, nie jest zachęcające, struktura ze strukturą jest generalnie preferowana: with open("name_of_file.json", "w") as f: f.write(my_formatted_json_var) zaletą jest to, że jesteś pewien, że plik się zamknie, powiedzmy na większych fragmentach ...
logicOnAbstractions
withskładnia jest zdecydowanie ładniejsza, ale staram się przeskalować odpowiedzi do odbiorców
mattbornski
73

Możesz przeanalizować JSON, a następnie wyprowadzić go ponownie z wcięciami takimi jak:

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

Więcej informacji można znaleźć pod adresem http://docs.python.org/library/json.html .

dkaminy
źródło
@Zelbinian: tak, to działa również dla simplejson Spójrz tutaj simplejson.googlecode.com/svn/tags/simplejson-1.9.1/docs/…
RanRag
Powoduje to pusty plik. 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.dumpszwraca ciąg. json.dumpzapisuje do pliku.
dkamine
65
import json

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

Nie potrzebujesz, json.dumps()jeśli nie chcesz później analizować ciągu, po prostu użyj json.dump(). Jest też szybszy.

Andras Dosztal
źródło
14

Możesz użyć modułu json w pythonie, aby dobrze wydrukować.

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

A więc w twoim przypadku

>>> print json.dumps(json_output, indent=4)
RanRag
źródło
Wypróbowałem tę trasę i niestety nie działa tak dobrze, jak myślisz.
Zelbinian,
@Zelbinian: Dokładnie, co masz na myśli przez doesn't work as well.?
RanRag
1
Wyprowadził dane w jednej linii w czymś, co wyglądało na składnię
dyktu w
Uwzględnij wynik w pytaniu jako edycję, abyśmy mogli to zobaczyć.
RanRag
używając tego, tablice są wypisywane jako wiele wierszy każdej wartości, byłoby miło trzymać tablicę w jednym wierszu.
scape
4

Jeśli masz już istniejące pliki JSON, które chcesz ładnie sformatować, możesz użyć tego:

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

Jeśli generujesz nowy * .json lub modyfikujesz istniejący plik josn, użyj parametru "indent" dla ładnego formatu json widoku.

import json
responseData = json.loads(output)
with open('twitterData.json','w') as twitterDataFile:    
    json.dump(responseData, twitterDataFile, indent=4)
Praveen SN
źródło
1
import json
def writeToFile(logData, fileName, openOption="w"):
  file = open(fileName, openOption)
  file.write(json.dumps(json.loads(logData), indent=4)) 
  file.close()  
Piotr
źródło
Chociaż ten kod może odpowiedzieć na pytanie, zapewnia dodatkowy kontekst dotyczący tego, dlaczego i / lub jak ten kod odpowiada, poprawia jego długoterminową wartość.
Tân
-2

Możesz przekierować plik do Pythona i otworzyć go za pomocą narzędzia, a do odczytu użyj więcej.

Przykładowy kod będzie wyglądał następująco:

cat filename.json | python -m json.tool | more
Ramya
źródło