Skip to main content
 首页 » 编程设计

python之shutil 没有移动所有文件

2025年05月04日16zhoujg

我有一个文件夹,里面有照片,我想将照片从那个文件夹移动到另一个文件夹。文件:

IMAG_01.JPG 
IMAG_02.JPG 
IMAG_03.JPG 
IMAG_04.JPG 
IMAG_05.JPG 
IMAG_06.JPG 
IMAG_07.JPG 
IMAG_08.JPG 
IMAG_09.JPG 

我的代码:

import os.path 
import shutil 
src = '/var/www/html/uploads/' 
dst = '/media/pi/external/Photos/' 
num_files = len([f for f in os.listdir(src)]) 
print(num_files) 
for x in range(num_files): 
    print(x) 
    picture = (os.listdir(src)[x]) 
    print(picture) 
    shutil.move(src+picture,dst+picture) 

当我运行代码时,它会占用一半的文件,然后在 picture = (os.listdir(src)[x] 上给我一个 index out of range 错误)。输出如下:

12 
0 
IMAG_04.jpg 
1 
IMAG_07.jpg 
2 
IMAG_01.jpg 
3 
IMAG_02.jpg 
4 
IMAG_09.jpg 
5 
IMAG_08.jpg 
6 
Traceback (most recent call last): 
  File "upload.py", line 11, in <module> 
    picture = (os.listdir(src)[x]) 
IndexError: list index out of range 

我知道它告诉我 x 不在列表中,但我不明白为什么会抛出错误,因为它应该从 0 开始到 8。

请您参考如下方法:

你把事情搞得太复杂了。您在移出文件时反复调用 os.listdir()。因此,您的结果列表每次都会变得越来越短。

一开始有 12 个名字,但是一旦你移动了一个,你现在在目录中只有 11 个名字,然后是 10 个,当你的 x 值达到 6,只剩下 6 个名称,索引为 0 到 5,因此 os.listdir()[x] 失败并返回 IndexError 异常。

您不需要长度,也不需要使用 range()。调用 os.listdir() 一次,然后循环结果:

import os.path 
import shutil 
 
src = '/var/www/html/uploads/' 
dst = '/media/pi/external/Photos/' 
 
for picture in os.listdir(src): 
    print(picture) 
    shutil.move(os.path.join(src, picture), os.path.join(dst, picture)) 

现在您在开始时有了一个包含所有名称的完整列表,for 循环将这些名称一一分配给 picture 变量。这些名称被移出不再重要,因为我们不再调用 os.listdir()。