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字段名,代码结构更清晰易维护。
使用示例
- 首次执行(创建文件并写入部分数据):
python script.py --file data.csv --driver "John Doe" --data1 "Sample Data"
- 后续执行(补充字段,保留原有数据):
python script.py --file data.csv --data2 "Another Value" --date "2024-05-20"
内容的提问来源于stack exchange,提问作者ChillyGrasp999
相关产品推荐
相关产品推荐

