json库将空格字符解释为“\xa0”

2024-04-27 04:21:40 发布

您现在位置:Python中文网/ 问答频道 /正文

当我将一个json文件加载到python中时,只要将该文件视为字符串,编码就没有问题。但是,使用json.load文件文件或json.loads在字符串中,所有空格字符都显示为“\xa0”

下面的代码生成正常的结果,打印json字符串时没有任何奇怪的“\xa0”符号。在

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

将文件加载为json格式,突然间空格字符被解释为“\xa0”。在

^{pr2}$

给出以下内容:

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解析器。将标题结构解析到我自己的json树中。我尝试过将json文件转换成java中的Hashmap,它工作得很好,因此json文件本身似乎没有任何奇怪之处。python有什么特别的解释吗?在


Tags: 文件path字符串jsonaswithlineopen
1条回答
网友
1楼 · 发布于 2024-04-27 04:21:40

假设:

  1. 您的JSON文件是有效的,并且使用UTF-8作为编码。在
  2. 您的JSON文件包含带有不间断空格的键。在

那么你得到的输出是完全正确的。在

第一段代码读取并打印字符串:

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

当您打印一个字符串时,它的输出或多或少是不变的,并且非中断空格看起来与常规空格相同。在

第二段代码解析JSON文件,从而创建字典,然后打印字典键。为了便于解释,假设字典本身是打印的(而不是键):

^{pr2}$

以dictionary作为参数调用print将调用字典的__str__函数。__str__函数使用它自己的规则来格式化输出,例如,它将字典括在大括号中,添加单引号等

如果研究输出,您可能会发现打印字典会为字典创建有效的Python代码。在

在Python字符串中,某些字符需要转义。转义序列以反斜杠开头。一个典型的例子是换行符:

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

输出:

{'line1\nline2': 3}

显然,__str__字典逻辑的一部分是也要转义非中断空格,因为它们无法从视觉上与常规空间区分开来(即使这不是严格必要的)。在Python中,正确的转义方法是\a0。在

所以一切都按计划进行。这是一个特性,不是一个bug。在

相关问题 更多 >