Python:将嵌套列表对象写入csv文件

时间:2015-04-04 15:34:30

标签: python csv nested-lists

我正在尝试将列表列表中的数据写入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文件。

4 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

有三个问题:

  1. 必须展平嵌套列表。要完成此操作,请使用itertools.chain.from_iterable

  2. 必须自定义CSV的行数据。要完成此操作,请使用list comprehensions

  3. 未创建output.csv。我怀疑output.csv正在创建,但被放置在一个意外的位置。您可以尝试硬编码完整路径进行测试,看看是否是这种情况。

  4. 以下是演示#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)
    

答案 2 :(得分:1)

您可以使用writerows执行此操作,因为它需要rows列表 - 每个row应根据dialect参数格式化为csv.writer在这种情况下可以忽略,而不用担心会发生任何反击。

因此writerows可以采用看起来像myList的结构。问题是你需要访问所有的点并获取他们的BMI(这可以在列表理解中完成)

为了说明如何使用writer(并为每个点添加一个数字,以便所有行都没有一个条目(这会令人沮丧),我添加了枚举调用。

因此,您不再需要复杂的循环或任何此类循环。享受:

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)))

答案 3 :(得分:-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])