Поиск правильного пути к файлам в подпапках с os.walk с python?

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

Мой код выглядит следующим образом

# Selective_copy.py walks through file tree and copies files with
# certain extension to give folder
import shutil
import os
import re

# Deciding the folders and extensions to be targeted
# TODO: user input instead of static values
extension = "zip"
source_folder = "/Users/viliheikkila/documents/kooditreeni/"
destination_folder = "/Users/viliheikkila/documents/test"

def Selective_copy(source_folder):
    # create regex to identify file extensions
    mo = re.compile(r"(\w+).(\w+)")  # Group(2) represents the file extension
    for dirpath, dirnames, filenames in os.walk(source_folder):
        for i in filenames:
            if mo.search(i).group(2) == extension:
                file_path = os.path.abspath(i)
                print("Copying from " + file_path + " to " + destination_folder)
                shutil.copy(file_path, destination_folder)

Selective_copy(source_folder)

person ananaa    schedule 25.09.2016    source источник
comment
Заранее спасибо всем!   -  person ananaa    schedule 25.09.2016
comment
Предоставьте подробную информацию об этих сбоях.   -  person Scott Hunter    schedule 25.09.2016
comment
Первое, что я замечаю, это то, что вы не избежали . в вашем регулярном выражении... Пожалуйста, помните это. соответствует ВСЕМ в регулярных выражениях. Если вы хотите сопоставить только фактический символ точки ., вам нужно экранировать его с помощью \ like так: \.   -  person Nadia Cerezo    schedule 25.09.2016
comment
Надя, спасибо за напоминание. На самом деле я пытался использовать побег с регулярным выражением, и когда я это делаю, код вообще не работает. В текущем состоянии регулярное выражение работает.   -  person ananaa    schedule 25.09.2016
comment
Скотт, я получаю сообщение об ошибке: FileNotFoundError: [Errno 2] Нет такого файла или каталога: '/Users/viliheikkila/Documents/Kooditreeni/bacon.zip' Vilis-MBP:kooditreeni viliheikkila$ Это связано с тем, что файла действительно нет называется bacon.zip корневой папкой, поскольку на самом деле он находится в подпапке.   -  person ananaa    schedule 25.09.2016


Ответы (2)


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

person Scott Hunter    schedule 25.09.2016
comment
Спасибо, Скотт! Мне удалось исправить код. Как Лукаш ниже заявил, что file_path был неправильным. Я изменил его на file_path = dirpath + "/" + i, и теперь код работает как часы. - person ananaa; 26.09.2016

file_path = os.path.abspath(i)

Эта линия явно неверна. Имейте в виду, что filenames хранит список имен базовых файлов. На данный момент это просто список строк, и (технически) они вообще не связаны с файлами в файловой системе.

os.path.abspath выполняет операции только со строками и пытается объединить имя файла с текущий рабочий каталог. В результате объединенное имя файла указывает на файл, который не существует.

Что нужно сделать, так это объединить root и базовое имя файла (оба значения получаются из os.walk):

file_path = os.path.abspath(dirpath, i)
person Łukasz Rogalski    schedule 25.09.2016
comment
Спасибо Лукаш! Я изменил file_path, и теперь код работает нормально. Я использовал file_path = dirpath + "/" + i, и он отлично работает - person ananaa; 26.09.2016