[Python3] Lecture et écriture avec isoformat datetime avec json

Les données de type dictionnaire sont souvent échangées avec json avec python, mais la valeur du dictionnaire est conservée par datetime, et lors de la création d'une chaîne de caractères ou d'un fichier, `" YYYY-MM-DD HH-MN-SS " Notez comment le gérer avec la chaîne ``.

chaîne datetime <->

Vous pouvez en faire une chaîne avec la fonction isoformat datetime. Je laisserai le séparateur vide.

In [1]: from datetime import datetime

In [2]: t1 = datetime.now()

In [3]: t1.isoformat()
Out[3]: '2020-05-08T22:16:39.287433'

In [4]: t1.isoformat(" ")
Out[4]: '2020-05-08 22:16:39.287433'

Vous pouvez également utiliser plus de strftime.

In [5]: t1.strftime("%Y/%m/%d %H:%M:%S.%f")
Out[5]: '2020/05/08 22:16:39.287433'

Inversement, utilisez stfptime pour convertir une chaîne en datetime.

In [6]: t2 = datetime.strptime("2020-01-02 20:03:12.345678", "%Y-%m-%d %H:%M:%S.%f")

In [7]: t2
Out[7]: datetime.datetime(2020, 1, 2, 20, 3, 12, 345678)

Faire du dictionnaire une chaîne (json)

J'utilise json.dump et json.dumps, mais pour le moment, je peux définir une fonction par défaut en tant qu'argument et convertir datetime en la chaîne souhaitée dans cette fonction. Ci-dessous, à partir de "JSON Encoder and Decoder":

Si vous spécifiez> default, spécifiez une fonction, et cette fonction sera appelée pour les objets qui ne peuvent pas être sérialisés autrement. La fonction doit renvoyer l'objet dans une version codée JSON ou déclencher une TypeError. S'il n'est pas spécifié, TypeError sera levé.

Il semble correct de récupérer TypeError.

import json
from datetime import datetime, date

def default(o):
    if hasattr(o, "isoformat"):
        return o.isoformat()
    else:
        return str(o)

#Créer un dictionnaire et définir l'heure actuelle comme valeur.
dict1 = {"time1": datetime.now(), "time2": datetime.now()}
print( "dict1={}".format(dict1))
print( "str(dict1)={}".format(str(dict1)) )
#Exporter le dictionnaire
s_dict1 = json.dumps(dict1, default=default)
print( "s_dict1={}".format(s_dict1) )

Le résultat de l'exécution est le suivant.

dict1={'time1': datetime.datetime(2020, 5, 8, 22, 57, 18, 564149), 'time2': datetime.datetime(2020, 5, 8, 22, 57, 18, 564163)}
str(dict1)={'time1': datetime.datetime(2020, 5, 8, 22, 57, 18, 564149), 'time2': datetime.datetime(2020, 5, 8, 22, 57, 18, 564163)}
s_dict1={"time1": "2020-05-08 22:57:18.564149", "time2": "2020-05-08 22:57:18.564163"}

C'est une chaîne de caractères correctement. Dans l'implémentation de la fonction par défaut, isoformat est vérifié pour voir s'il s'agit de hasattr```. == Vous pouvez également utiliser "datetime" `et ainsi de suite.

Dictionnaire de string (json)

Utilisez json.load pour lire. Ici, des lectures personnalisées peuvent être définies avec object_hook.

object_hook est une fonction facultative qui est appelée sur le résultat (dict) de tout objet littéral en cours de décodage. La valeur de retour de object_hook est utilisée à la place de dict. Cette fonctionnalité peut être utilisée pour implémenter votre propre décodeur (par exemple, l'indication de classe JSON-RPC).

def object_hook(obj):
    new_dic = dict()
    for o in obj:
        try:
            new_dic[str(o)] = datetime.strptime(obj[o], '%Y-%m-%d %H:%M:%S.%f')
        except TypeError:
            new_dic[str(o)] = obj[o]
            pass
    return new_dic


s_dic = """{"time1": "2020-05-08 22:57:18.564149", "time2": "2020-05-08 22:57:18.564163"}"""
print( "s_dic={}".format(s_dic) )
dic = json.loads(s_dic, object_hook=object_hook)
print( "dic={}".format(dic) )

Le résultat de l'exécution est le suivant.

s_dic={"time1": "2020-05-08 22:57:18.564149", "time2": "2020-05-08 22:57:18.564163"}
dic={'time1': datetime.datetime(2020, 5, 8, 22, 57, 18, 564149), 'time2': datetime.datetime(2020, 5, 8, 22, 57, 18, 564163)}

C'est correctement datetime.datetime.

Autre

Maintenant que j'ai l'implémentation souhaitée, j'ai survécu à la journée.

--Il montre également comment implémenter default dans une classe qui hérite de json.JSONEncoder et spécifier cette classe dans l'argument cls de dumps. Qu'est-ce qui est le plus pratique? J'utilise datetime presque tout le temps, mais c'est un peu ennuyeux de l'implémenter à chaque fois. Y a-t-il un bon moyen?

(2020/05/08)

Remarques

――Après ça, qu'en est-il de ça? Ce qui était chargé par float64 est maintenant str. J'étais en difficulté. (12/05/2020)

Recommended Posts

[Python3] Lecture et écriture avec isoformat datetime avec json
Lire et écrire des fichiers JSON avec Python
Lire JSON avec Python et générer un CSV
Lire des données json avec python
Lire et écrire des fichiers avec Slackbot ~ Développement de bot avec Python ~
Lire le fichier json avec Python, le formater et générer le json
Encodage et décodage JSON avec python
Lire et écrire des fichiers csv avec numpy
Lire et écrire des fichiers JSON avec Python
[Python] Utiliser JSON avec Python
Extraire "date actuelle uniquement" et "date et heure actuelles" avec python datetime.
Lisez et analysez l'ensemble de données au format arff avec python scipy.io
Analyser et visualiser JSON (application Web ⑤ avec Python + Flask)
Lire et écrire en virgule flottante simple précision en Python
Lire et écrire des balises NFC avec python en utilisant PaSoRi
datetime et écriture et sauvegarde de fichiers
Programmation avec Python et Tkinter
Lire et écrire un fichier csv
Chiffrement et déchiffrement avec Python
Lire csv avec des pandas python
Python et matériel - Utilisation de RS232C avec Python -
POST json avec le script Python 3
Lire et écrire des fichiers
À propos de la date et du fuseau horaire Python
Écrivons python avec cinema4d.
Écrire et lire des fichiers
Écrire en csv avec Python
python avec pyenv et venv
Formater json avec Vim (avec python)
Fonctionne avec Python et R
[Python] Lisez le fichier csv et affichez la figure avec matplotlib
[Python] Utilisez ceci pour lire et écrire des fichiers wav [wavio]
Exemple d'analyse HTTP GET et JSON avec Pepper Python
Communiquez avec FX-5204PS avec Python et PyUSB
Briller la vie avec Python et OpenCV
Robot fonctionnant avec Arduino et python
Installez Python 2.7.9 et Python 3.4.x avec pip.
Réseau neuronal avec OpenCV 3 et Python 3
Modulation et démodulation AM avec python
Scraping avec Node, Ruby et Python
Ecrire un schéma JSON avec Python DSL
[Python] Ecrire dans un fichier csv avec Python
Grattage avec Python, Selenium et Chromedriver
Grattage avec Python et belle soupe
Lire et utiliser des fichiers Python à partir de Python
[GUI en Python] PyQt5-Glisser-déposer-
Lire et écrire NetCDF avec Python
J'ai joué avec PyQt5 et Python3
Lire des fichiers en parallèle avec Python
Journalisation Python et vidage vers json
Lire et écrire du CSV avec Python
Intégration multiple avec Python et Sympy
Charger fbx depuis python avec cinema4d
Coexistence de Python2 et 3 avec CircleCI (1.0)
Ecrire un script batch avec Python3.5 ~
Jeu Sugoroku et jeu d'addition avec Python
Modulation et démodulation FM avec Python
Créer et lire des paquets de messages en Python