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

Pandas写入Excel列按字母重排,如何保留Python字典的列顺序?

这个问题太常见啦!我之前处理CSV导出的时候也踩过这个坑。其实问题的根源在于:在Python 3.7之前,普通的dict是不保留插入顺序的,就算3.7及以后版本的字典默认支持有序插入了,为了确保跨版本兼容或者严格按照你想要的顺序输出,最好还是显式指定列的顺序。

下面给你两种最常用的解决方案:

方法一:使用Python标准库csv(无需额外安装)

这是最基础的方案,不需要安装第三方库,适合轻量级数据处理。核心是用csv.DictWriter的fieldnames参数来强制指定列的顺序:

import csv

# 示例数据:列表形式的多个字典(如果是单个字典,可以转成[single_dict])
your_data = [
    {"ProductID": "P001", "Name": "Wireless Mouse", "Price": 29.99},
    {"ProductID": "P002", "Name": "Mechanical Keyboard", "Price": 89.99},
    {"ProductID": "P003", "Name": "USB-C Cable", "Price": 12.99}
]

# 定义你想要保留的列顺序,要和字典的键完全对应
desired_column_order = ["ProductID", "Name", "Price"]

# 写入CSV文件
with open("products.csv", "w", newline="", encoding="utf-8") as csv_file:
    # 创建DictWriter对象,传入指定的列顺序
    writer = csv.DictWriter(csv_file, fieldnames=desired_column_order)
    # 先写入表头(即列名)
    writer.writeheader()
    # 写入所有数据行
    writer.writerows(your_data)

关键点说明:

  • fieldnames参数是核心:它会强制CSV按照你定义的顺序生成列,不管原字典的顺序是什么(哪怕是Python 3.6及以前的无序字典也能正常工作)。
  • newline=""是为了避免Windows系统下导出的CSV出现空行。
  • 指定encoding="utf-8"可以保证中文等非ASCII字符正常显示。

方法二:使用pandas(适合处理大量数据或复杂场景)

如果你平时用pandas处理数据,这个方案更简洁,只需要在创建DataFrame时指定columns参数即可固定列顺序:

import pandas as pd

# 同样的示例数据
your_data = [
    {"ProductID": "P001", "Name": "Wireless Mouse", "Price": 29.99},
    {"ProductID": "P002", "Name": "Mechanical Keyboard", "Price": 89.99},
    {"ProductID": "P003", "Name": "USB-C Cable", "Price": 12.99}
]

desired_column_order = ["ProductID", "Name", "Price"]

# 创建DataFrame时指定列顺序
df = pd.DataFrame(your_data, columns=desired_column_order)
# 导出CSV,index=False是为了去掉自动生成的行索引
df.to_csv("products_pandas.csv", index=False, encoding="utf-8")

单个字典的特殊情况

如果你的数据是单个字典而非列表,只需要稍微调整一下:

single_dict = {"ProductID": "P001", "Name": "Wireless Mouse", "Price": 29.99}
desired_column_order = ["ProductID", "Name", "Price"]

# 使用csv库的话
with open("single_product.csv", "w", newline="", encoding="utf-8") as csv_file:
    writer = csv.DictWriter(csv_file, fieldnames=desired_column_order)
    writer.writeheader()
    writer.writerow(single_dict)  # 用writerow而非writerows

# 使用pandas的话
df = pd.DataFrame([single_dict], columns=desired_column_order)
df.to_csv("single_product_pandas.csv", index=False, encoding="utf-8")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:18:24