Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:将嵌套列表对象写入csv文件_Python_Csv_Nested Lists - Fatal编程技术网

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

Python:将嵌套列表对象写入csv文件,python,csv,nested-lists,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 c

我正在尝试将列表中的数据写入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]中写入值。将\u BMI()
获取到文件。我没有权限问题,因为我使用Spyder(python IDE)作为根。现在我只是通过Spyder控制台运行脚本,但它仍然可以工作并输出CSV文件。

需要一个字符串或数字列表。您应该首先创建一个包含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)

有三个问题:

  • 嵌套列表必须展平。要实现这一点,请使用

  • 必须自定义CSV的行数据。要实现这一点,请使用

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

  • 下面是演示#1和#2的代码:


    您可以使用
    writerows
    ,因为它需要一个
    行的列表
    ——每个
    都应该按照
    方言
    参数格式化为
    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)))
    

    对于第3点,我认为
    csv
    正在默默地忽略既不是字符串也不是数字的对象,然后决定不写任何东西。@FrancisColas
    open
    调用本身将创建一个空文件,并且对象将有一个字符串表示形式,如
    csv
    默认使用的
    (通过
    str
    运算符的等效项)。
    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])