【问题标题】:Python list index out of range error?Python列表索引超出范围错误?
【发布时间】:2014-01-03 14:48:18
【问题描述】:

我有一个 python 脚本,它获取文本文件的最后一行并将其拆分。一些用户一直在给我发电子邮件说列表索引超出范围错误不断弹出。这是相关代码:

if Data.closed == True:
    Data = open("Data.txt", "r")
#
lines = len(Data.readlines())
Data.close()

Data = open("Data.txt", "r")
if lines > 1:
    for x in range(0, lines):
        lastLine = Data.readline()
    #   

else:
    fatalError("ERROR:Map file has no data!!", True)            
#               
lastLineBroken = lastLine.split("|")
lstLnBrokLen = len(lastLineBroken)
lat = lastLineBroken[0]
lon = lastLineBroken[1]
Data.close()

【问题讨论】:

  • 什么是lines?这显然不是您的全部代码。
  • 错误出现在哪一行?如果lastline中没有'|'lon = lastLineBroken[1]会报错。
  • 对不起!我忘记了那部分。已添加
  • 你应该 use the with statement 在 Python 中处理文件,这是一种非常糟糕的迭代文件的方法——文件是迭代器,直接循环它!使用您当前的方法,您必须读取整个文件两次才能循环遍历它!

标签: python list indexing


【解决方案1】:

要获取最后一行并通过纬度/经度拆分它,然后尝试:

from collections import deque

with open('yourfile') as fin:
    last = deque(fin, 1)
    try:
        lat, lon = last[0].split('|', 3)[:2]
    except (IndexError, ValueError):
        pass # uh oh... no line, or no data in it...

如果您有一个非常大的文件并且不喜欢遍历它,那么另一种方法(尽管从它的外观来看很可能是矫枉过正):

import mmap

with open('yourfile') as fin:
    try:
        mm = mmap.mmap(fin.fileno(), 0, access=mmap.ACCESS_READ)
        last_line = mm[mm.rfind('\n') + 1:]
        lat, lon = last_line.split('|', 3)[:2]
    except (ValueError, IndexError):
        pass # uh oh....

【讨论】:

  • +1 - deque 是获取文件最后一行的最佳方式。它会快速迭代。
  • lat 和 lon 用 | 隔开
  • 我试过这个pastebin.com/TvXddGhn,但它抛出了错误。这是数据文件pastebin.com/qJ5k5nrG
  • @user3157628 首先,检查它是否已关闭然后重新打开它很奇怪 - 并且可能导致问题(它是否以正确的模式打开?) - 只需直接在 with 语句中打开它无论如何,它将正常工作。还值得注意的是,如果您认为文件可能已打开或已关闭,则表明存在问题 - 在代码中使用 with 语句应确保您确切知道它的打开或关闭位置(并确保它正确关闭)。
  • @lattyware 我尝试了另一种方法,但它仍然给了我错误。
【解决方案2】:

您可能应该添加一个检查,以确保将行分成足够多的部分:

if len(lastLineBroken) >= 2:
    lat, lon = lastLineBroken[:2]

【讨论】:

    【解决方案3】:

    可以直接获取列表的最后一个元素(最后一行)

       lines = Data.readlines()
       if lines:
           lastLine = lines[-1]
    

    【讨论】:

    • 虽然比 OP 的方法更好,但这仍然是一种不好的方法 - 它需要将整个文件读入内存。显而易见的解决方案是 for lastLine in data: pass,它将填充 lastLine,但是,这将比 Jon Clement 的解决方案 - deque 慢,这是最好的方法。
    • 确实如此。双端队列是最好的方法。
    猜你喜欢
    • 2021-05-12
    • 1970-01-01
    • 2016-01-06
    • 2014-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多