J'ai besoin de trouver si la clé contient un tiret, que d'obtenir cette clé et cette valeur dans le nouveau fichier json.

Voici mon code:

#coding=utf-8
import os
import sys
import json
import fileinput

file_path = sys.argv[1]
file = open(file_path, 'r')
content = file.read()

dict = json.loads(content, encoding="utf-8")

output = "{"

for key in dict:
    if key.find("-") != -1:
        output = output + "%s: %s" % (key, unicode(dict[key]).encode('utf8'))
        print output

output = output + "}"

output = json.dumps(json.loads(output, encoding="utf-8"), indent=4, separators=(', ',': '), ensure_ascii=False).encode('utf8')

file_name = os.path.basename(file_path)
sort_file = open(file_name, 'a')
sort_file.write(output)
sort_file.close()

Le fichier de sortie est une sorte de:

u'login': u".//input[@placeholder='Email/ \u624b\u6a5f\u865f\u78bc/ 

Est-il possible de convertir content_dict [clé] en caractère utf-8 pas comme "\ u78bc"? et avoir un bon moyen de trouver la clé contient du caractère et d'écrire dans un nouveau fichier json?

1
HellenAnell 16 mars 2019 à 10:54

2 réponses

Meilleure réponse

Vous utilisez Python 2 et souhaitez pouvoir lire et écrire des fichiers json contenant des caractères non ascii.

La façon la plus simple de le faire est d'effectuer votre traitement avec Unicode uniquement, d'effectuer des E / S de fichiers en mode binaire et de convertir les octets bruts en json après décodage en unicode lors de la lecture, et d'encoder json en octets avant d'écrire dans le fichier.

Le code devrait ressembler à ceci:

  file_path = sys.argv[1]
  # Read data as bytes
  with open(file_path, 'rb') as f:
      raw_data = f.read()
      # Decode bytes to unicode, then convert from json.
      dict_ = json.loads(raw_data.decode('utf-8'))

  output = {}

  for key, value in dict_.iteritems():
      # Using the in operator is the Pythonic way to check 
      # if a character is in a string.
      if "-" in key: 
          output[key] = value
          print output

  file_name = os.path.basename(file_path)
  with open(file_name, 'ab') as f:
      j = json.dumps(output, indent=4, separators=(', ', ': '), ensure_ascii=False)
      # Encode json unicode string before writing to file.
      f.write(j.encode('utf-8'))

Dans ce code, j'ai utilisé l'instruction with pour gérer la fermeture automatique des fichiers ouverts.

J'ai également collecté les données à écrire dans un dictionnaire plutôt que dans une chaîne. La création manuelle de chaînes json peut souvent être à l'origine d'erreurs.

Le passage à Python 3 supprimerait le besoin d'étapes de codage et de conversion distinctes et simplifierait généralement la gestion des données non ascii.

0
snakecharmerb 16 mars 2019 à 10:18

Un moyen pythonique (testé avec python 2.7) pour filtrer le dict original est:

d1 = {'x-y': 3, 'ft': 9, 't-b': 7}
d2 = {k: v for k, v in d1.iteritems() if '-' in k}

print(d2)

Production

{'t-b': 7, 'x-y': 3}

0
balderman 16 mars 2019 à 09:55