Библиотека json интерпретирует символы пробела как "\ xa0" - PullRequest
0 голосов
/ 28 января 2019

Когда я загружаю json-файл в python, нет проблем с кодировками, если файл обрабатывается как строка.Однако при загрузке файла в формате json с использованием json.load в файле или json.loads в строке все символы пробела выглядят как "\ xa0"

Следующий код дает нормальные результаты, печатая json-строка без каких-либо прикольных знаков "\ xa0".

with open(json_path) as f:
    lines = f.readlines()
    for line in lines:
        print(line)

Загрузка файла в формате json, и внезапно пробелы интерпретируются как "\ xa0".

with open(json_path) as f:
    data = json.load(f)
    print(data.keys())

дает следующее:

dict_keys (['1. \ xa0 \ lorem \ xa0ipsum', '2. \ xa0 \ lorem \ xa0ipsum \ xa0 \ lorem \xa0ipsum ',' 3. \ xa0 \ lorem ',' 4. \ xa0 \ lorem \ xa0ipsum ',' 5. \ xa0 \ lorem \ xa0ipsum '])

Загрузка строки вместофайл с использованием json.loads дает те же результаты:

with open(json_path) as f:
    lines = f.read()

data = json.loads(s)
print(data.keys())

Я создаю pdf-парсер, используя java и pdf-box.Разбор структуры заголовка в мое собственное JSON-дерево.Я попытался преобразовать json-файл в Hashmap в java, который работает нормально, поэтому в самом json-файле нет ничего странного.Это специфическая для Python проблема и есть ли какое-то объяснение?

1 Ответ

0 голосов
/ 31 января 2019

Предполагая, что:

  1. Ваш файл JSON является допустимым и использует UTF-8 в качестве кодировки.
  2. Ваш файл JSON содержит ключи с неразрывными пробелами.

Тогда вывод, который вы получаете, совершенно корректен.

Первый фрагмент кода читает и печатает строки:

with open(json_path) as f:
    lines = f.readlines()
    for line in lines:
        print(line)

Когда вы печатаете строку, он выводится более или менее без изменений, а неразрывные пробелы выглядят так же, как и обычные пробелы.

Второй фрагмент кода анализирует файл JSON, создавая словарь, а затем печатает ключи словаря.Для простоты объяснения предположим, что печатается сам словарь (вместо ключей):

with open(json_path) as f:
    data = json.load(f)
    print(data)

Вызов print со словарем в качестве аргумента вызывает функцию __str__толковый словарь.Функция __str__ использует свои собственные правила форматирования вывода, например, заключает словарь в фигурные скобки, добавляет одинарные кавычки и т. Д.

Если вы изучите вывод, вы можете обнаружить, что печать словаря создаетдопустимый код Python для словаря .

В строках Python определенные символы должны быть экранированы.И escape-последовательность начинается с обратной косой черты.Типичным примером будет символ новой строки:

d = {'line1\nline2': 3}
print(d)

Вывод:

{'line1\nline2': 3}

Часть логики __str__ словаря, очевидно, также должна избегать неразрывных пробелов, поскольку в противном случае они не могут бытьвизуально отличается от обычного пространства (хотя это не является строго обязательным).И правильный способ избежать этого в Python - это \a0.

Так что все работает как задумано.Это особенность, а не ошибка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...