簡體   English   中英

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

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

背景,我有一個使用特定實例的 MSSQL 服務器數據庫,因此到該數據庫的連接字符串/引擎如下所示:

引擎(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=}")

為字符串變量 in.env 和 json 變量 in.env 生成錯誤 Invalid \escape

現在,讓我們將 .env 文件修改為:

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

json 變量返回但返回兩個反斜杠而不是一個。

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"}]

這一次,字符串返回但帶有兩個反斜杠:

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

並且,json 生成錯誤 Invalid \escape

有沒有辦法讓 json 字符串的“C”部分只打印一個反斜杠? 像這樣:

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

並且,這些變量存儲在 Airflow 中,編碼為 base64,這會導致另一層帶有反斜杠的不確定性。

很容易混淆字符串的內容和該字符串的表示之間的區別。 請注意以下事項:

import json

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

Output:

[{"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中的字符串只有兩個反斜杠。 您可以在 output 中看到。

現在,我將該字符串加載為 JSON:

jmyv3 = json.loads(myvar)

該字符串字面上有兩個反斜杠,如果我們希望結果數據有一個反斜杠,這就是 JSON 所需要的。 因此,當我打印那個值jmyv3[0]['C']時,如您所見,該字符串只有一個反斜杠。

因此,您問題的答案取決於該文件是被解釋為 JSON 還是被解釋為 Python 代碼。 如果是 Python 代碼,則需要 4 個反斜杠才能產生 1 個反斜杠。

說了這么多,假設它在 Windows 上,每個 Windows API 都會在它期望反斜杠的任何地方接受正斜杠,所以你可以跳過所有這些並使用正斜杠。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM