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)
它不会 return 任何错误,但它实际上也不会创建 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 的行数据。为此,请使用 list comprehensions.
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
执行此操作,因为它需要 rows
的列表 - 每个 row
应根据 dialect
参数格式化为 [=15] =],在这种情况下可以忽略而不用担心适得其反。
所以 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])
我正在尝试将列表列表中的数据写入 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)
它不会 return 任何错误,但它实际上也不会创建 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 的行数据。为此,请使用 list comprehensions.
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
执行此操作,因为它需要 rows
的列表 - 每个 row
应根据 dialect
参数格式化为 [=15] =],在这种情况下可以忽略而不用担心适得其反。
所以 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])