shutil没有移动所有文件

时间:2017-01-02 18:07:34

标签: python list shutil

我有一个包含照片的文件夹,我想将照片从该文件夹移动到另一个文件夹。文件:

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)

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

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。

1 个答案:

答案 0 :(得分:7)

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

你从12个名字开始,但是一旦你移动一个名字,你现在只在目录中获得11个名字,然后是10个,当你的x值达到6时,只有6个保留了索引05的名称,因此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()