我有一个大约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)
有任何想法吗?
编辑非常感谢您的快速回复!现在我想起来,这对我来说是一个愚蠢的疏忽.再次,谢谢大家.:)
来自文档:
修改循环中迭代的序列是不安全的(这只能发生在可变序列类型中,例如列表).如果您需要修改正在迭代的列表(例如,复制所选项目),则必须迭代副本.
对于您的情况,我实际上建议使用生成器表达式itertools.ifilter,以避免为您的大文件列表制作不必要的副本.