Как исправить FileNotFoundError в скрипте перемещения файлов, когда он читает имена файлов? - PullRequest
1 голос
/ 10 мая 2019

Мой скрипт Python читает первые два символа файла, создает папку с именем этих первых двух символов, а затем создает подпапку с именем 3-й и 4-й символы. Затем он копирует файл в две подпапки подпапки с именем image и thumb. Но даже если он правильно читает имена файлов, он вызывает FileNotFoundError, когда я пытаюсь использовать shutil.copy().

import shutil
import os
from pathlib import Path

assets_path = Path("/Users/Jackson Clark/Desktop/uploads")
export_path = Path("/Users/Jackson Clark/Desktop/uploads")

source = os.listdir(assets_path)

'''
NOTE: Filters.js is the important file
The logic:
    - Go through each file in the assets_path directory
    - Rename the files to start with RoCode (this could be a seperate script)
    - Create a new directory with the first four characters of the files name
    - Create two sub directories with the names 'image' and 'thumb'
    - Copy the file to both the 'image' and 'thumb' directories
    That should be all, but who knows tbh
Good links:
    - https://www.pythonforbeginners.com/os/python-the-shutil-module
    - https://stackabuse.com/creating-and-deleting-directories-with-python/
'''
for f in source:
    f_string = str(f)
    folder_one_name = f_string[0:2]
    folder_two_name = f_string[2:4]

    path_to_export_one = os.path.join(export_path, folder_one_name)
    path_to_export_two = os.path.join(export_path, folder_one_name,
                                      folder_two_name)

    try: 
        os.mkdir(path_to_export_one)
        os.mkdir(path_to_export_two)
        os.mkdir(os.path.join(path_to_export_two, "image"))
        os.mkdir(os.path.join(path_to_export_two, "thumb"))
        shutil.copy(f, os.path.join(path_to_export_two, "image"))
        shutil.copy(f, os.path.join(path_to_export_two, "thumb"))
    except FileExistsError as err:
        try:
            shutil.copy(f, os.path.join(path_to_export_two, "image"))
            shutil.copy(f, os.path.join(path_to_export_two, "thumb"))
        except FileNotFoundError as err:
            print("FileNotFoundError2 on " + f + " file")
    except FileNotFoundError as err:
        print("FileNotFoundError1 on " + f + " file")

1 Ответ

0 голосов
/ 10 мая 2019

f, который вы используете, представляет собой простую строку типа "readme.txt".Это связано с тем, что os.listdir() возвращает список записей данного каталога, каждая запись - это просто имя в этого каталога (не полный путь).Ваш сценарий, вероятно, не запускается в этом каталоге, поэтому доступ к readme.txt не работает.

Я предлагаю просто добавить путь к f.

Кстати, Path объекты из pathlib знают оператора /, поэтому вы можете написать свой код более читабельным образом, например:

path_to_export_one = export_path / folder_one_name
path_to_export_two = path_to_export_one / folder_two_name
...
f_path = assets_path / f
...
shutil.copy(f_path, path_to_export_two / 'image')
...