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
更改了我的代码,我感觉有点复杂。那么我哪里错了?
答案 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, ...)
,具体取决于您是否需要a
和b
成为列表(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]