Я хочу скопировать некоторые изображения из каталога в другой каталог, и вот мой код:

import os.path
import shutil

def copyFile(sourceDir,targetDir):
    for files in os.listdir(sourceDir):
        sourceFile=os.path.join(sourceDir,files)
        if os.path.isfile(sourceFile) and sourceFile.find('.jpg')>0:
            shutil.copy(sourceFile,targetDir) 

for i in os.listdir('/Users/liuchong/Desktop/LFW/new'):

    copyFile(i,'/Users/liuchong/Desktop/LFW/lfw')  

Но когда я запускаю его, терминал говорит мне, что OSError: [Errno 20] Not a directory: '.DS_Store' Я знаю, что DS_dstore - это скрытый файл в Mac, но как я могу решить эту ошибку?

0
Liu Chong 7 Янв 2017 в 16:49

4 ответа

Лучший ответ

Ваша логика кажется сильно нарушенной. Вы перебираете все файлы в каталоге, передавая каждый из них copyFile. Но внутри этой функции вы снова пытаетесь перебирать каждый файл в «каталоге», передаваемом функции: за исключением того, что вы не передаете в каталог только каталоги, вы передаете каждый найденный файл в оригинальном каталоге.

Непонятно, что вы пытаетесь сделать, но я думаю, что вам нужно удалить один из этих вызовов listdir и связанный цикл.

0
Daniel Roseman 7 Янв 2017 в 13:56
os.listdir('/Users/liuchong/Desktop/LFW/lfw')

Возвращает список, содержащий имена записей в каталоге, заданном пользователем. Список основан на случайном выборе.

Для решения этой проблемы (я знаю, что я опоздал) вот python 3 совместимый код: -

import time
import os
from shutil import copyfile

def Copyfile(in_path, out_path, quantity = None):

    filelist = os.listdir(in_path)
    counter = 0
    print("Copying to %r directory. Please wait... " % out_path)

    start = time.time()

    for i in range(quantity):
        copyfile(filelist[i], out_path+filelist[i])
        counter+=1
        sys.stdout.write("\rTotal images copied : %r" % counter)
        sys.stdout.flush()   

    end = time.time()
    print("This move operation took %r seconds to run." %(end - start))
0
WaterRocket8236 23 Ноя 2017 в 05:33

Когда вы делаете os.listdir('/Users/liuchong/Desktop/LFW/lfw'), он возвращает и каталоги, и файлы. Вы должны проверить запись для каталога, прежде чем передать его в качестве аргумента.

def copyFile(sourceDir,targetDir):
    for files in os.listdir(sourceDir):
        sourceFile=os.path.join(sourceDir,files)
        if os.path.isfile(sourceFile) and sourceFile.find('.jpg')>0:
            shutil.copy(sourceFile,targetDir)

for i in os.listdir('/Users/liuchong/Desktop/LFW/lfw'):
     if os.path.isdir(i):
         i = os.path.join( '/Users/liuchong/Desktop/LFW/lfw', i)
         copyFile(i,'/Users/liuchong/Desktop/LFW/lfw')
0
franklinsijo 8 Янв 2017 в 03:00

Стоит упомянуть, что является общим значением ошибки «Не каталог» (Errno 20). Это означает, что вы пытаетесь оперировать с путем, который является реальным файлом, а не каталогом. То есть это неправильный, неправильный путь.

Пример: file.txt / test.txt, где file.txt - это существующий истинный файл (не каталог).

Python будет возвращать эту ошибку для каждой операции ввода-вывода с таким файлом:

$ python -c 'import os; os.path.getsize("file.txt/test.txt");'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/usr/lib/python2.7/genericpath.py", line 57, in getsize
    return os.stat(filename).st_size
OSError: [Errno 20] Not a directory: 'file.txt/test.txt'

ОС также вернет эту ошибку:

$ stat file.txt/test.txt
stat: cannot stat 'file.txt/test.txt': Not a directory

Каждый раз, когда у вас появляется эта ошибка, это означает, что вы объединяете файл + файл где-то в вашей программе.

Эта ошибка специфична для ОС Unix. В Windows вы должны получить «Файл не найден» для такого неправильного пути.

1
Alexander Samoylov 17 Окт 2019 в 14:40