Как использовать путь к файлу в качестве исходного параметра из os.walk для копирования файлов

Итак, я не уверен, как заставить python использовать путь к файлу, который он нашел с помощью функции os.walk, в качестве параметра source для аргументов shutil.copy(source, destination).

Мой пример кода таков

for folderName, subfolders, filenames in os.walk('/Users/me/Documents'):
    print('The current folder is '+folderName)
    for subfolder in subfolders:
        print('SUBFOLDER OF '+folderName+": "+subfolder)
    for filename in filenames:
        print("FILE INSIDE "+folderName+": "+filename)
        if filename.endswith('.txt'):
            os.chdir(filename)
            shutil.copy(filename, '/Users/me/Documents/School/IT 145/Text Files')
    print("")

Если файл имеет расширение .txt, я бы хотел, чтобы python скопировал этот файл в указанную папку.

Мое сообщение об ошибке, которое я получаю, это

The current folder is /Users/me/Documents/Text Files
FILE INSIDE /Users/me/Documents/Text Files: guest.txt
Traceback (most recent call last):
  File "/Users/me/Documents/School/IT 145/Programming Work/os_walk.py", line 16, in <module>
    os.chdir(filename)
FileNotFoundError: [Errno 2] No such file or directory: 'guest.txt'

Насколько я понимаю, python возвращается в текущий рабочий каталог, чтобы выполнить Shutil.copy, но я не понимаю, почему, если я передам ему только что найденный путь к файлу, он не будет использовать его в качестве исходного пути для файл для копирования.

Это мой первый класс по программированию на питоне, и действительно мой первый опыт знакомства с питоном, так что любые мысли по обучению будут очень признательны. Большое спасибо.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
142
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

print(os.getcwd())

Ваш os.walk() не изменяет текущий каталог (CWD).

Ваша попытка изменить CWD:

os.chdir(filename)

не работает, так как filename — это имя файла, а не каталог.

os.chdir(folderName)

должно сработать.

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

Вместо этого просто добавьте префикс filename к его родительскому каталогу, т. е. folderName, когда вы вызываете shutil.copy().

Например:

shutil.copy(os.path.join(folderName, filename), '/Users/me/Documents/School/IT 145/Text Files')

Боковое примечание для удобства чтения: Поместите '/Users/me/Documents' и '/Users/me/Documents/School/IT 145/Text Files' в именованные переменные, что упрощает чтение, изменение и/или повторное использование при необходимости.

Боковое примечание для переносимости: Старайтесь использовать os.path.join() вместо / для разделителя каталогов.

Другие вопросы по теме