2015-04-04 54 views
0

我試圖將列表中的數據從列表寫入csv文件。這是我有什麼Python:將嵌套列表對象寫入csv文件

class Point(object): 
    def __init__(self, weight, height): 
     self.weight = weight 
     self.height = height 
    def get_BMI(self): 
     return (self.weight * self.height)/42 # this is not how you calculate BMI but let's say 

myList = [[Point(30, 183)],[Point(63, 153)]] 

,因爲數據被設置方式的簡化版本,我點存儲在一個嵌套循環。如果我想訪問的第一個點對象的BMI,我會鍵入

myList[0][0].get_BMI() 

我想每個點的BMI寫入CSV(逗號分隔)。我怎麼做?

這是我怎麼想的,但它不完全是直截了當:

import csv 
with open('output.csv', 'w') as csvfile: 
    writer = csv.writer(csvfile) 
    writer.writerows(myList) 

它不返回任何錯誤但它實際上並沒有創建CSV文件要麼。另外我想將文件中的值寫入myList[i][j].get_BMI()。我沒有權限問題,因爲我使用Spyder(python IDE)作爲root用戶。現在我只是通過Spyder控制檯運行腳本,但它仍然可以工作並輸出CSV文件。

回答

1

writerows需要字符串或數字列表的列表。你應該通過創建與BMI值的列表開始,使他們能夠獲取寫入到您csv文件:

import csv 
BMIs = [[point.get_BMI() for point in points] for points in myList] 
with open('output.csv', 'w') as csvfile: 
    writer = csv.writer(csvfile) 
    writer.writerows(BMIs) 
+0

感謝你的解決方案工作。 – cooldood3490 2015-04-04 16:08:14

1

有三個問題:

  1. 嵌套列表必須被壓扁。要完成此操作,請使用itertools.chain.from_iterable

  2. CSV的行數據必須自定義。要完成此操作,請使用list comprehensions

  3. output.csv未被創建。我懷疑output.csv正在創建,但被放置在一個意想不到的位置。您可以嘗試對測試的完整路徑進行硬編碼以查看是否屬於這種情況。

這裏是代碼,演示了#1和#2:

import csv 
from itertools import chain 

with open('output.csv', 'w') as csvfile: 
    writer = csv.writer(csvfile) 
    flattenedList = chain.from_iterable(myList) 

    writer.writerows((pt.weight, pt.height, pt.get_BMI()) for pt in flattenedList) 
+0

對於第3點,我相信'csv'默默地忽略既不是字符串也不是數字的對象,然後決定不寫任何東西。 – 2015-04-04 16:34:04

+0

@FrancisColas「open」調用本身將創建一個空文件,對象將有一個字符串表示,比如'<__ main __。0x022E02D0處的點對象>''csv'將默認使用(通過相當於'str'算子)。 – 2015-04-04 16:50:16

1

你可以用writerows做到這一點,因爲它預計rows列表 - 每個row格式應爲每dialect參數到csv.writer,在這種情況下可以忽略,不用擔心任何逆火。

因此writerows可以採取看起來像myList結構。問題是你需要訪問所有的點並獲取他們的BMI(這可以在列表理解中完成)

爲了說明如何使用編輯器(並且爲每個點添加一個數字,以便所有的行不只有一個條目(這將是令人沮喪的),我添加了調用枚舉

因此,您不再需要複雜的循環或任何這樣的享受:。

myList = [[Point(30, 183)],[Point(63, 153)]] 

with open('output.csv', 'w') as outfile: 
    writer = csv.writer(outfile) 
    writer.writerows(enumerate(p.get_BMI() for p in itertools.chain.from_iterable(myList))) 
-1
myList = [[Point(30, 183)],[Point(63, 153)]] 

with open('output.csv', 'w') as outfile: 
    writer = csv.writer(outfile,delimiter=',') 
    for i in myList: 
     writer.writerow([i])