尝试浏览大型列表时的Python IndexError

nes*_*esv 3 python

我有一个大约200 000多个对象的列表,每个对象代表一个文件(但实际上没有文件的内容,只有完整的路径名和日期).

我正在编写的程序会复制这些文件的任何子集,具体取决于用户提供的日期范围.我首先创建源目录中所有文件的列表(使用glob模块),创建我的文件表示类的实例并将该实例添加到列表中,如下所示:

for f in glob.glob(srcdir + "/*.txt"):
    LOG_FILES.append(LogFile(f))
Run Code Online (Sandbox Code Playgroud)

现在,为了快速复制文件和清除代码块,我删除了不适合日期范围的LogFile对象.

for i in xrange(0, len(LOG_FILES)):
    if LOG_FILES[i].DATE < from_date or LOG_FILES[i].DATE > to_date:
        del(LOG_FILES[i])
Run Code Online (Sandbox Code Playgroud)

之后,我可以复制列表中剩下的文件:

for logfile in LOG_FILES:
    os.copy(logfile.PATH, destdir)
Run Code Online (Sandbox Code Playgroud)

问题出现在for i in xrange...示例中:当值i达到63792 时,我会抛出一个IndexError .

IndexError: list index out of range.
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

编辑非常感谢您的快速回复!现在我想起来,这对我来说是一个愚蠢的疏忽.再次,谢谢大家.:)

Wil*_*hen 7

来自文档:

修改循环中迭代的序列是不安全的(这只能发生在可变序列类型中,例如列表).如果您需要修改正在迭代的列表(例如,复制所选项目),则必须迭代副本.

对于您的情况,我实际上建议使用生成器表达式itertools.ifilter,以避免为您的大文件列表制作不必要的副本.