Как бороться с OSError: [Errno 20] Не каталог: '.DS_Store'?
Я хочу скопировать некоторые изображения из каталога в другой каталог, и вот мой код:
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, но как я могу решить эту ошибку?
5 ответов
Ваша логика кажется сильно нарушенной. Вы перебираете все файлы в каталоге, передавая каждый copyFile
, Но внутри этой функции вы снова пытаетесь перебрать каждый файл в "каталоге", переданном функции: за исключением того, что вы не передаете в функцию только каталоги, вы передаете каждый файл, найденный в исходном каталоге.
Не ясно, что вы пытаетесь сделать, но я думаю, что вам нужно удалить один из этих вызовов listdir
и связанный цикл.
Стоит упомянуть, каков общий смысл ошибки "Не каталог" (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 для такого искаженного пути вы должны получить сообщение "Файл не найден".
Когда вы делаете 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')
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))
Вы можете указать папку с драйверами перед / users и попробовать пример c: / users /d: / users /