Предполагая, что:
- Ваш файл JSON является допустимым и использует UTF-8 в качестве кодировки.
- Ваш файл 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
.
Так что все работает как задумано.Это особенность, а не ошибка.