代码之家  ›  专栏  ›  技术社区  ›  ymmx

如何将dict以列形式保存在csv中,其中第一行是键,下一行是向量?

  •  3
  • ymmx  · 技术社区  · 7 年前

    我有一份口述,格式如下:

    Sigs_dict['a']=[1,2,3,4,5]
    Sigs_dict['b']=[6,7,8,9,0]
    Sigs_dict['c']=[1,2,3,4,5]
    

    我想要一个csv文件,其中第一行是dict的键,下一行是列形状中的向量。 比如:

    a    b    c
    1    6    1
    2    7    2
    3    8    3
    4    9    4
    5    0    5
    

    with open(fileName[0], 'w') as f:
        writer = csv.writer(f, delimiter = ' ')
        writer.writerow(Sigs_dict.keys())
        #missing something here
    

    所有向量的长度都相同。

    3 回复  |  直到 7 年前
        1
  •  2
  •   Ralf    7 年前

    使用 zip built-in (否) pandas 依赖,尽管

    my_dict = {}
    my_dict['a'] = [1, 2, 3, 4, 5]
    my_dict['b'] = [6, 7, 8, 9, 0]
    my_dict['c'] = [1, 2, 3, 4, 5]
    
    # get keys and values in the same order, in this case, sorted by key
    # key_list = sorted(my_dict.keys())
    key_list = [k for k, _ in sorted(my_dict.items())]
    val_list = [v for _, v in sorted(my_dict.items())]
    
    with open(fileName[0], 'w') as f:
        writer = csv.writer(f, delimiter=' ')
        writer.writerow(key_list)
        for row in zip(*val_list):
            writer.writerow(row)
    

    注意我是如何打开包装的 val_list 使用星号( * ); 如果不打开包装,这将无法按预期工作。


    编辑了我的代码,使其具有固定的顺序,以防止列标题和内容之间不匹配。

        2
  •  2
  •   mad_    7 年前

    如果你可以使用熊猫

    import pandas as pd
    pd.DataFrame(Sigs_dict).to_csv('your_csv_file_path.csv',index=False,sep=' ')
    

    将产生

    a b c
    1 6 1
    2 7 2
    3 8 3
    4 9 4
    5 0 5
    
        3
  •  2
  •   Jean-François Fabre    7 年前

    即使输入是字典,也不能使用 csv.DictWriter ,每个数据需要1个密钥 ,而不是列。

    只是 zip csv

    import csv,sys
    
    title = sorted(Sigs_dict)
    cw = csv.writer(sys.stdout)
    cw.writerow(title)  # write header
    cw.writerows(zip(*(Sigs_dict[k] for k in title)))
    

    结果:

    a,b,c
    1,6,1
    2,7,2
    3,8,3
    4,9,4
    5,0,5
    

    要写文件,别忘了 newline="" 对于python 3,以及 "wb" 对于Python2,为了避免windows上臭名昭著的额外换行问题:

    with open(fileName[0], 'w', newline = "") as f:  # or just ,'wb') for python 2
       cw = csv.writer(f)