【问题标题】:Writing a python Dictionary to a CSV file with keys as column headers将 python 字典写入 CSV 文件,其中键为列标题
【发布时间】:2015-06-03 15:43:35
【问题描述】:

我正在尝试将字典中的元素写入一个文本文件,其中每个键都是一列。目前我有一些看起来像

import csv
import numpy as np



data1 = np.arange(10)
data2 = np.arange(10)*2
data3 = np.arange(10)*3

writefile = '../Desktop/data.txt'
datadict = {} 

datadict['data1'] = data1
datadict['data2'] = data2
datadict['data3'] = data3


f = open( writefile, 'w' )
fieldnames = ['data1','data2', 'data3']
data = csv.DictWriter(writefile, fieldnames, restval='', extrasaction='ignore', dialect='excel')

f.close()

但它给了我错误“参数 1 必须有一个“写入”方法”。我不确定那是什么意思。我也担心方言 = 'excel',但我不知道还能放什么。 最后,我想要一个看起来像这样的文件:

谢谢

【问题讨论】:

    标签: python csv dictionary


    【解决方案1】:

    这里根本不需要使用 DictWriter:

    import csv
    import numpy as np
    
    data1 = np.arange(10)
    data2 = np.arange(10)*2
    data3 = np.arange(10)*3
    
    writefile = '../test.csv'
    fieldnames = ['data1','data2', 'data3']
    with open( writefile, 'w' ) as f:
        writer = csv.writer(f)
        writer.writerow(fieldnames)
        writer.writerows(zip(data1, data2, data3))
    

    【讨论】:

      【解决方案2】:

      您应该将类​​文件对象作为第一个参数传递给DictWriter 构造函数。

      datalist = [{'data1': d1, 'data2': d2, 'data3': d3} for d1, d2, d3 in zip(data1, data2, data3)]
      ...
      f = open(writefile, 'w')
      ...
      writer = csv.DictWriter(f, ...) 
      for i in xrange(10):
          writer.writerow(datalist[i])
      f.close()
      

      更简单的类比案例:

      with open(writefile, 'w') as f:
          writer = csv.writer(f)
          for row in zip(data1, data2, data3):
              writer.writerow(row)
      

      【讨论】:

      • 这给了我一个错误,因为该文件尚不存在。当我在那里放一个空文件时,它会返回空文件。
      • 已修复,再试一次)(我忘了'w'修饰符,你应该关闭文件或刷新它)
      • 我做了,但我最终还是得到了一个空文件
      • 我们忘记使用writer.writerow (docs.python.org/library/csv.html#csv.writer)。这应该有效。
      • 我会在晚餐后尝试那个 for 循环,但这看起来很有希望。谢谢。
      【解决方案3】:

      如果您正在做看起来可能在这里做的那种数据分析,最好的选择可能是进入 Python 的专用数据分析库 pandas

      这是一个你想做的例子:

      import pandas as pd
      import numpy as np
      
      data1 = np.arange(10)
      data2 = np.arange(10)*2
      data3 = np.arange(10)*3
      
      df = pd.DataFrame(zip(data1, data2, data3), columns=['data1', 'data2', 'data3'])
      df.to_csv('myfile.csv')
      

      我会说非常整洁。此外,您现在可以对您的数据执行 all sorts of unimaginable things

      您还可以从现有字典中创建DataFrame

      In [115]: a_dict = {'foo':[1,2,3], 'bar':[4,5,6], 'baz':[7,8,9]}
      
      In [116]: pd.DataFrame(a_dict)
      Out[116]: 
         bar  baz  foo
      0    4    7    1
      1    5    8    2
      2    6    9    3
      

      【讨论】:

        【解决方案4】:

        试试这个:

        import csv
        import numpy as np
        
        data1 = np.arange(10)
        data2 = np.arange(10)*2
        data3 = np.arange(10)*3
        
        writefile = '../Desktop/data.txt'
        datadictlist = [{'data1': data1[i], 'data2': data2[i], 'data3': data3[i]} for i in xrange(10)]
        
        f = open( writefile, 'w' )
        fieldnames = ['data1','data2', 'data3']
        writer = csv.DictWriter(f, fieldnames, restval='', extrasaction='ignore', dialect='excel')
        writer.writerows(datadictlist)
        
        f.close()
        

        【讨论】:

        • 这只是给了我一个没有任何数据写入的空文件。
        • 现在正在打印数据(是的),但格式不正确。它给了我一行 [0 1 2 3 4 5 6 7 8 9],[ 0 2 4 6 8 10 12 14 16 18],[ 0 3 6 9 12 15 18 21 24 27]
        • @AlexaHalford,这是因为您将整个数组分配给一个字典中的单个字段。我更新了代码以打印您要显示的输出。
        【解决方案5】:

        用'a+'代替'w'

        f = open( writefile, 'a+' )
        

        【讨论】:

          猜你喜欢
          • 2015-01-08
          • 2012-11-19
          • 2013-03-04
          • 1970-01-01
          • 2018-07-18
          • 2020-01-25
          • 1970-01-01
          • 2018-02-18
          • 2014-06-30
          相关资源
          最近更新 更多