【问题标题】:getting IndexError: list index out of range after execution获取IndexError:执行后列表索引超出范围
【发布时间】:2018-05-10 16:08:59
【问题描述】:

添加了文本代码,很抱歉给您带来不便,我只是想在我的帖子中包含终端输出。

edit2:删除了所有图像,这是我最新的代码+文本格式的输入/输出,我在输入文件中发现了错误但我无法用代码修复它,末尾有一个完全空的行当我手动编辑文件并退格以将其删除时,该文件代码工作正常,无论如何解决这个问题是我的 csv 文件是由 airodump 自动生成的,我不知道我是否可以控制它们的格式。

#!/usr/bin/env python

import time
import csv

#def nonblank_lines(f):
#   for l in f:
#       line = l.rstrip()
#       if line:
#           yield line

with open('root-01.csv', 'r') as csv_file:
csv_reader = csv.reader(csv_file)
with open('station_value.csv', 'w') as station_file:
    csv_writer = csv.writer(station_file, delimiter = ',')
    for skip in range(4):
        next(csv_reader)
    for line in csv_reader:
        csv_writer.writerow(line)

with open('station_value.csv', 'r') as csv_file2:
#   for line in nonblank_lines(csv_file2):
csv_reader2 = csv.reader(csv_file2)
with open('pwr_value.csv', 'w') as pwr_file:
    csv_writer2 = csv.writer(pwr_file, delimiter = ',')
    for line in csv_reader2:
        try:    
            print(line)     
            csv_writer2.writerow([line[3]])
        except Exception as details:
            print('Invalid data:',line,'rejected due to',details)

这是我的文本格式输入文件:

root-01.csv

BSSID, First time seen, Last time seen, channel, Speed, Privacy, Cipher, Authentication, Power, # beacons, # IV, LAN IP, ID-length, ESSID, Key

1C:5F:2B:0A:02:58, 2017-12-02 04:01:06, 2017-12-02 04:02:34,  6,  54, WPA2, CCMP TKIP,PSK, -85,      654,      155,   0.  0.  0.  0,   6, Halbos, 



Station MAC, First time seen, Last time seen, Power, # packets, BSSID, Probed ESSIDs

40:40:A7:67:90:0E, 2017-12-02 04:01:16, 2017-12-02 04:02:33,  -1,       63, 1C:5F:2B:0A:02:58,

80:3F:5D:F9:1F:AB, 2017-12-02 04:01:22, 2017-12-02 04:02:09,   0,      557, 1C:5F:2B:0A:02:58,

station_value.csv

Station MAC, First time seen, Last time seen, Power, # packets, BSSID, Probed ESSIDs

40:40:A7:67:90:0E, 2017-12-02 04:01:16, 2017-12-02 04:02:33,  -1,       63, 1C:5F:2B:0A:02:58,

80:3F:5D:F9:1F:AB, 2017-12-02 04:01:22, 2017-12-02 04:02:09,   0,      557, 1C:5F:2B:0A:02:58,

pwr_value.csv

 Power

  -1

   0

获取 station_value.csv 工作正常,当我想从 statio_value.csv 获取 line[3] 的值并将其写入新文件 pwr_value.csv 时,问题就出现了(据我所知),因为有站文件末尾的额外行与前一行的大小不同。我试图获取堆栈跟踪但无法作为调试工具在我打开堆栈跟踪时一直显示空白区域。

我也不明白为什么即使有错误仍然会产生pwr_value文件?

【问题讨论】:

标签: python list csv indexoutofboundsexception


【解决方案1】:

我必须在这里做一些假设,因为您没有发布堆栈跟踪,也没有发布示例数据文件。但是唯一可能出现该错误的地方是第 9 行,而您得到该错误的唯一原因是因为您希望 csv 文件有 4 列,并且文件的一行(猜测是最后一行)确实不是。我怀疑您的输入文件末尾有一个尾随空行,但它可能是中间的 duff 数据。 print 语句(正如 timgeb 建议的那样)会很好,但您也可以在代码中放置一个永久性验证陷阱,例如,

for line in csv_reader:
    try:
        print(line[3])
    except Exception as details:
        print('Invalid data:',line,'rejected due to',details)

【讨论】:

  • 感谢您的回复,我已将 csv 文件包含在帖子中,它最初存在但我删除了它,因为它还有显然不允许的代码,对于任何不便,我们深表歉意。跨度>
  • 那不是输入,是输入的图片。不允许您的代码图片的原因是我们无法运行它们。出于同样的原因,输入的图片没有任何用处。您的程序需要的是 ascii 数据,而不是图片。正如我所指出的,您报告的问题几乎可以肯定是在数据中,而不是在代码中。将您的输入作为代码发布,将您的输出作为代码发布,并报告您收到的整个错误消息,包括堆栈跟踪。否则无法重现您的问题。
  • 你的猜测是绝对正确的“你得到这个的唯一原因是因为你期望 csv 文件有 4 列和文件的一行(猜测,最后一)没有。”我手动编辑了我的输入文件并且代码有效,但是有没有办法做到这一点,例如最后一行被忽略或不考虑(可能从列表末尾删除)?
  • 嗯,是的。如果您想忽略空白行,请检查每一行以查看它是否为空白,然后再假设它不是。 try...except 子句可以做到这一点,但如果您知道该行将是空白的并且不希望出现错误消息,那么请更改代码,使其不假定 line[3] 存在。例如,if len(line) < 3: continue
  • 非常感谢您的时间和精力,我能够解决错误并将您的答案标记为解决方案,您在我提问的方式中指出错误的耐心令人印象深刻,一次再次感谢:)
猜你喜欢
  • 2015-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-31
  • 2015-06-26
  • 1970-01-01
相关资源
最近更新 更多