#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}