2015-04-04 143 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])