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
``.
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)
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.
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.
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)
――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