【问题标题】:List index out of range when writing to file写入文件时列表索引超出范围
【发布时间】: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


【解决方案1】:

不是解决方案(无法评论),但尝试捕获 IndexError 并打印vals[line] 的内容。 vals 是如何创建的? [data1, data2] 是否保证贯穿vals

【讨论】:

  • 我猜vals 可能会导致问题。尝试在不更改其余代码的情况下创建 numpy 数组 vals = np.array(vals),看看是否有帮助。
  • 这是个好主意,解决了问题。我正在使用正则表达式创建列表,但该行出现问题,导致它停止保存列表中的第二个数据点。真的很感激!
猜你喜欢
  • 2021-05-04
  • 1970-01-01
  • 1970-01-01
  • 2017-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-11
  • 2018-12-16
相关资源
最近更新 更多