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

我正在尝试读取以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)

我应该如何编码要从json文本文件中正确读取的路径(\ sys \ tld \ a \ b \ c)?

flossyeye2 回答:从json转义单反斜杠和双反斜杠

问题在于,在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'

但是,原始字符串文字不能以反斜杠 end 结束,这意味着您至少必须依靠字符串文字串联将反斜杠附加到原始字符串文字。

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

但是,最后,完全避免Windows样式的文件路径是最简单的。至少open这样的Python内置函数即使在Windows上也可以正确解析POSIX样式的路径。

# Open \\sys\tld\a\b\c
with open('//sys/tld/a/b/c') as f:
    ...
本文链接:https://www.f2er.com/3036045.html

大家都在问