Mam plik JSON, który chcę przekonwertować na plik CSV. Jak mogę to zrobić za pomocą Pythona?
Próbowałem:
import json
import csv
f = open('data.json')
data = json.load(f)
f.close()
f = open('data.csv')
csv_file = csv.writer(f)
for item in data:
csv_file.writerow(item)
f.close()
Jednak to nie zadziałało. Używam Django, a otrzymany błąd to:
file' object has no attribute 'writerow'
Następnie spróbowałem:
import json
import csv
f = open('data.json')
data = json.load(f)
f.close()
f = open('data.csv')
csv_file = csv.writer(f)
for item in data:
f.writerow(item) # ← changed
f.close()
Pojawia się błąd:
sequence expected
Przykładowy plik json:
[{
"pk": 22,
"model": "auth.permission",
"fields": {
"codename": "add_logentry",
"name": "Can add log entry",
"content_type": 8
}
}, {
"pk": 23,
"model": "auth.permission",
"fields": {
"codename": "change_logentry",
"name": "Can change log entry",
"content_type": 8
}
}, {
"pk": 24,
"model": "auth.permission",
"fields": {
"codename": "delete_logentry",
"name": "Can delete log entry",
"content_type": 8
}
}, {
"pk": 4,
"model": "auth.permission",
"fields": {
"codename": "add_group",
"name": "Can add group",
"content_type": 2
}
}, {
"pk": 10,
"model": "auth.permission",
"fields": {
"codename": "add_message",
"name": "Can add message",
"content_type": 4
}
}
]
jq
, jak opisano tutaj: stackoverflow.com/questions/32960857/…Odpowiedzi:
Po pierwsze, JSON ma zagnieżdżone obiekty, więc zwykle nie można go bezpośrednio przekonwertować na CSV. Musisz zmienić to na coś takiego:
Oto mój kod do generowania CSV z tego:
Otrzymasz wynik jako:
źródło
[u'
i']
. Jakie jest obejście (niezwiązane z przetwarzaniem)? jeśli jest jeden ... :)TypeError: a bytes-like object is required, not 'str'
naf.writerow(['pk', 'model', 'codename', 'name', 'content_type'])
f = csv.writer(open("test.csv", "w", newline=''))
Z
pandas
biblioteki , to jest tak proste, jak za pomocą dwóch poleceń!Aby przekonwertować ciąg JSON na obiekt pandy (szereg lub ramkę danych). Następnie, zakładając, że wyniki zostały zapisane jako
df
:Który może albo zwrócić ciąg, albo zapisać bezpośrednio do pliku csv.
Na podstawie gadatliwości poprzednich odpowiedzi wszyscy powinniśmy podziękować pandom za skrót.
źródło
.to_csv()
naprawdę potężna (na przykład filtrowanie kolumn za darmo). Muszę nauczyć się pand.orient='records'
musi być ustawiony, ale każdy wierszfields
będzie nadaldict
oznaczeniem, co nie jest tym, czego żądał PO.Zakładam, że Twój plik JSON zostanie zdekodowany na listę słowników. Najpierw potrzebujemy funkcji, która spłaszczy obiekty JSON:
Wynik uruchomienia tego fragmentu kodu w obiekcie JSON:
jest
Po zastosowaniu tej funkcji do każdego nagrania w tablicy wejściowej obiektów JSON:
i znalezienie odpowiednich nazw kolumn:
nie jest trudno uruchomić to przez moduł csv:
Mam nadzieję, że to pomoże!
źródło
JSON może reprezentować wiele różnych struktur danych - „obiekt” JS jest z grubsza podobny do słownika Pythona (z kluczami łańcuchowymi), „tablica” JS z grubsza przypomina listę Pythona i można zagnieżdżać je tak długo, jak końcowe „ elementy liści ”to liczby lub ciągi znaków.
CSV może zasadniczo reprezentować tylko tabelę 2-D - opcjonalnie z pierwszym wierszem „nagłówków”, tj. „Nazwami kolumn”, co może sprawić, że tabela będzie interpretowana jako lista dykt, zamiast zwykłej interpretacji, lista listy (ponownie, elementami „liścia” mogą być liczby lub ciągi znaków).
Tak więc w ogólnym przypadku nie można przetłumaczyć dowolnej struktury JSON na CSV. W kilku specjalnych przypadkach możesz (tablica tablic bez dalszego zagnieżdżania; tablice obiektów, które wszystkie mają dokładnie takie same klucze). Jaki szczególny przypadek dotyczy twojego problemu? Szczegóły rozwiązania zależą od tego, który konkretny przypadek masz. Biorąc pod uwagę zdumiewający fakt, że nawet nie wspominasz, który z nich ma zastosowanie, podejrzewam, że mogłeś nie wziąć pod uwagę ograniczenia, w rzeczywistości nie ma zastosowania żaden użyteczny przypadek, a twojego problemu nie można rozwiązać. Ale proszę wyjaśnij!
źródło
Ogólne rozwiązanie, które tłumaczy dowolną listę płaskich obiektów json na csv.
Przekaż plik input.json jako pierwszy argument w wierszu polecenia.
źródło
Ten kod powinien działać dla Ciebie, przy założeniu, że Twoje dane JSON znajdują się w pliku o nazwie
data.json
.źródło
csv_file.writerow
(f.writerow
oczywiście nie ma , zakładam, że popełniłeś literówkę!) Chce sekwencji, a nie dyktowania - w twoim przykładzie każdy przedmiot to dykt. To działałoby w innym specjalnym przypadku, jak wskazałem w mojej odpowiedzi - gdzie plik JSON ma tablicę tablic; nie działa dla szeregu obiektów, co jest szczególnym przypadkiem, który wydaje się próbować rozwiązać (ten wymagacsv.DictWriter
- i oczywiście musisz wyodrębnić nazwy pól i zdecydować o kolejności w celu jej utworzenia) ! -).Będzie łatwy w użyciu
csv.DictWriter()
, szczegółowa implementacja może wyglądać następująco:Zauważ, że zakłada to, że wszystkie obiekty JSON mają te same pola.
Oto odniesienie, które może ci pomóc.
źródło
Miałem problem z zaproponowanym przez Dana rozwiązaniem , ale zadziałało to dla mnie:
Gdzie „test.json” zawierał:
źródło
Użyj
json_normalize
zpandas
:test.json
encoding='utf-8'
może nie być konieczne.pathlib
biblioteki.open
jest metodąpathlib
Wyjście CSV:
Inne zasoby dla bardziej zagnieżdżonych obiektów JSON:
źródło
Jak wspomniano w poprzednich odpowiedziach, trudność w konwersji jsona na csv polega na tym, że plik json może zawierać zagnieżdżone słowniki, a zatem może być wielowymiarową strukturą danych sprawdzającą csv, który jest strukturą danych 2D. Jednak dobrym sposobem na przekształcenie wielowymiarowej struktury w csv jest posiadanie wielu plików csv, które łączą się z kluczami głównymi.
W twoim przykładzie pierwsze wyjście csv ma kolumny „pk”, „model”, „fields” jako kolumny. Wartości dla „pk” i „model” są łatwe do zdobycia, ale ponieważ kolumna „pola” zawiera słownik, powinien to być własny plik csv, a ponieważ „nazwa kodowa” wydaje się być kluczem podstawowym, można użyć jej jako danych wejściowych dla „pól” do wypełnienia pierwszego pliku csv. Drugi plik csv zawiera słownik z kolumny „pola” o nazwie kodowej jako kluczu podstawowym, którego można użyć do powiązania dwóch plików csv.
Oto rozwiązanie dla twojego pliku json, który konwertuje zagnieżdżone słowniki do 2 plików CSV.
źródło
Wiem, że minęło sporo czasu, odkąd zadano to pytanie, ale pomyślałem, że mogę dodać do odpowiedzi innych i udostępnić post na blogu, który moim zdaniem wyjaśniłby rozwiązanie w bardzo zwięzły sposób.
Oto link
Otwórz plik do pisania
Utwórz obiekt piszący csv
Zamknij plik, aby zapisać zawartość
źródło
Nie jest to zbyt mądry sposób, aby to zrobić, ale miałem ten sam problem i to zadziałało dla mnie:
źródło
Odpowiedź Aleca jest świetna, ale nie działa w przypadku wielu poziomów zagnieżdżenia. Oto zmodyfikowana wersja, która obsługuje wiele poziomów zagnieżdżania. To sprawia, że nazwy nagłówków są nieco ładniejsze, jeśli zagnieżdżony obiekt już określa swój własny klucz (np. Dane Firebase Analytics / BigTable / BigQuery):
źródło
Działa to stosunkowo dobrze. Spłaszcza plik Json, aby zapisać go do pliku CSV. Elementy zagnieżdżone są zarządzane :)
To dotyczy Pythona 3
cieszyć się.
źródło
json.loads
nie działał, sprawiłem, że działałjson.load
, co ładnie daje obiekt listy. Po trzecie, zagnieżdżone elementy zostały utracone.Mój prosty sposób na rozwiązanie tego:
Utwórz nowy plik Python, taki jak: json_to_csv.py
Dodaj ten kod:
Po dodaniu tego kodu zapisz plik i uruchom na terminalu:
Mam nadzieję, że ci to pomoże.
DO ZOBACZENIA!
źródło
Zaskakujące, okazało się, że żadna z zamieszczonych tutaj odpowiedzi poprawnie nie uwzględnia wszystkich możliwych scenariuszy (np. Zagnieżdżone dykty, zagnieżdżone listy, brak wartości itp.).
To rozwiązanie powinno działać we wszystkich scenariuszach:
źródło
Spróbuj tego
źródło
Ten kod działa dla każdego danego pliku Json
źródło
Zmodyfikowano odpowiedź Aleca McGaila, aby obsługiwała JSON z listami w środku
Dzięki!
źródło
źródło
Jeśli weźmiemy pod uwagę poniższy przykład konwersji pliku w formacie json na plik w formacie csv.
Poniższy kod przekonwertuje plik json (data3.json) na plik csv (data3.csv).
Powyższy kod został wykonany w lokalnie zainstalowanym pycharmie i pomyślnie przekonwertował plik json na plik csv. Mam nadzieję, że pomoże to w konwersji plików.
źródło
Ponieważ dane wydają się mieć format słownikowy, wydaje się, że powinieneś użyć csv.DictWriter (), aby faktycznie wypisać wiersze z odpowiednimi informacjami nagłówka. To powinno pozwolić na łatwiejszą konwersję. Parametr fieldnames poprawnie ustawiłby następnie kolejność, podczas gdy wyjście pierwszego wiersza, ponieważ nagłówki pozwoliłyby na jego odczytanie i przetworzenie później przez csv.DictReader ().
Na przykład użył Mike Repass
Jednak po prostu zmień początkową konfigurację na output = csv.DictWriter (zestaw plików, nazwy pól = dane [0] .keys ())
Zauważ, że ponieważ kolejność elementów w słowniku nie jest zdefiniowana, może być konieczne jawne utworzenie wpisów nazw pól. Gdy to zrobisz, writerow będzie działać. Zapisy działają wtedy tak, jak pierwotnie pokazano.
źródło
Niestety nie mam reputacji, aby wnieść niewielki wkład w niesamowitą odpowiedź @Alec McGail. Korzystałem z Python3 i musiałem przekonwertować mapę na listę po komentarzu @Alexis R.
Dodatkowo odkryłem, że pisarz csv dodaje do pliku dodatkowe CR (mam pustą linię dla każdej linii z danymi w pliku csv). Rozwiązanie było bardzo łatwe po odpowiedzi @Jason R. Coombs na ten wątek: CSV w Pythonie dodając dodatkowy znak powrotu karetki
Musisz po prostu dodać parametr lineterminator = '\ n' do csv.writer. To będzie:
csv_w = csv.writer( out_file, lineterminator='\n' )
źródło
Możesz użyć tego kodu, aby przekonwertować plik json na plik csv Po przeczytaniu pliku przekształcam obiekt w ramkę danych pandy, a następnie zapisuję go w pliku CSV
źródło
Mogę spóźnić się na przyjęcie, ale myślę, że poradziłem sobie z podobnym problemem. Miałem plik json, który wyglądał tak
Chciałem tylko wyodrębnić kilka kluczy / wartości z tych plików JSON. Więc napisałem następujący kod, aby wyodrębnić to samo.
Mam nadzieję, że to pomoże. Szczegółowe informacje na temat działania tego kodu można sprawdzić tutaj
źródło
To jest modyfikacja odpowiedzi @ MikeRepass. Ta wersja zapisuje CSV do pliku i działa zarówno dla Python 2, jak i Python 3.
źródło