python - 将整个 csv 列加载到数组中?

标签 python csv

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, ...),具体取决于您是否需要ab为列表或not(zip 在 Python 2 中返回一个元组,在 Python 3 中返回一个迭代器)。

关于python - 将整个 csv 列加载到数组中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29563395/

相关文章:

python - 如何在 Pyro v.4.63 中正确使用第三方库

Python String 到列表处理

python - UDF 在 PySpark 中运行两次

c++ - C++ 中快速、简单的 CSV 解析

php - 将数组与 array_diff 进行比较 - 但仅比较第一个字符

python - Pyplot 上的多个 x 标签

python - 定义像 Python "with"语句一样工作的 C 宏有什么缺点?

c++ - 使用 .csv 读取将数组类型字符串转换为 double

csv - Pandas read_csv 和 UTF-16

javascript - 将字节顺序标记添加到通过 PapaParse 解析的 CSV