簡體   English   中英

Python:將嵌套列表對象寫入 csv 文件

[英]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)

存在三個問題:

  1. 嵌套列表必須展平。 為此,請使用itertools.chain.from_iterable

  2. 必須自定義 CSV 的行數據。 要做到這一點,請使用列表理解

  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)

您可以使用writerows來做到這writerows ,因為它需要一個rows列表 - 每row應該按照csv.writerdialect參數進行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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM