Ключ поиска Json содержит некоторый символ и записывает ключ и значение в новый файл json с помощью python

#python #json #dictionary #utf-8 #python-2.x

#python #json #словарь #utf-8 #python-2.x

Вопрос:

Мне нужно найти, содержит ли ключ тире, чем нужно получить этот ключ и значение в новый файл json.

это мой код:

 #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()
  

выходной файл представляет собой что-то вроде:

 u'login': u".//input[@placeholder='Email/ u624bu6a5fu865fu78bc/ 
  

Есть ли какой-либо способ преобразовать content_dict [key] в символ utf-8, не похожий на » u78bc»?
и есть какой-нибудь хороший способ найти ключ, содержащий некоторый символ, и записать в новый файл json?

Ответ №1:

Вы используете Python 2 и хотите иметь возможность читать и записывать файлы json, содержащие символы, отличные от ascii.

Самый простой способ сделать это — выполнить обработку только в юникоде, выполнив ввод-вывод файла в двоичном режиме и преобразовав необработанные байты в json после декодирования в юникод при чтении и кодирования json в байты перед записью в файл.

Код должен выглядеть примерно так:

   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'))
  

В этом коде я использовал оператор with для автоматического закрытия открытых файлов.

Я также собрал данные для записи в словарь, а не в строку. Создание строк json вручную часто может быть причиной ошибок.

Переключение на Python 3 устранило бы необходимость в отдельных шагах кодирования и преобразования и в целом упростило бы обработку данных, отличных от ascii.

Ответ №2:

Способ pythonic (протестирован с python 2.7) для фильтрации исходного dict является:

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

print(d2)
  

Вывод

{‘t-b’: 7, ‘x-y’: 3}