python - json 库将空格字符解释为 "\xa0"
问题描述
当我将 json 文件加载到 python 中时,只要将文件视为字符串,编码就没有问题。但是,使用文件上的 json.load 或字符串上的 json.loads 将文件加载为 json 格式,所有空格字符都会显示为“\xa0”
以下代码产生正常结果,打印没有任何时髦的“\xa0”符号的 json 字符串。
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())
我正在使用 java 和 pdf-box 构建一个 pdf-parser。将标题结构解析为我自己的 json-tree。我尝试将 json 文件转换为 java 中的 Hashmap,效果很好,因此 json 文件本身似乎没有任何奇怪之处。这是一个特定于python的问题吗?有什么解释吗?
解决方案
假如说:
- 您的 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 字符串中,某些字符需要转义。转义序列以反斜杠开头。一个典型的例子是换行符:
d = {'line1\nline2': 3}
print(d)
输出:
{'line1\nline2': 3}
字典逻辑的一部分__str__
显然也是要转义不间断空格,因为否则它们无法在视觉上与常规空格区分开来(即使这不是绝对必要的)。在 Python 中转义它的正确方法是\a0
.
所以一切都按设计工作。这是一个功能,而不是一个错误。
推荐阅读
- python - Bokeh 使用 Column Data Source 和 Box_Select
- raku - 将包转换为 perl6
- php - linux ubuntu 18.04 灯 php 和 python cgi
- python - 如何使用 Opencv 捕获帧
- jquery - JQuery获取最接近元素的div
- html-table - 如果表格单元格太长而无法在不缩放的情况下放入 100% 宽度的表格中,则水平滚动表格单元格
- google-analytics - 将自定义指标和维度注入 Product 对象
- html - 当 td-tag 悬停时,我想更改 th-tag 的颜色
- python - Python3.7如何从列表中提取数值
- python - 无法观看列表“矩阵”