【问题标题】:with python write to csv file from csv dictionary用python从csv字典写入csv文件
【发布时间】:2019-04-26 16:48:29
【问题描述】:

我正在尝试从 CSV 字典写入 CSV 文件。它比看起来要复杂一些。请更正我的代码,以便我可以获得所需的 CSV 文件。

我的 csv 文件:

id;Remarks;x;y;z
a1;Mv_biw;10;12;3
b1;Ins_slt_po_zd;20;22;5
a2;Mv_biw;25;17;7
a1;Ins_slt_po_zd;35;13;3
a1;Ins_slt_dkz;15;19;9
b1;Mv_biw;65;11;2
b2;Ins_slt_dkz;50;23;1
b2;Mv_biw;75;17;7

到目前为止我的代码:

import os
import csv
import collections
from csv import DictWriter    

with open(r'C:\incsv_new.csv', 'r') as csvfile:
    reader = csv.reader(csvfile, delimiter=';')
    my_dict = collections.defaultdict(dict)
    for row in reader:
        my_dict[row[0]][row[1]] = [row[2],row[3],row[4]]

print (my_dict)

with open(r'C:\outcsv_new.csv','w', newline='') as wf:
    fieldnames = ['ID','x_Mv_biw', 'y_Mv_biw', 'z_Mv_biw', 'x_Ins_slt_po_zd', 'y_Ins_slt_po_zd', 'z_Ins_slt_po_zd', 'x_Slb_po_zd', 'y_Slb_po_zd', 'z_Slb_po_zd', 'x_Slb_dkz', 'y_Slb_dkz', 'z_Slb_dkz', 'x_Ins_slt_dkz', 'y_Ins_slt_dkz', 'z_Ins_slt_dkz'] 
    my_write = csv.DictWriter(wf, fieldnames = fieldnames, delimiter = ';')
    my_write.writeheader()

所需的输出 CSV 文件:

id;x_Mv_biw;y_Mv_biw;z_Mv_biw;x_Ins_slt_po_zd;y_Ins_slt_po_zd;z_Ins_slt_po_zd;x_Slb_po_zd;y_Slb_po_zd;z_Slb_po_zd;x_Slb_dkz;y_Slb_dkz;z_Slb_dkz;x_Ins_slt_dkz;y_Ins_slt_dkz;z_Ins_slt_dkz
a1;10;12;3;35;13;3;-1;-1;-1;-1;-1;-1;15;19;9
a2;25;17;7;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1
b1;65;11;2;20;22;5;-1;-1;-1;-1;-1;-1;-1;-1;-1
b2;75;17;7;-1;-1;-1;-1;-1;-1;-1;-1;-1;50;23;1

【问题讨论】:

  • 您遇到了什么错误?也链接错误。
  • 你必须调用 writerow 。 for i in my_dict: my_write.writerow(i)
  • @SmartManoj,请更正我的代码并重写代码

标签: python pandas csv export-to-csv


【解决方案1】:

您需要遍历my_dict 并为每一行构造字典。还需要为这 3 个元素中的每一个构造字典键,在这种情况下,zip() 用于将每个值与 x yz 合并:

import os
import csv
import collections
from csv import DictWriter    

with open(r'incsv_new.csv', 'r', newline='') as csvfile:
    reader = csv.reader(csvfile, delimiter=';')
    next(reader)    # skip over the header
    my_dict = collections.defaultdict(dict)

    for row in reader:
        my_dict[row[0]][row[1]] = [row[2], row[3], row[4]]

with open(r'outcsv_new.csv', 'w', newline='') as wf:
    fieldnames = ['ID','x_Mv_biw', 'y_Mv_biw', 'z_Mv_biw', 'x_Ins_slt_po_zd', 'y_Ins_slt_po_zd', 'z_Ins_slt_po_zd', 'x_Slb_po_zd', 'y_Slb_po_zd', 'z_Slb_po_zd', 'x_Slb_dkz', 'y_Slb_dkz', 'z_Slb_dkz', 'x_Ins_slt_dkz', 'y_Ins_slt_dkz', 'z_Ins_slt_dkz'] 
    my_write = csv.DictWriter(wf, fieldnames=fieldnames, delimiter=';', restval=-1)
    my_write.writeheader()

    for id, values in my_dict.items():
        row = {'ID':id}

        for key, values_xyz in values.items():
            for xyz, value in zip("xyz", values_xyz):
                row[f'{xyz}_{key}'] = value

        my_write.writerow(row)

给你一个输出 CSV 文件:

ID;x_Mv_biw;y_Mv_biw;z_Mv_biw;x_Ins_slt_po_zd;y_Ins_slt_po_zd;z_Ins_slt_po_zd;x_Slb_po_zd;y_Slb_po_zd;z_Slb_po_zd;x_Slb_dkz;y_Slb_dkz;z_Slb_dkz;x_Ins_slt_dkz;y_Ins_slt_dkz;z_Ins_slt_dkz
a1;10;12;3;35;13;3;-1;-1;-1;-1;-1;-1;15;19;9
b1;65;11;2;20;22;5;-1;-1;-1;-1;-1;-1;-1;-1;-1
a2;25;17;7;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1
b2;75;17;7;-1;-1;-1;-1;-1;-1;-1;-1;-1;50;23;1

阅读时也应跳过标题行。

【讨论】:

  • 绅士,谢谢您的行动。您对此问题有正确的解决方案。这是一个示例 CSV 文件。实际的 CSV 文件要大得多,大约有 55 列和 300 行。如果一行是空的,是否可以添加我想添加“-1”到它。无论如何你做得很好。
  • 你能更新你的例子吗?并显示预期的输出。
  • Gomorning,Martin,是的,我已经更新了预期的输出。所有空单元格都获得“-1”值。请查看预期输出。谢谢。
  • 哇。这真的超级棒。再次感谢您,祝您有愉快的一天。
猜你喜欢
  • 1970-01-01
  • 2018-03-19
  • 2019-09-15
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 2021-05-15
  • 1970-01-01
相关资源
最近更新 更多