【发布时间】:2016-05-29 17:48:49
【问题描述】:
我正在尝试解析 CSV 文件以获取三个特定的数据列。该文件非常大(135MB)。我已将必要的数据按格式放入列表中
vals = [[data1,data2],[data1,data2],...]].
这是我用来写入单独 CSV 的函数:
def write_file(run_name,input_name,start_time,dt,vals):
with open(run_name,'w') as f:
f.write("Time,%s,%s\n" % (input_name[0],input_name[1]))
f.write("%.6f,%s,%s\n" % (start_time,str(float(vals[0][0])),str(float(vals[0][1]))))
nextTime = start_time + dt
for line in vals:
f.write("%.6f,%s,%s\n" % (nextTime,str(float(line[0])),str(float(line[1]))))
nextTime = nextTime + dt
print("Done writing")
其中 run_name 是新的 CSV 名称,input_name 是通道名称(data1,data2),开始时间以秒为单位,dt 是数据点之间的时间增量,vals 是值列表。出于某种原因,每当我运行此代码时,我都会得到:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "tdmsParse.py", line 59, in write_file
f.write("%.6f,%s,%s\n" % (nextTime,str(float(line[0])),str(float(line[1]))))
IndexError: list index out of range
当我将第 59 行替换为以下内容时,情况仍然如此:
def write_file(run_name,input_name,start_time,dt,vals):
with open(run_name,'w') as f:
f.write("Time,%s,%s\n" % (input_name[0],input_name[1]))
f.write("%.6f,%s,%s\n" % (start_time,str(float(vals[0][0])),str(float(vals[0][1]))))
nextTime = start_time + dt
for i in range(1,len(vals)):
f.write("%.6f,%s,%s\n" % (nextTime,str(float(vals[i][0])),str(float(vals[i][1]))))
nextTime = nextTime + dt
print("Done writing")
vals 的长度为 5550000。该函数适用于前 437294 个数据点,但表示超出范围。上述两个函数每次都在文件大小正好为 16,536 KB 时停止写入。我不确定这里到底发生了什么。也许存在某种我看不到的内存问题。任何帮助将不胜感激。
【问题讨论】:
-
在循环之前放一个
print vals行,在循环中放一个print i。 vals 可能是错误的形状 - 即可能是一个额外的嵌套列表。 -
注意到您的代码中有一些不一致的地方。例如,函数第 3 行中的
input未定义。同样,函数中的startTime也没有定义。所以你可能一直在使用一些全局变量而不知道它。尝试解决这些问题,然后重试。至少它可以在我的计算机上运行,使用我自己的虚拟输入和指定大小的vals。 -
为了可读性,我搞砸了参数,我会编辑
标签: python list python-2.7 csv indexing