Python:加载dotenv中JSON变量时如何转义反斜杠?
解决.env中JSON变量的反斜杠解析错误
核心问题根源
.env文件里的"my\user"会被dotenv默认解析转义序列,\u会被当作Unicode转义尝试;同时JSON本身要求字符串内的反斜杠必须用\\表示,双重转义冲突导致解析失败。
方案一:修改.env文件并调整dotenv加载参数
方法1:关闭dotenv的转义解析
加载.env时添加escape=False参数,让dotenv原样保留所有字符:
import json from os import environ as env from dotenv import load_dotenv # 关闭转义解析,保留.env中的原始字符 load_dotenv(escape=False) class DatabaseUtils: @staticmethod def get_data_from_db(connection: DBConnection, script_path, query): selected_connection = json.loads(env[connection.value].replace('\n', '')) user = selected_connection["user"] # 正确获取到"my\user"
对应的.env文件中,用户字段只需写单个反斜杠:
my_env_variable = '{"ip": "xx.xx.xxx.xxx", "user": "my\user", "password": "password"}'
方法2:在.env中转义反斜杠(不修改Python代码)
如果不想改动加载逻辑,就在.env里把反斜杠写成四个连续反斜杠,dotenv解析后会自动转为两个反斜杠,符合JSON的转义要求:
my_env_variable = '{"ip": "xx.xx.xxx.xxx", "user": "my\\\\user", "password": "password"}'
Python代码无需修改,直接解析就能得到正确的my\user。
方案二:Python读取后预处理字符串
如果无法修改.env文件,可在解析JSON前,把字符串里的单个反斜杠替换为两个(注意避开JSON本身的转义引号\"):
import json from os import environ as env from dotenv import load_dotenv load_dotenv() class DatabaseUtils: @staticmethod def get_data_from_db(connection: DBConnection, script_path, query): raw_str = env[connection.value].replace('\n', '') # 替换未转义的单个反斜杠,保留JSON转义引号的格式 processed_str = raw_str.replace('\\', '\\\\').replace('\\"', '\\"') selected_connection = json.loads(processed_str) user = selected_connection["user"]
这种方法适合无法修改.env的场景,但要注意可能存在的边缘字符冲突。
内容的提问来源于stack exchange,提问作者M András
相关产品推荐
相关产品推荐

