Я написал функцию, подобную приведенной ниже:
def separate_files(filetree_list, destination):
from shutil import copyfile
from os import makedirs
from os.path import join, exists, commonprefix
try:
for file in filetree_list:
dst = join(destination,
'\\'.join(file.split(commonprefix(filetree_list))[1].split('\\')[0:-1]))
if not exists(dst):
print(dst, " doesn`t exist. Creating...")
makedirs(dst)
print(exists(dst), ". Path created.")
print(file)
copyfile(file, dst)
except:
print("Moving files has FAILED.")
else:
print("Moving files was SUCCESSFUL.")
Когда я вызываю ее со списком «filetree_list», содержащим один элемент и назначение, подготовленное с помощью os.path.join:
filetree_list = ['C:\\Users\\<username>\\staging_folder\\folder_1\\filename.xlsx']
destination = os.path.join(staging_dir, 'Sorted', 'Unwanted_files')
Я получаю следующую ошибку:
---------------------------------------------------------------------------
FileNotFoundError Traceback (most recent call last)
<ipython-input-29-c3525a60c859> in <module>()
14 print(exists(dst), ". Path created.")
15 print(file)
---> 16 copyfile(file, dst)
C:\ProgramData\Anaconda3\lib\shutil.py in copyfile(src, dst, follow_symlinks)
119 else:
120 with open(src, 'rb') as fsrc:
--> 121 with open(dst, 'wb') as fdst:
122 copyfileobj(fsrc, fdst)
123 return dst
FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\<username>\\staging_folder\\Sorted\\Unwanted_files\\'
Что странно в этом (и это сводит меня с ума в данный момент), это то, что эта папка определенно существует и была создана "ifблок «не существует (dst)» в функции Отдельные_файлы - я даже вижу его в проводнике Windows!
Чтобы добавить оскорбление травме, когда я запускаю эту функцию с тем же аргументом назначения, но несколькими строками в списке,он делает то, что я ожидаю, и ошибок нет!
Кто-нибудь может подсказать, что я делаю здесь неправильно?
ОБНОВЛЕНИЕ: обновлен код выше, чтобы отразить функцию в моей IDE.Ошибка отступа рядом с print (file) и copyfile (file, dst) была исправлена, чтобы включить ее в цикл.Аргумент dst функции copyfile () также был изменен на «dst», а не на join (назначение, file.split (commonprefix (filetree_list)) [1]).