使用Python CSV模块写入csv,每次都保持列的顺序相同

时间:2017-06-30 06:20:35

标签: python csv export-to-csv

下面是获取字典列表并将其写入CSV文件的代码。

import csv

def createBaselineCSV(baselineDictionaryList, name):

    toCSV = baselineDictionaryList

    keys = toCSV[0].keys()
    print(keys)
    with open(name, 'w') as output_file:
        dict_writer = csv.DictWriter(output_file, fieldnames=keys)
        dict_writer.writeheader()
        dict_writer.writerows(toCSV)

contacts = [{'Name':'John Smith', 'Email':'example@email.com', 'Phone':'888-888-8888'}, {'Name':'Keith Stone', 'Email':'keith@coors.com', 'Phone':'000-000-000'}]

createBaselineCSV(contacts, 'contacts.csv')

但是,每次创建新电子表格时,创建的CSV文件的列都不会保持一致的格式。所以有一次它可能会创建一个看起来像这样的CSV:

Name, Email, Phone
John Smith, example@email.com, 888-888-8888
Keith Stone, keith@coors.com, 000-000-0000

下次它可能会生成如下所示的CSV:

Email, Phone, Name
example@email.com, 888-888-8888, John Smith
keith@coors.com, 000-000-0000, Keith Stone

有没有一种方法可以确保每次都将列单元格固定在固定位置来创建CSV?例如,列A始终是“姓名”,列B始终是“电子邮件”,而列C始终是“电话”。

我猜测完成此操作意味着在除字典列表之外的其他数据类型上调用createBaselineCSV(因为字典不会维护指定的顺序),而不是重新格式化函数中的代码。什么是最好的方法?

2 个答案:

答案 0 :(得分:4)

您的问题是fieldnames=keys,其中keys来自没有订单的字典。只需设置fieldnames=['Name', 'Email', 'Phone']或您想要的任何内容即可。您可以继续使用dicts和DictWriter

答案 1 :(得分:1)

pandas让这很容易:

SET @row:=0;
SET @row2:=0;

(SELECT @row:=@row+1, id, `name`, status FROM mytable WHERE status = 1)
UNION
(SELECT @row2:=@row2+1, id, `name`, status FROM mytable WHERE status = 2)
ORDER BY 1, 4;