本文目录导读:

- 四种常见配置文件格式对比
- Python 脚本示例(最常用)
- Bash/Shell 脚本示例(Linux/Mac)
- Windows 批处理脚本(.bat / .cmd)
- PowerShell 脚本(Windows / Linux/Mac)
- 关键注意事项
- 总结建议
这是一个非常核心的问题,答案取决于你使用的编程语言和配置文件格式,下面我会从最通用的方法开始介绍,并分语言给出示例。
我会假设配置文件是常见的文本格式,.ini、.json、.yaml、.env 或简单的 .txt,脚本运行在 Windows/Linux/macOS 上。
特别注意: 对于 .ini 和 .yaml 格式,Python 标准库自带了 configparser 和 json,但 yaml 格式需要第三方库 PyYAML。
四种常见配置文件格式对比
| 格式 | 优点 | 缺点 | 典型场景 |
|---|---|---|---|
| JSON | 语法严格,跨语言通用,结构清晰 | 不支持注释,手动编辑容易出错 | Web 应用,API 配置 |
| YAML | 支持注释,可读性极好,支持复杂结构 | 依赖缩进,容易出错,配置较复杂 | 大型项目(如 Docker, K8s, Ansible) |
| INI | 非常简单,兼容老系统,Python 内置库支持 | 只能表示两级结构(节+键值) | 老旧软件,简单小工具 |
| ENV | 极简单,仅键值对,常与系统环境变量结合 | 无结构,无类型(全是字符串) | Docker,敏感信息(密码),临时参数 |
Python 脚本示例(最常用)
Python 因其强大的标准库,处理配置文件非常方便。
读写 JSON 文件
import json
# 假设配置文件是 config.json
CONFIG_FILE = "config.json"
# 1. 读取配置文件
def read_config():
try:
with open(CONFIG_FILE, 'r', encoding='utf-8') as f:
return json.load(f)
except FileNotFoundError:
print("配置文件不存在,使用默认配置")
return {"debug": False, "port": 8080, "lang": "zh"}
except json.JSONDecodeError:
print("配置文件格式错误")
return None
# 2. 写入配置文件
def write_config(data):
with open(CONFIG_FILE, 'w', encoding='utf-8') as f:
json.dump(data, f, indent=4, ensure_ascii=False) # indent=4 美化输出,ensure_ascii=False 保留中文
print("配置已保存")
# 使用示例
config = read_config()
if config:
print(f"当前端口: {config['port']}")
# 修改配置
config['port'] = 9000
config['name'] = "我的应用" # 自动添加新字段
write_config(config)
读写 YAML 文件(需安装 pyyaml)
pip install pyyaml
import yaml
CONFIG_FILE = "config.yaml"
def read_config():
with open(CONFIG_FILE, 'r', encoding='utf-8') as f:
return yaml.safe_load(f) # safe_load 更安全
def write_config(data):
with open(CONFIG_FILE, 'w', encoding='utf-8') as f:
yaml.dump(data, f, default_flow_style=False, indent=2, allow_unicode=True)
# 使用示例
config = read_config()
print(config.get('database', {}).get('host', 'localhost'))
config['database']['password'] = 'newpassword' # 修改
write_config(config)
读写 INI 文件(标准库 configparser)
import configparser
CONFIG_FILE = "config.ini"
# 1. 读取
config = configparser.ConfigParser()
config.read(CONFIG_FILE, encoding='utf-8')
# 获取值(带默认值)
debug = config.getboolean('DEFAULT', 'debug', fallback=False)
port = config.getint('DEFAULT', 'port', fallback=8080)
# 2. 写入
config['DEFAULT'] = {
'debug': True,
'port': '3000', # 注意:configparser 所有值都是字符串
'lang': 'en'
}
# 添加新的节(Section)
config['User'] = {'name': 'admin', 'email': 'admin@example.com'}
with open(CONFIG_FILE, 'w', encoding='utf-8') as f:
config.write(f)
读写 .env 文件(配合 dotenv)
pip install python-dotenv
from dotenv import load_dotenv, set_key
import os
# 1. 读取 .env 文件
load_dotenv(".env") # 加载到环境变量
db_host = os.getenv("DB_HOST", "localhost")
db_port = int(os.getenv("DB_PORT", "5432"))
# 2. 写入 .env 文件
set_key(".env", "DB_HOST", "new_host.example.com") # 如果存在则覆盖,不存在则新增
set_key(".env", "NEW_KEY", "new_value")
Bash/Shell 脚本示例(Linux/Mac)
对于 Linux/Mac,Shell 脚本是最轻量级的方法,通常用 .conf 或 .env 格式。
读取和设置配置文件(键值对格式)
假设文件 config.txt 内容如下:
APP_NAME=MyApp
DB_PASS=secret
PORT=8080
#!/bin/bash
# 读取配置文件
# 方法一:直接用 source 命令(文件必须是有效的 shell 语法)
source ./config.txt
echo "应用名: $APP_NAME"
echo "数据库密码: $DB_PASS"
# 方法二:手动解析(更安全,不会执行任意代码)
while IFS='=' read -r key value; do
# 跳过空行和注释
if [[ -z "$key" || "$key" =~ ^\s*# ]]; then
continue
fi
# 去除首尾空格
key=$(echo "$key" | xargs)
value=$(echo "$value" | xargs)
declare "$key=$value"
done < config.txt
# 写入配置文件
# 使用 sed 命令修改(需要在 Mac 和 Linux 上兼容,参数有差异)
if [[ "$OSTYPE" == "darwin"* ]]; then
# macOS
sed -i '' 's/^PORT=.*/PORT=9090/' config.txt
else
# Linux
sed -i 's/^PORT=.*/PORT=9090/' config.txt
fi
# 或者直接覆盖整个文件
echo "APP_NAME=MyApp" > config.txt
echo "DB_PASS=newsecret" >> config.txt
echo "PORT=9090" >> config.txt
读取 JSON 文件(使用 jq 工具)
# 需要先安装 jq:sudo apt install jq / brew install jq # 假设 config.json 文件存在 # 读取 port=$(jq -r '.port' config.json) debug=$(jq -r '.debug' config.json) echo "端口: $port,调试模式: $debug" # 修改并保存到新文件(或覆盖原文件) jq '.port = 9090 | .debug = false' config.json > tmp.json && mv tmp.json config.json
Windows 批处理脚本(.bat / .cmd)
Windows 批处理能力有限,通常采用以下方式:
@echo off
REM 配置文件格式:每行 key=value
REM 读取
for /f "tokens=1,2 delims==" %%a in (config.txt) do (
if "%%a"=="PORT" set PORT=%%b
if "%%a"=="DEBUG" set DEBUG=%%b
if "%%a"=="NAME" set NAME=%%b
)
echo 端口=%PORT%
echo 调试=%DEBUG%
REM 写入(简单追加或覆盖)
echo PORT=9090 > config.txt
echo DEBUG=true >> config.txt
echo NAME=MyApp >> config.txt
提示: 在 Windows 上,PowerShell 是更好的选择(见下方)。
PowerShell 脚本(Windows / Linux/Mac)
PowerShell 功能强大,推荐在 Windows 系统上使用。
# 配置文件 config.json
# {
# "port": 8080,
# "debug": true,
# "name": "MyApp"
# }
# 1. 读取 JSON
$configPath = ".\config.json"
$config = Get-Content $configPath | ConvertFrom-Json
# 访问属性
Write-Host "当前端口: $($config.port)"
# 2. 修改
$config.port = 9090
$config.debug = $false
# 3. 写入
$config | ConvertTo-Json -Depth 10 | Set-Content $configPath
Write-Host "配置已保存"
# 对于简单的键值对文件 (INI/ENV)
# 读取
$lines = Get-Content ".\config.txt"
$settings = @{}
foreach ($line in $lines) {
if ($line -and $line -notmatch '^\s*#') {
$key, $value = $line -split '=', 2
$settings[$key.Trim()] = $value.Trim()
}
}
Write-Host "DB_PASS: $($settings['DB_PASS'])"
# 写入
$settings['DB_PASS'] = 'newpassword'
$settings.Keys | ForEach-Object { "$_=$($settings[$_])" } | Set-Content ".\config.txt"
关键注意事项
- 编码问题: 始终指定 UTF-8 编码,尤其是在 Windows 和涉及中文时。
- 错误处理: 脚本必须处理
文件不存在、格式错误、权限禁止等异常。 - 安全: 配置文件可能包含密码、API Key 等敏感信息。
- 绝对不要将包含密码的配置文件上传到 Git。
- 考虑使用
.env文件 +.gitignore忽略它。 - 考虑使用系统环境变量或加密存储(如 Windows DPAPI)。
- 配置版本管理: 不要直接修改配置文件来测试,建议先复制一份。
- 并发写入: 如果多个脚本同时写入同一个配置文件,可能会冲突,简单方案:使用
exclusive open(Python 的lockfile)或简单加锁机制。
总结建议
| 你的场景 | 推荐方案 |
|---|---|
| Python 项目、需要复杂结构(列表、字典嵌套) | YAML |
| Python 项目、跨语言传输、简单配置 | JSON |
| 跨语言、简单键值对、与系统环境变量结合 | .env |
| 老旧 Windows 工具、简单层次结构 | INI |
| Linux Shell 脚本、快速集成到系统 | Shell 变量文件 |
| Windows 系统、需要自动化运维 | PowerShell + JSON |
如果你能告诉我具体是什么语言、什么操作系统、配置文件的复杂程度,我可以给出更精确的代码示例。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播