In O'Reillys Buch "Datenvisualisierung beginnend mit Python und JavaScript" Beachten Sie, dass die gute Eingabe- / Ausgabemethode für CSV- und JSON-Dateien in Python organisiert wurde. Als ich den Vorgang mit Jupyter Notebook überprüfte, gab es einige Stellen, an denen ein Fehler aufgetreten ist Es gibt einige Unterschiede zum Code im Buch.
Offizielle Website des Buches: https://www.oreilly.co.jp/books/9784873118086/#toc
Windows 10 Pro 64bit Python: 3.6.1 Anaconda: 4.4.0 Jupyter Notebook: 1.0.0
Verwenden Sie Folgendes für Eingabe- / Ausgabedaten
nobel_winners = [
{ 'category': 'Physics',
'name': 'Albert Einstein',
'nationality': 'Swiss',
'sex': 'male',
'year': 1921},
{ 'category': 'Physics',
'name': 'Paul Dirac',
'nationality': 'British',
'sex': 'male',
'year': 1933},
{ 'category': 'Chemistry',
'name': 'Marie Curie',
'nationality': 'Polish',
'sex': 'female',
'year': 1911},
]
Das Schreiben des Wörterbuchs in die CSV-Datei mit Python ist wie folgt. Das erste Element des Arrays wird mit nobel_winners [0] .keys () abgerufen, um die Schlüssel des Wörterbuchs abzurufen. Verwenden Sie zum Sortieren der Schlüssel sortiert (Spalten) und weisen Sie Spalten zu. In dem Buch wurde es nach cols.sort () sortiert, aber da ein Fehler aufgetreten ist, wird es wie folgt geschrieben.
cols = nobel_winners[0].keys()
cols = sorted(cols)
with open('data/nobel_winners.csv', 'w') as f:
f.write(','.join(cols) + '\n')
for o in nobel_winners:
row = [str(o[col]) for col in cols]
f.write(','.join(row) + '\n')
Führen Sie Folgendes aus, um die exportierte Datei nobel_winners.csv zu lesen.
with open('data/nobel_winners.csv', 'r') as f:
for line in f.readlines():
print(line, sep='')
Out
category,name,nationality,sex,year
Physics,Albert Enistein,Swiss,male,1921
Physics,Paul Dirac,British,male,1933
Chemistry,Marie Curie,Polish,female,1911
Lesen und schreiben Sie anschließend mit dem CSV-Modul von Python. Wenn Sie newline = '' nicht für open angeben, wenn Sie es mit Jupyter Notebook ausführen Es gibt einen weiteren Zeilenumbruch unter writer.writerow, also habe ich ihn eingefügt.
import csv
with open('data/nobel_winners.csv', 'w', newline='') as f:
fieldnames = nobel_winners[0].keys()
fieldnames = sorted(fieldnames)
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader()
for w in nobel_winners:
writer.writerow(w)
Beim Lesen einer Datei mit dem CSV-Modul:
import csv
with open('data/nobel_winners.csv', 'r') as f:
reader = csv.reader(f)
for row in reader:
print(row, sep='')
Out
['category', 'name', 'nationality', 'sex', 'year']
['Physics', 'Albert Enistein', 'Swiss', 'male', '1921']
['Physics', 'Paul Dirac', 'British', 'male', '1933']
['Chemistry', 'Marie Curie', 'Polish', 'female', '1911']
Sie können CSV-Daten auch abrufen, indem Sie eine Zeile in ein Python-Wörterbuch konvertieren. Folgendes habe ich auf diese Weise erhalten.
import csv
with open('data/nobel_winners.csv') as f:
reader = csv.DictReader(f)
nobel_winners = list(reader)
for w in nobel_winners:
w['year'] = int(w['year'])
nobel_winners
Out
[OrderedDict([('category', 'Physics'),
('name', 'Albert Enistein'),
('nationality', 'Swiss'),
('sex', 'male'),
('year', 1921)]),
OrderedDict([('category', 'Physics'),
('name', 'Paul Dirac'),
('nationality', 'British'),
('sex', 'male'),
('year', 1933)]),
OrderedDict([('category', 'Chemistry'),
('name', 'Marie Curie'),
('nationality', 'Polish'),
('sex', 'female'),
('year', 1911)])]
Der CSV-Reader errät den Datentyp beim Lesen aus einer CSV-Datei nicht Da alles als Zeichenfolge behandelt wird, muss das Jahr in int umgewandelt werden.
Python-Wörterbücher können mit dem json-Modul in JSON-Dateien gespeichert werden. Verwenden Sie beim Speichern die Dump-Methode des JSON-Moduls.
import json
with open('data/nobel_winners.json', 'w') as f:
json.dump(nobel_winners, f)
Informationen zum Lesen von JSON-Dateien finden Sie im json-Modul Sie können dies mithilfe der Lademethode tun.
import json
with open('data/nobel_winners.json') as f:
nobel_winners = json.load(f)
nobel_winners
Out
[{'category': 'Physics',
'name': 'Albert Enistein',
'nationality': 'Swiss',
'sex': 'male',
'year': 1921},
{'category': 'Physics',
'name': 'Paul Dirac',
'nationality': 'British',
'sex': 'male',
'year': 1933},
{'category': 'Chemistry',
'name': 'Marie Curie',
'nationality': 'Polish',
'sex': 'female',
'year': 1911}]
Beim Laden des JSON-Moduls ist im Gegensatz zu CSV der ganzzahlige Jahrestyp Es ist kein Guss erforderlich, da es unter Beibehaltung geladen wird.
So codieren Sie Python-Daten mit dem Datum / Uhrzeit-Typ Erstellen Sie einen benutzerdefinierten Encoder wie den folgenden.
import datetime
import json
class JSONDateTimeEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, (datetime.date, datetime.datetime)):
return obj.isoformat()
else:
return json.JSONEncoder.default(self, obj)
def dumps(obj):
return json.dumps(obj, cls=JSONDateTimeEncoder)
now_str = dumps({'time': datetime.datetime.now()})
now_str
Out
'{"time": "2017-09-03T01:03:32.634095"}'
Zunächst ein angepasster Datumsverarbeitungscodierer Unterklasse JSONEncoder zum Erstellen. In diesem Prozess, wenn das übergebene Argument obj ein datetime-Objekt ist Es wird ausgeführt, um das Isoformat von Datum und Uhrzeit zurückzugeben. Legen Sie im Argument cls in der Methode json.dumps einen benutzerdefinierten Datumscodierer fest.
Recommended Posts