【问题标题】:How to write a list as separate elements using csv?如何使用 csv 将列表写为单独的元素?
【发布时间】:2016-04-25 19:06:36
【问题描述】:

我有两个如下所示的列表:

list1 = ['filename1', 'filename2', 'filename3']
list2 = ['1', '2', ['3', '4', '5']]

我怎样才能写入一个像这样结束的 csv 文件?

filename1,1
filename2,2
filename3,3,4,5

我尝试了两件事,但都没有成功:

with open(outfname, 'wb') as fout:
        csv_out = csv.writer(fout)
        csv_out.writerows(izip(list1, list2))

这表明:

filename1,['1']
filename2,['2']
filename3,['3','4','5']

我尝试在 writerows 之前添加这个:

",".join(list2)

但结果会显示:

filename1,1
filename2,2
filename3,"1,2,3"

【问题讨论】:

    标签: python list csv


    【解决方案1】:

    @Satya 有一个使用 pandas 的好主意,但您需要展平 list2,您可以使用 .apply() 来做到这一点:

    >>> import pandas as pd
    >>> import sys
    >>> df = pd.DataFrame({'list1': list1, 'list2': list2})
    >>> df = df.join(df.list2.apply(lambda x: pd.Series(x)))
    >>> df.drop('list2', axis=1).to_csv(sys.stdout, header=False, index=False)
    filename1,1,,
    filename2,2,,
    filename3,3,4,5
    

    这会将空字段放在缺少数据的位置。
    或者,您可以编写自己的特殊 zip:

    def my_zip(l1, l2):
        for a, b in zip(l1, l2):
            try:
                yield [a]+b
            except TypeError:
                yield [a, b]
    
    >>> csv_out = csv.writer(sys.stdout)
    >>> csv_out.writerows(my_zip(list1, list2))
    filename1,1
    filename2,2
    filename3,3,4,5
    

    这正是请求的输出。

    【讨论】:

      【解决方案2】:

      像这样。它需要一些临时列表,但可以完成工作。

      import csv
      
      list1 = ['filename1', 'filename2', 'filename3']
      list2 = ['1', '2', ['3', '4', '5']]
      
      with open('out.csv', 'w') as f:
          r = csv.writer(f)
          for name, num in zip(list1, list2):
              r.writerow([name] + list(num))
      

      out.csv 看起来像

      filename1,1
      filename2,2
      filename3,3,4,5
      

      【讨论】:

        【解决方案3】:

        你不需要熊猫。首先要获得所需的数据结构,您可以使用zip。要保存到 CSV,您可以使用标准 CSV 模块。

        import csv
        list1 = ['filename1', 'filename2', 'filename3']
        list2 = ['1', '2', ['3', '4', '5']]
        
        zipped = zip(list1, list2)
        with open('some.csv', 'w', newline='') as f:
           writer = csv.writer(f)
           writer.writerows(zipped)
        

        【讨论】:

        • 你试过了吗?这不是 OP 想要的,他们已经尝试过[i]zip
        【解决方案4】:

        请记住,字符串是单项列表。为什么你需要 pandas 来完成这个简单的任务?

        list1 = ['filename1', 'filename2', 'filename3']
        list2 = ['1', '2', ['3', '4', '5']]
        with open(outfname, 'w') as fout:
            for item in zip(list1,list2):
                fout.write(item[0])
                fout.write(',')
                fout.write(','.join(item[1]))
                fout.write('\n')
        

        【讨论】:

        • 这是原生的。没有导入模块。超级琐碎的人!
        • 适用于示例输入,但有一点限制,任何非嵌套的 2 位数字(例如 ['11','22',['3','4','5']])也会在数字之间得到一个 ','
        【解决方案5】:

        您可以改用 pandas 数据框来形成所需的 .csv 文件

        import pandas as pd
        list1 = ['filename1', 'filename2', 'filename3']
        list2 = ['1', '2', ['3', '4', '5']]
        df = pd.DataFrame()
        df['a'] = list1
        df['b'] = list2
        df.to_csv('D:/sx.csv',index=False) ####you can give any desired path for csv
        

        将列表展平即可

        df['b']=[','.join(x) for x in df['b']]  ####i have separated the list items by comma as of now, but you can give your own separator
        

        继续代码

          df.to_csv('D:/sx.csv',index=False)
          d = pd.read_csv('D:/sx.csv')
          d 
               a      b
         0  filename1      1
         1  filename2      2
         2  filename3  3,4,5
        

        再次修改

          d['a'] = d['a']+','+d['b']
          d
          Out[39]: 
                     a      b
        0      filename1,1      1
        1      filename2,2      2
        2  filename3,3,4,5  3,4,5
        

        然后删除列 b

         df = d.drop('b',axis=1)
         df
        Out[44]: 
                     a
         0      filename1,1
         1      filename2,2
         2  filename3,3,4,5
         ######column a shows the desired output...
        

        现在您可以通过 df.to_csv('path+file.csv') 形成 csv

        【讨论】:

        • 这仍然没有变平list[2]
        • 这仍然会在 OP 试图避免的字段周围放置分隔符,请参阅最后一个示例输出。
        • @AChampion-可能是我误解了 OP 的问题..列需要压缩。
        • 如果您将'D:/sx.csv' 替换为sys.stdout(或查看创建的文件),您会看到3,4,5 是分隔符"3,4,5"。当你读回它时,熊猫会去除分隔符。
        猜你喜欢
        • 2021-05-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-20
        • 1970-01-01
        • 2018-05-17
        • 1970-01-01
        相关资源
        最近更新 更多