如何使用包含反斜杠的 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 都会在它期望反斜杠的任何地方接受正斜杠,所以你可以跳过所有这些并使用正斜杠。
背景,我有一个使用特定实例的 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 都会在它期望反斜杠的任何地方接受正斜杠,所以你可以跳过所有这些并使用正斜杠。