![](/img/trans.png)
[英]How to write a complex nested list to a csv file without brackets in python?
[英]Python: Write nested list objects to csv file
我正在嘗試將列表列表中的數據寫入 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 文件。
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)
存在三個問題:
嵌套列表必須展平。 為此,請使用itertools.chain.from_iterable 。
必須自定義 CSV 的行數據。 要做到這一點,請使用列表理解。
未創建 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)
您可以使用writerows
來做到這writerows
,因為它需要一個rows
列表 - 每row
應該按照csv.writer
的dialect
參數進行csv.writer
,在這種情況下可以忽略它而不必擔心任何適得其反。
所以writerows
可以采用類似於myList
的結構。 問題是您需要訪問所有點並獲取它們的 BMI(這可以在列表理解中完成)
為了說明如何使用 writerows(並為每個點添加一個數字,以便您的所有行都不會只有一個條目(這會令人沮喪),我添加了對 enumerate 的調用。
因此,您不再需要復雜的循環或任何此類。 享受:
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)))
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])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.