2013-11-10 42 views
1

我在Python 3當前代碼:最佳實踐來存儲基於列的數據之前寫入CSV在Python

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中用於存儲最初組織在表中的基於列的數據的最佳方法。

+0

嘗試將此'sp500_data [0] .keys'更改爲此'sp500_data [0] .keys()'。不確定使用Python 3,但使用Python 2'keys'是一種返回列表的方法,因此您需要使用'()'調用它。 –

+1

如果你正在處理表格數據,財務數據,請查看[pandas](http://pandas.pydata.org)。對於多維數據,DataFrame是比Python本身提供的更好的存儲對象。 – DSM

回答

4

你忘了呼叫.keys()方法:

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

注意()sp500_data[0].keys後; .keys不是屬性,它是一種方法。

使用csv.DictWriter()是將字典格式的數據轉換爲CSV數據的絕佳方法。

+0

如果您查看生成的文件,它似乎會給出一個奇怪的結果:第一行不包含標題,以下行也包含標題。 – BlueTrin

+0

使用['wr.writeheader()'](http://docs.python.org/3/library/csv.html#csv.DictWriter.writeheader)向文件寫入標題。您提供的示例代碼一旦修復,將不會寫入密鑰,只是值。 –

+0

實際上,它刪除了他們的密鑰,但是不用'MMM'來打印'b'MMM',你碰巧知道爲什麼? – BlueTrin

相關問題