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

时间:2015-04-10 13:58:50

标签: 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更改了我的代码,我感觉有点复杂。那么我哪里错了?

3 个答案:

答案 0 :(得分:1)

问题是您对列表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)以及#34;倒带&#34;文件回到开头。这样效率会降低,因为它需要读者解析整个文件两次。

<强>更新

这是另一个,稍微(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成为列表(zip返回Python 2中的元组和迭代器在Python 3)。

答案 1 :(得分:1)

这应该让您的代码正常工作

import csv

import matplotlib.pyplot as plt
import numpy as np

a, b = [], []
with open("LoggedData_CalInertialAndMag.csv", 'rb') as f:
    reader = csv.reader(f)
    for row in reader:
        a.append(float(row[4]))
        b.append(float(row[5]))

因为你似乎正在使用numpy并提到将它读入数组我假设 像numpy.genfromtxt这样的东西也应该有用

import numpy as np

filename = "LoggedData_CalInertialAndMag.csv"
a = np.genfromtxt(filename, usecols=[4], delimiter=',', dtype=float)
b = np.genfromtxt(filename, usecols=[5], delimiter=',', dtype=float)

答案 2 :(得分:0)

在第二次通话前尝试添加对myfile.seek(0)的通话 https://docs.python.org/2/library/csv.html

read正在读取文件的内容,当您尝试加载b时,所有文件都已加载,因此文件中没有任何内容:)

但更好的方法是同时加载两个,然后你可以将它们分配给不同的数组,而无需再次读取文件(磁盘I / O操作非常昂贵):

a = [[row[4], row[5]] for row in reader]
b = [r[0] for r in a]
c = [r[1] for r in a]