【问题标题】:TypeError: '_csv.reader' object has no attribute '__getitem__' // getting columns?TypeError: '_csv.reader' 对象没有属性 '__getitem__' // 获取列?
【发布时间】:2015-05-12 13:51:04
【问题描述】:

我正在尝试打开一个 .csv 文件并将每一列放在不同的列表中:

import csv
CSV = csv.reader(open("AAPL.csv","rb"))
column1 = CSV[0]
column2 = CSV[1]
column3 = CSV[2]
column4 = CSV[2]
column5 = CSV[4]
column6 = CSV[5]

这是我的AAPL.csv

Date        Open    High    Low     Close   Volume   Adj Close
2013-09-27  874.82  877.52  871.31  876.39  1258800  876.39
2013-09-26  878.3   882.75  875     878.17  1259900  878.17
2013-09-25  886.55  886.55  875.6   877.23  1649000  877.23
2013-09-24  886.5   890.1   881.4   886.84  1467000  886.84
2013-09-23  896.15  901.59  885.2   886.5   1777400  886.5
2013-09-20  898.39  904.13  895.62  903.11  4345300  903.11
2013-09-19  905.99  905.99  895.4   898.39  1597900  898.39
2013-09-18  886.35  903.97  883.07  903.32  1934700  903.32
2013-09-17  887.41  888.39  881     886.11  1259400  886.11
2013-09-16  896.2   897     884.87  887.76  1336500  887.76
.............................................................
end of file:
.............................................................
2012-06-29  574.96  58013   572.20  580.07  2519500  580.07
2012-06-28  565.90  566.23  557.21  564.31  1920900  564.31
2012-06-27  567.70  573.99  566.02  569.30  1692300  569.30
2012-06-26  562.76  566.60  559.48  564.68  1350200  564.68
2012-06-25  567.33  568.09  557.35  560.70  1581600  560.70

当我运行我的代码时,它会返回以下错误:

Traceback (most recent call last):
  File "/home/misha/Documents/finance/prices/some_csv.py", line 3, in <module>
    column1 = CSV[0]
TypeError: '_csv.reader' object has no attribute '__getitem__'

是否有任何 Pythonic 方法可以打开 .csv 文件并将每一列放在不同的列表中,而不使用属性 getitem

谢谢。

注意:我还需要跳过第一行。

【问题讨论】:

    标签: python csv


    【解决方案1】:

    csv.reader 实例是 CSV 文件行的可迭代对象。如果您希望每一列都在一个单独的列表中,您可以使用zip 函数:

    import csv
    
    with open("AAPL.csv", "rb") as f:
        CSV = csv.reader(f)
    
        header = next(CSV) # read the header row
        column_data = zip(*CSV) # read data and arrange by columns instead of by rows
    
    # do stuff with column_lists
    

    请注意,这会一次读取整个文件。如果您的文件中有大量数据,您可能需要重新设计算法,以便在迭代 CSV 对象时一次处理一行数据,因此您不需要保留所有数据在内存中。

    【讨论】:

    • 既然 OP 想要存储列值列表,那么我想内存不是问题。
    • 是的,我想我的主要目的是问“你确定你真的想要列的列表吗?数据本身并不是以这种方式组织的。”提问者似乎理所当然地认为数据是按列组织的,而且可能他们计划对列列表做的任何事情都可以很容易地逐行完成。 (例如,他们可能一直在计划 zipping 一些列以迭代它们。)
    【解决方案2】:

    这应该可行:

    import csv
    CSV = csv.reader(open("AAPL.csv","rb"))
    for col in CSV:
        column1 = col[0]    
        column2 = col[1]
        column3 = col[3]
    

    【讨论】:

      猜你喜欢
      • 2012-12-04
      • 2012-10-15
      • 2014-01-16
      • 2017-02-27
      • 2018-01-28
      • 2014-06-10
      • 2012-10-16
      • 2015-11-04
      • 1970-01-01
      相关资源
      最近更新 更多