首页 > 解决方案 > IndexError:列表索引超出范围(shutil)

问题描述

我使用此代码将具有 .png 扩展名的图像从 src 目录(及其子目录)复制并重命名到 dst 目录,但出现此错误。

当我在 Windows 上尝试代码时,它显示权限被拒绝错误,当我在 Ubuntu 上尝试时,它显示此错误,如标题中所述。

import os
import shutil
import pandas as pd
lst_files = []
for dir_name,sub_dir_list, file_list in os.walk('MURA-v1.1/valid    /XR_WRIST/'):         #For all body parts in train & valid sets
    for file_name in file_list:
        if ".png" in file_name.lower():
            lst_files.append(os.path.join(dir_name, file_name))
for i in range (len(lst_files)):
    a, b, c = lst_files[i].split('\\')[0], lst_files[i].split('\\')[1],     lst_files[i].split('\\')[2]
    lst_files[i] = a + '/' + b + '/' + c
    id, bin, img = lst_files[i].split('/')[-3],     lst_files[i].split('/')[-2], lst_files[i].split('/')[-1]
    src = lst_files[i]
    dest = '/home/mahmood/Desktop/MURA-v1.1/valid/WRIST/'
    #os.chdir(dest)
    stt=id+"_"+bin+"_"+img
    shutil.copy(src,dest)
    shutil.move(dest+c,dest+stt)
    #os.rename(img, stt)



Traceback (most recent call last):
  File "Data_restructure.py", line 14, in <module>
    a, b, c = lst_files[i].split('\\')[0], lst_files[i].split('\\')[1],     lst_files[i].split('\\')[2]
IndexError: list index out of range

标签: python-3.xshutil

解决方案


代码中的错误是由于您在 中使用 Linux/Unix 样式路径(具有/作为目录分隔符)os.walk(),并试图替换\它的反斜杠,这通常是不可能的。

您的代码打算做的是:-

  1. 在给定目录中查找并查找文件名中包含.png的文件
  2. 找到一个后,将文件的位置添加到您的列表中lst_files

稍后在您的代码中,您尝试lst_files按字符串拆分列表中文件的位置\,这是不可能的。为什么?

因为,您列表中的目录位置将具有类似于 的语法root_dir/sub_dir/filename.ext,正如您所看到的文件名中没有反斜杠(并且在 Linux 中如何将 a/用作目录分隔符)。因此,当您尝试操作lst_files[i].split('\\')[0]时,总是会出现索引错误,因为字符串永远不会拆分(因为它通常不包含 a \)。

整改:-

如果您打算在 Linux 操作系统上使用此程序,请更改lst_files[i].split('\\')[0]lst_files[i].split('/')[0]

一些改进:-

您使用错误的方法来查找文件是否具有.png扩展名。在您的代码中,如果文件名是abed.png.going.txt(名称中包含.png子句的文本文件),该文件也将被视为.png代码中的文件,这显然是不正确的。而是使用os.path.splitext()它获取文件位置并分别返回包含其文件名及其扩展名的列表。


推荐阅读