Итак, я не уверен, как заставить 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, но я не понимаю, почему, если я передам ему только что найденный путь к файлу, он не будет использовать его в качестве исходного пути для файл для копирования.
Это мой первый класс по программированию на питоне, и действительно мой первый опыт знакомства с питоном, так что любые мысли по обучению будут очень признательны. Большое спасибо.
Ваш текущий код никогда не покидает исходный рабочий каталог. Вы можете убедиться в этом, запустив:
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()
вместо /
для разделителя каталогов.