【问题标题】:2D list to csv - by column到 csv 的 2D 列表 - 按列
【发布时间】:2019-09-25 06:15:42
【问题描述】:

我想将二维列表的内容导出到 csv 文件中。

子列表的大小可以不同。例如,二维列表可以是:

a = [ ['a','b','c','d'], ['e','f'], ['g'], [], ['h','i '] ]

我希望我的 csv 像这样存储数据 - “按列”:

a,e,g, ,h
b,f, , ,i
c
d

是否必须添加一些空格才能使每个子列表的大小相同?还是有其他方法可以做到这一点?

感谢您的帮助

【问题讨论】:

    标签: python list csv


    【解决方案1】:

    你可以使用itertools.zip_longest:

    import itertools, csv
    a = [ ['a','b','c','d'], ['e','f'], ['g'], [], ['h','i'] ]
    with open('filename.csv', 'w') as f:
      write = csv.writer(f)
      write.writerows(list(itertools.zip_longest(*a, fillvalue=''))) 
    

    输出:

    a,e,g,,h
    b,f,,,i
    c,,,,
    d,,,,
    

    【讨论】:

    • 谢谢,这正是我想要的。高效且直观。至少在我的情况下,这似乎是这里提出的所有解决方案中最快的。
    • @Martin 很高兴为您提供帮助!
    【解决方案2】:

    可以使用 pandas 和转置函数 (T) 来完成

    import pandas as pd
    pd.DataFrame(a).T.to_csv('test.csv')
    

    结果: (test.csv)

     ,0,1,2,3,4
    0,a,e,g,,h
    1,b,f,,,i
    2,c,,,,
    3,d,,,,
    

    【讨论】:

      【解决方案3】:
      import itertools
      import pandas as pd
      

      首先使用嵌套数组创建一个数据框:

      a = ['a','b','c','d']
      b = ['e','f']
      c = ['g']
      d = []
      e = ['h','i'] 
      
      nest = [a,b,c,d,e]
      
      df = pd.DataFrame((_ for _ in itertools.zip_longest(*nest)), columns=['a', 'b', 'c', 'd', 'e'])
      

      这样:

          a   b       c       d       e
      0   a   e       g       None    h
      1   b   f       None    None    i
      2   c   None    None    None    None
      3   d   None    None    None    None
      

      然后使用 pandas 存储它:

      df.to_csv('filename.csv', index=False)
      

      【讨论】:

        【解决方案4】:

        我们在这里要完成三项任务:填充子列表,使其长度相同,转置,写入csv。 可悲的是Python没有内置的填充功能,但是它可以相对容易地完成,我会按照以下方式进行 (以下代码旨在提供 OP 中要求的结果):

        a = [['a','b','c','d'],['e','f'],['g'],[],['h','i']]
        ml = max([len(i) for i in a]) #number of elements of longest sublist
        a = [(i+[' ']*ml)[:ml] for i in a] #adding ' ' for sublist shorter than longest
        a = list(zip(*a)) #transpose
        a = [','.join(i) for i in a] #create list of lines to be written
        a = [i.rstrip(', ') for i in a] #jettison spaces if not followed by value
        a = '\n'.join(a) #create string to be written to file
        with open('myfile.csv','w') as f: f.write(a)
        

        myfile.csv的内容:

        a,e,g, ,h
        b,f, , ,i
        c
        d
        

        【讨论】:

          猜你喜欢
          • 2020-04-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-07-11
          • 2021-03-30
          • 2019-05-04
          • 1970-01-01
          相关资源
          最近更新 更多