如何使用包含反斜杠的 json 的 .env 文件?

How to use .env file with a json containing a backslash?

背景,我有一个使用特定实例的 MSSQL 服务器数据库,因此连接 string/engine 到该数据库将如下所示:

引擎(mssql+pyodbc://User:Password@servername\instance,5555/database?driver=ODBC+Driver+17+for+SQL+Server)

注意服务器名和实例之间的单个反斜杠。

我的测试,同时作为字符串和 json 类型:

环境文件 1:

myvar = '[{"A":"123","B":"456", "C":"A\B"}]'
myvar2 = abc
myvar3 = [{"A":"123","B":"456", "C":"A\B"}]

main.py 文件:

from dotenv import load_dotenv
import os
import json

if __name__ == '__main__':
    load_dotenv('.env', override=True)
    myv2 = os.getenv('myvar2')
    myv = os.getenv('myvar')
    myv3 = os.getenv('myvar3')
    print(myv2)
    print(myv)
    print(myv3)
    print('Json Outputs')
    jmyv3 = json.loads(myv3)
    print(f"{jmyv3=}")
    jmyv = json.loads(myv)
    print(f"{jmyv=}")

为 .env 中的字符串变量和 .env 中的 json 变量生成错误 Invalid \escape

现在,让我们将 .env 文件修改为:

myvar = '[{"A":"123","B":"456", "C":"A\B"}]'
myvar2 = abc
myvar3 = [{"A":"123","B":"456", "C":"A\B"}]

json 变量 returns 但 returns 有两个反斜杠,而不是一个。

jmyv3=[{'A': '123', 'B': '456', 'C': 'A\B'}]

并且,字符串版本仍然会出现 Invalid \escape

错误

现在,为了笑,我在 .env 中添加了三个反斜杠

myvar = '[{"A":"123","B":"456", "C":"A\\B"}]'
myvar2 = abc
myvar3 = [{"A":"123","B":"456", "C":"A\\B"}]

这一次,字符串 returns 但带有两个反斜杠:

jmyv=[{'A': '123', 'B': '456', 'C': 'A\B'}]

并且,json 生成错误 Invalid \escape

有没有办法让 json 字符串的 'C' 部分只打印一个反斜杠? 像这样:

[{'A': '123', 'B': '456', 'C': 'A\B'}]

并且,这些变量使用 base64 编码存储在 Airflow 中,这会导致另一层带有反斜杠的不确定性。

很容易混淆字符串的内容和该字符串的表示之间的区别。请注意以下事项:

import json

myvar = '[{"A":"123","B":"456", "C":"A\\B"}]'
print(myvar)
jmyv3 = json.loads(myvar)
print(f"{jmyv3=}")
print(jmyv3[0]['C'])

输出:

[{"A":"123","B":"456", "C":"A\B"}]
jmyv3=[{'A': '123', 'B': '456', 'C': 'A\B'}]
A\B

好的,让我们分解一下发生了什么。第一:

myvar = '[{"A":"123","B":"456", "C":"A\\B"}]'

该字符串只包含两个反斜杠。我必须键入 4 才能使 Python 执行我想要的操作,但存储在 myvar 中的字符串只有两个反斜杠。您可以在输出中看到。

现在,我将该字符串加载为 JSON:

jmyv3 = json.loads(myvar)

字符串字面上有两个反斜杠,如果我们希望结果数据有一个反斜杠,这就是 JSON 所需要的。因此,当我打印那个值时,jmyv3[0]['C'],如您所见,该字符串只有一个反斜杠。

因此,您问题的答案取决于该文件是被解释为 JSON 还是被解释为 Python 代码。如果是 Python 代码,那么你需要 4 个反斜杠来产生 1 个反斜杠。

说了这么多,假设在 Windows 上,每个 Windows API 都会在它期望反斜杠的任何地方接受正斜杠,所以你可以跳过所有这些并使用正斜杠。