脚本如何读写配置文件

wen 实用脚本 26

本文目录导读:

脚本如何读写配置文件

  1. 四种常见配置文件格式对比
  2. Python 脚本示例(最常用)
  3. Bash/Shell 脚本示例(Linux/Mac)
  4. Windows 批处理脚本(.bat / .cmd)
  5. PowerShell 脚本(Windows / Linux/Mac)
  6. 关键注意事项
  7. 总结建议

这是一个非常核心的问题,答案取决于你使用的编程语言配置文件格式,下面我会从最通用的方法开始介绍,并分语言给出示例。

我会假设配置文件是常见的文本格式.ini.json.yaml.env 或简单的 .txt,脚本运行在 Windows/Linux/macOS 上。

特别注意: 对于 .ini.yaml 格式,Python 标准库自带了 configparserjson,但 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"

关键注意事项

  1. 编码问题: 始终指定 UTF-8 编码,尤其是在 Windows 和涉及中文时。
  2. 错误处理: 脚本必须处理 文件不存在格式错误权限禁止 等异常。
  3. 安全: 配置文件可能包含密码、API Key 等敏感信息。
    • 绝对不要将包含密码的配置文件上传到 Git。
    • 考虑使用 .env 文件 + .gitignore 忽略它。
    • 考虑使用系统环境变量或加密存储(如 Windows DPAPI)。
  4. 配置版本管理: 不要直接修改配置文件来测试,建议先复制一份。
  5. 并发写入: 如果多个脚本同时写入同一个配置文件,可能会冲突,简单方案:使用 exclusive open(Python 的 lockfile)或简单加锁机制。

总结建议

你的场景 推荐方案
Python 项目、需要复杂结构(列表、字典嵌套) YAML
Python 项目、跨语言传输、简单配置 JSON
跨语言、简单键值对、与系统环境变量结合 .env
老旧 Windows 工具、简单层次结构 INI
Linux Shell 脚本、快速集成到系统 Shell 变量文件
Windows 系统、需要自动化运维 PowerShell + JSON

如果你能告诉我具体是什么语言什么操作系统配置文件的复杂程度,我可以给出更精确的代码示例。

抱歉,评论功能暂时关闭!