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
相关产品推荐
相关产品推荐

