import csv
import numpy as np
import matplotlib.pyplot as plt
myfile = open('LoggedData_CalInertialAndMag.csv', 'rt')
reader = csv.reader(myfile)
next(reader)
a = [row[4] for row in reader]
b = [row[5] for row in reader]
所以这是我的代码的开头,我试图将整个列从 csv 文件加载到数组中,并稍后将它们转换为 float
以供其他用途。
但是,我遇到了错误,因此我分别检查了 len(a) 和 len(b) 。虽然 len(a)
的长度是 838,而 len(b)
应该具有相同的长度,但它是 0。
append
更改了代码,我觉得这有点复杂。那么我哪里可能错了?
最佳答案
问题是您对列表 a
的第一个列表理解在迭代时“消耗”了 csv 文件,因此列表 b
的列表理解为空。虽然不如列表推导式简洁,但我建议您同时创建两个列表。另请注意,为 csv
模块打开 csv 文件的正确方法取决于您使用的 Python 版本。
import collections
import csv
import sys
csv_read_args = ({'mode': 'rb'} if sys.version_info[0] < 3 else
{'mode': 'r', 'newline': ''})
with open('LoggedData_CalInertialAndMag.csv', **csv_read_args) as myfile:
reader = csv.reader(myfile)
next(reader)
a, b = [], []
# feed generator expression into a zero-length deque to consume it
generator = ((a.append(row[4]), b.append(row[5])) for row in reader)
collections.deque(generator, maxlen=0)
这样做的另一种方法是在两个列表理解语句之间执行 myfile.seek(0)
将文件“倒带”回开头。这会降低效率,因为它需要读者解析整个文件两次。
更新
这是另一种稍微快一点(8%-10%)的替代方案:
with open('LoggedData_CalInertialAndMag.csv', **csv_read_args) as myfile:
reader = csv.reader(myfile)
next(reader)
a, b = map(list, zip(*[(row[4], row[5]) for row in reader]))
您可能不需要最终的map(list, ...)
,具体取决于您是否需要a
和b
为列表或not(zip
在 Python 2 中返回一个元组,在 Python 3 中返回一个迭代器)。
关于python - 将整个 csv 列加载到数组中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29563395/