You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python脚本避免覆盖CSV已有数据并按序写入的问题

解决CSV分批写入与字段保留问题

问题分析

  • 写入顺序错误:原代码用rows.keys()作为DictWriter的字段,无法保证与预设表头顺序一致,且每次执行都会重写表头覆盖原有内容。
  • 原有数据被覆盖:argparse参数默认值设为"n/a",未指定的字段会被强制替换为该值,而非保留原有数据。

修改后的代码

from argparse import ArgumentParser
from pathlib import Path
import csv

# 定义CSV固定表头顺序
FIELDS = ['Driver', 'Data 1', 'Data 2', 'Date']

# 创建参数解析器,未指定的参数默认值设为None
parser = ArgumentParser()
parser.add_argument('--file', type=Path, required=True)
parser.add_argument('--driver', type=str, nargs="?", default=None)
parser.add_argument('--data1', type=str, nargs="?", default=None)
parser.add_argument('--data2', type=str, nargs="?", default=None)
parser.add_argument('--date', type=str, nargs="?", default=None)

args = parser.parse_args()

# 映射命令行参数到CSV字段名
param_mapping = {
    'driver': 'Driver',
    'data1': 'Data 1',
    'data2': 'Data 2',
    'date': 'Date'
}

current_data = {}

# 处理文件存在/不存在的情况
if args.file.exists():
    # 读取现有CSV数据(假设仅单条记录,多记录需调整逻辑)
    with open(args.file, 'r', newline='') as csvfile:
        reader = csv.DictReader(csvfile)
        try:
            current_data = next(reader)
        except StopIteration:
            # 文件为空时初始化空数据
            current_data = {field: '' for field in FIELDS}
else:
    # 文件不存在时初始化空数据
    current_data = {field: '' for field in FIELDS}

# 仅更新用户明确指定的参数
for param_name, field_name in param_mapping.items():
    param_value = getattr(args, param_name)
    if param_value is not None:
        current_data[field_name] = param_value

# 写入更新后的数据
with open(args.file, 'w', newline='') as csvfile:
    writer = csv.DictWriter(csvfile, fieldnames=FIELDS)
    writer.writeheader()
    writer.writerow(current_data)

关键改进点

  • 固定表头顺序:用全局常量FIELDS定义表头顺序,DictWriter直接使用该列表,确保写入顺序与预设完全一致。
  • 保留原有数据:argparse参数默认值设为None,仅当用户明确传入参数时才更新对应字段,未指定的字段保留原有值。
  • 自动处理文件状态:判断文件是否存在,不存在则创建新文件并初始化空数据;存在则读取现有数据后再更新。
  • 参数映射关联:通过param_mapping绑定命令行参数名与CSV字段名,代码结构更清晰易维护。

使用示例

  1. 首次执行(创建文件并写入部分数据):
python script.py --file data.csv --driver "John Doe" --data1 "Sample Data"
  1. 后续执行(补充字段,保留原有数据):
python script.py --file data.csv --data2 "Another Value" --date "2024-05-20"

内容的提问来源于stack exchange,提问作者ChillyGrasp999

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 22:57:46