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

Python 3.11.4写入CSV字段数据对应错乱问题求助

问题根源与解决方法

核心问题:fieldnames用了无序的集合

你遇到的列数据错位,本质是fieldnames被定义成了集合({}),而Python的集合是无序结构——每次程序运行时,集合内元素的顺序可能随机变化,导致csv.DictWriter按照随机的列顺序写入数据,最终出现值和字段不对应的情况。

解决步骤

1. 将fieldnames改为有序的列表

把原来的集合定义改成列表([]),固定列的顺序:

fieldnames = ['Date', 'DriveLetter', 'FreeSpace', 'TotalSpace', 'PercentFree']

2. 简化CSVWriter类的逻辑

csv.DictWriter本身会严格按照fieldnames的顺序写入数据,只要fieldnames是有序结构(比如列表),就不需要手动创建ordered_data。修正后的类代码可以简化:

import os
import csv

class CSVWriter:
    def __init__(self, filename, fieldnames):
        self.filename = filename
        self.fieldnames = fieldnames
        self.file_exists = os.path.exists(self.filename)
        
        # 统一处理文件打开模式
        mode = 'a' if self.file_exists else 'w'
        self.file = open(self.filename, mode, newline='')
        self.writer = csv.DictWriter(self.file, fieldnames=fieldnames)
        
        # 仅在新文件时写入表头
        if not self.file_exists:
            self.writer.writeheader()

    def write_row(self, data):
        # 直接写入数据,DictWriter会按fieldnames顺序对齐
        self.writer.writerow(data)

    def close(self):
        self.file.close()

3. 验证顺序(可选)

如果想确认fieldnames的顺序,可以在CSVWriter的__init__方法中加入打印语句:

print("当前fieldnames顺序:", self.fieldnames)

改成列表后,每次运行的输出顺序都会和你定义的一致,不会再随机变化。

额外优化:使用上下文管理器自动关闭文件

如果想避免手动调用close()的遗漏,可以给CSVWriter类实现上下文管理器,这样就能用with语句自动管理文件生命周期:

import os
import csv

class CSVWriter:
    def __init__(self, filename, fieldnames):
        self.filename = filename
        self.fieldnames = fieldnames
        self.file_exists = os.path.exists(self.filename)
        
    def __enter__(self):
        mode = 'a' if self.file_exists else 'w'
        self.file = open(self.filename, mode, newline='')
        self.writer = csv.DictWriter(self.file, fieldnames=self.fieldnames)
        
        if not self.file_exists:
            self.writer.writeheader()
        return self
    
    def write_row(self, data):
        self.writer.writerow(data)
        
    def __exit__(self, exc_type, exc_val, exc_tb):
        self.file.close()

# 使用方式
with CSVWriter(filename=csv_path, fieldnames=fieldnames) as csv_write:
    csv_write.write_row(drive_info)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 23:10:41