Dans le livre d'O'Reilly "Data Visualization Beginning with Python and JavaScript" Notez que les bonnes méthodes d'entrée / sortie pour les fichiers csv et json en python ont été organisées. Lorsque j'ai vérifié le fonctionnement avec Jupyter Notebook, il y avait des endroits où une erreur s'est produite, donc Il y a quelques différences avec le code du livre.
Site officiel du livre: 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
Utilisez ce qui suit pour les données d'entrée / sortie
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},
]
L'écriture du dictionnaire dans le fichier csv avec python est la suivante. Le premier élément du tableau est récupéré avec nobel_winners [0] .keys () pour obtenir les clés du dictionnaire. Pour trier les clés, utilisez triés (cols) et attribuez-les à cols. Dans le livre, il a été trié par cols.sort (), mais comme une erreur s'est produite, il est écrit comme suit.
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')
Pour lire le fichier nobel_winners.csv exporté, exécutez ce qui suit.
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
Ensuite, lisez et écrivez à l'aide du module csv de python. Si vous ne spécifiez pas newline = '' pour open, lorsque vous l'exécutez avec Jupyter Notebook Il y a un autre saut de ligne sous writer.writerow, alors je l'ai mis.
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)
Lors de la lecture d'un fichier à l'aide du module csv:
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']
Vous pouvez également obtenir des données csv en convertissant une ligne en dictionnaire Python. Voici ce que j'ai obtenu de cette façon.
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)])]
Le lecteur csv ne devine pas le type de données lors de la lecture à partir d'un fichier csv Puisque tout est traité comme une chaîne, year doit être transtypé en int.
Les dictionnaires Python peuvent être enregistrés dans des fichiers JSON à l'aide du module json. Lors de l'enregistrement, utilisez la méthode dump du module json.
import json
with open('data/nobel_winners.json', 'w') as f:
json.dump(nobel_winners, f)
Pour lire les fichiers JSON, consultez le module json Vous pouvez le faire en utilisant la méthode de chargement.
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}]
Lors du chargement du module json, contrairement à csv, le type entier d'année est Aucun casting n'est requis car il sera chargé tout en étant conservé.
Pour encoder des données Python contenant un type datetime Créez un encodeur personnalisé comme celui ci-dessous.
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"}'
Tout d'abord, un encodeur de traitement de date personnalisé Sous-classez le JSONEncoder à créer. Dans ce processus, si l'argument passé obj est un objet datetime Il est en cours d'exécution pour renvoyer l'isoformat de la date et de l'heure. Définissez un encodeur de date personnalisé dans l'argument cls de la méthode json.dumps.
Recommended Posts