从json转义单反斜杠和双反斜杠

2024-03-29 02:21:12 发布

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

我试图读取一个用json字符串编码的windows路径。 这条路有点像

\\sys\tld\a\b\c

以下工作:

import json
json.loads('{"mypath" : "\\\\b\\\\a" }')

[Out] {'mypath': '\\b\\a'}.

但是,我的路径在a之前没有双反斜杠

以下不起作用(分别为2和3个反斜杠):

json.loads('{"mypath" : "\\\\b\\a" }')
JSONDecodeError: Invalid \escape: line 1 column 17 (char 16)


json.loads('{"mypath" : "\\\\b\\\a" }')
JSONDecodeError: Invalid \escape: line 1 column 17 (char 16)


json.loads('{"mypath" : r"\b\a" }')
JSONDecodeError: Expecting value: line 1 column 13 (char 12)

我应该如何对路径(\sys\tld\a\b\c)进行编码,以便从json文本文件中正确读取?你知道吗


Tags: 字符串路径json编码syslinecolumntld
1条回答
网友
1楼 · 发布于 2024-03-29 02:21:12

问题是,在JSON字符串文本中,必须转义反斜杠才能生成文本\。但是,接下来需要对Python字符串文本中的所有反斜杠进行转义,以创建正确的JSON字符串值。你知道吗

>>> json.dumps("\\")  # A string consisting of a single backslash
'"\\\\"'

在您的确切情况下,路径的正确编码版本将是

>>> json.dumps({'mypath': r'\\sys\tld\a\b\c'})
'{"mypath": "\\\\\\\\sys\\\\tld\\\\a\\\\b\\\\c"}'

这看起来像很多反斜杠,但是大多数反斜杠都是为了显示而由str.__repr__添加的,而不是实际值的一部分。你知道吗

>>> print(json.dumps({'mypath': r'\\sys\tld\a\b\c'}))
{"mypath": "\\\\sys\\tld\\a\\b\\c"}

原始路径中的每个反斜杠对应于JSON编码字符串中的两个反斜杠。你知道吗


使用原始字符串文字可以避免在文字中再次转义每个反斜杠:

>>> '\\\\sys\\tld\\a\\b\\c'
'\\\\sys\\tld\\a\\b\\c'
>>> r'\\sys\tld\a\b\c'
'\\\\sys\\tld\\a\\b\\c'

但是,原始字符串文本不能以反斜杠结束,这意味着您必须至少依赖字符串文本连接才能将反斜杠附加到原始字符串文本。你知道吗

>>> '\\foo\\'
'\\foo\\'
>>> r'\foo''\\'
'\\foo\\'

不过,最终最简单的方法是完全避免使用Windows风格的文件路径。至少,像open这样的Python内置函数能够正确解析POSIX样式的路径,即使在Windows上也是如此。你知道吗

# Open \\sys\tld\a\b\c
with open('//sys/tld/a/b/c') as f:
    ...

相关问题 更多 >