Comment faire pour supprimer les espaces et retours à la ligne à partir de chaque valeur dans un fichier JSON?
J'ai un JSON
fichier a la structure suivante:
{
"name":[
{
"someKey": "\n\n some Value "
},
{
"someKey": "another value "
}
],
"anotherName":[
{
"anArray": [
{
"key": " value\n\n",
"anotherKey": " value"
},
{
"key": " value\n",
"anotherKey": "value"
}
]
}
]
}
Maintenant, je veux strip
hors tension tous les il a espaces et retours à la ligne pour chaque valeur du JSON
fichier. Est-il possible de faire une itération sur chaque élément du dictionnaire et de la imbriqués les dictionnaires et les listes?
OriginalL'auteur John West | 2013-06-13
Vous devez vous connecter pour publier un commentaire.
À l'aide de
pkgutil.simplegeneric()
pour créer une fonction d'assistanceget_items()
:Remarque:
functools.singledispatch()
fonction (Python 3.4+) permettrait d'utiliser lecollections
'MutableMapping/MutableSequence
au lieu dedict/list
ici.Sortie
OriginalL'auteur
Analyser le fichier à l'aide de JSON:
puis à pied à travers les données résultant de la structure.
Vous pouvez personnaliser le "nettoyage" de la ligne au besoin. Ma version de Python nettoyé l'espace blanc à l'amende juste. Vous pouvez nettoyer les valeurs que vous marchez par le biais de 'données'.
OriginalL'auteur
Cela peut ne pas être le processus le plus efficace, mais il fonctionne. J'ai copié cet échantillon dans un fichier nommé
json.txt
, puis de le lire, désérialisé avecjson.loads()
, et utilisé une paire de fonctions récursive de la nettoyer et de tout ce qu'il renferme.Le résultat...
eval()
json texte. Vous pouvez utiliserjson.loads()
au lieuMerci pour l'astuce! Mise à jour du code et des commentaires en conséquence.
Vous avez sans doute aussi voulez bande de valeurs dans une liste (
else
clause est manquant dansclean_list()
)."".join(f.readlines())
doit être justef.read()
ou vous pouvez passer d'un objet fichier directementjson.load(f)
.value.replace("\\n", "")
est incorrect: "\n" saut de ligne "\\n" - deux caractères; de toute façon.strip()
supprime tous les avant/après les espaces, y compris les retours à la ligne. La copied.items()
etl[:]
semble inutile.Merci pour les conseils supplémentaires. J'ai mis à jour de nouveau le code. FWIW, j'ai d'abord eu un
else
clauseclean_list()
pour le nettoyage des différents éléments de liste, mais comme l'échantillon de données JSON n'ai pas l'utiliser, je l'ai pris avant de poster ma réponse originale à cette question.+1: il semble ok maintenant. Remarque:
l[index] == item
afin que vous pouvez utiliseritem
comme rvalue au lieu del[index]
. Pour fermer automatiquement un fichier, vous pouvez utiliserwith open(filename) as file: ...
il va fermer le fichier, même si une exception se produit.OriginalL'auteur