在python笔记本中复制图像时出错

时间:2021-04-21 07:52:52

标签: python jupyter-notebook runtime-error shutil

我正在尝试将图像从一个文件复制到我的 ipynb 中的另一个文件,但出现 IsADirectoryError。

import os 
import shutil

f = sorted(os.listdir('/home/jovyan/work/shot/shot/noshot/'))
f1 = sorted(os.listdir('/home/jovyan/work/shot/shot/goodshot/'))
f2 = sorted(os.listdir('/home/jovyan/work/shot/shot/badshot/'))



orders = range(0,800)


for o in orders:
    fi = f[o]
    shutil.copyfile(os.path.join('/home/jovyan/work/shot/shot/noshot/', fi), os.path.join('/home/jovyan/work/training/', fi))
    
for o in orders:
    fi = f1[o]
    shutil.copyfile(os.path.join('/home/jovyan/work/shot/shot/goodshot/', fi), os.path.join('/home/jovyan/work/training/', fi))
    
for o in orders:
    fi = f2[o]
    shutil.copyfile(os.path.join('/home/jovyan/work/shot/shot/badshot/', fi), os.path.join('/home/jovyan/work/training/', fi))

Here is the error I have more than 800 images in each of the files.

2 个答案:

答案 0 :(得分:0)

os.listdir 返回文件和目录,但 shutil.copyfile 只接受文件

您可以通过使用 shutil.copyfile

过滤掉目录来避免将目录传递到 os.path.isfile

为了防止索引超出范围,您可以检查 o 是否大于 f (f1, f2) 的长度,如果是这种情况,则跳出 for 循环

    import os 
    import shutil
    
    f = sorted(os.listdir('/home/jovyan/work/shot/shot/noshot/'))
    f1 = sorted(os.listdir('/home/jovyan/work/shot/shot/goodshot/'))
    f2 = sorted(os.listdir('/home/jovyan/work/shot/shot/badshot/'))

    #fix
    f = [i for i in f if os.path.isfile(os.path.join('/home/jovyan/work/shot/shot/noshot/', i)]
    f1 = [i for i in f1 os.path.isfile(os.path.join('/home/jovyan/work/shot/shot/goodshot/', i)]
    f2 = [i for i in f2 if os.path.isfile(os.path.join('/home/jovyan/work/shot/shot/badshot/', i)]
    
    
    orders = range(0,800)
    
    
    for o in orders:
        if o >= len(f):
            break
        fi = f[o]
        shutil.copyfile(os.path.join('/home/jovyan/work/shot/shot/noshot/', fi), os.path.join('/home/jovyan/work/training/', fi))
        
    for o in orders:
        if o >= len(f1):
            break
        fi = f1[o]
        shutil.copyfile(os.path.join('/home/jovyan/work/shot/shot/goodshot/', fi), os.path.join('/home/jovyan/work/training/', fi))
        
    for o in orders:
        if o >= len(f2):
            break
        fi = f2[o]
        shutil.copyfile(os.path.join('/home/jovyan/work/shot/shot/badshot/', fi), os.path.join('/home/jovyan/work/training/', fi))

答案 1 :(得分:0)


    import shutil
    import os
    import glob

    paths = ['/home/jovyan/work/shot/shot/noshot/',
             '/home/jovyan/work/shot/shot/goodshot/',
             '/home/jovyan/work/shot/shot/badshot/']
    
    dst = '/home/jovyan/work/training/'
    
    for path in paths:
        x = 0
        for filename in glob.glob(os.path.join(path, '*.*')):
            if x < 800:
                shutil.copy2(file, dst)
            x += 1