【问题标题】:Best practice to store column-based data before to write to CSV in Python在 Python 中写入 CSV 之前存储基于列的数据的最佳实践
【发布时间】:2013-11-21 23:30:12
【问题描述】:

我有 Python 3 中的当前代码:

import csv

if __name__ == '__main__':
    sp500_data = [
        {
            'company': 'GOOGLE',
            'headquarters': 'GOOGLEPLEX',
            'industry': 'ADS',
            'sector': 'TECH',
            'symbol': 'GOOG'
        },
        {
            'company': 'HEWLPA',
            'headquarters': 'WHATEVER',
            'industry': 'HARDWARE',
            'sector': 'TECH',
            'symbol': 'HP'
        }
    ]

    myfile = open("D:/test.csv", 'w', newline='')
    wr = csv.DictWriter(myfile, delimiter='\t', quoting=csv.QUOTE_ALL, fieldnames=sp500_data[0].keys)
    for sp500_company in sp500_data:
        wr.writerow(sp500_company)

但是这会产生以下错误:

Traceback (most recent call last):
  File "D:\DEV\BlueTS\src\tsRetriever\dataRetriever\test.py", line 24, in <module>
    wr.writerow(sp500_company)
  File "C:\Python33\lib\csv.py", line 153, in writerow
    return self.writer.writerow(self._dict_to_list(rowdict))
  File "C:\Python33\lib\csv.py", line 146, in _dict_to_list
    wrong_fields = [k for k in rowdict if k not in self.fieldnames]
  File "C:\Python33\lib\csv.py", line 146, in <listcomp>
    wrong_fields = [k for k in rowdict if k not in self.fieldnames]
TypeError: argument of type 'builtin_function_or_method' is not iterable

我想了解我做错了什么,除此之外,我想知道在 Python 中存储最初以表格形式组织的基于列的数据的最佳方式是什么。

【问题讨论】:

  • 尝试把这个sp500_data[0].keys改成这个sp500_data[0].keys()。不确定是否使用 Python 3,但使用 Python 2 keys 是一个返回列表的方法,因此您需要使用 () 调用它。
  • 如果您正在处理表格数据,尤其是。财务数据,请查看pandasDataFrame 是一个比 Python 原生提供的更好的多维数据存储对象。

标签: python csv export-to-csv


【解决方案1】:

你忘了调用.keys()方法:

wr = csv.DictWriter(myfile, delimiter='\t', quoting=csv.QUOTE_ALL,
                    fieldnames=sp500_data[0].keys())

注意sp500_data[0].keys后面的().keys 不是属性,是方法。

使用csv.DictWriter() 是将字典格式的数据转换为 CSV 数据的绝佳方法。

【讨论】:

  • 如果你查看生成的文件,它似乎给出了一个奇怪的结果:第一行不包含标题,后面的行也包含标题。
  • 使用wr.writeheader() 将标题写入文件。您提供的示例代码一旦修复,就不会写键,只会写值。
  • 实际上它删除了它们的密钥,但是它没有打印MMM,而是打印b'MMM',你知道为什么吗?
  • 那是字节数据,不是unicode文本。首先将字节值解码为 un​​icode。
  • 您可以使用字典理解:{key: value.decode('utf8') for key, value in row.items()},其中row 是要解码的字典。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多