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


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

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 .


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


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)

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

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)

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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.