Python: если имя файла в указанном пути содержит строку, перейдите в папку

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

import os
import shutil
import fnmatch
import glob

ffe_path = 'E:/FFE'
new_path = 'E:/FFE/Membership/letters'
keyword = 'membership'


os.chdir('E:/FFE/Membership')
os.mkdir('letters')



source_dir = 'E:/FFE'
dest_dir = 'E:/FFE/Membership/letters'

os.chdir(source_dir)

for top, dirs, files in os.walk(source_dir):
    for filename in files:
        if not filename.endswith('.docx'):
            continue
        file_path = os.path.join(top, filename)
        with open(file_path, 'r') as f:
            if '*membership' in f.read():
                shutil.move(file_path, os.path.join(dest_dir, filename))

Приветствуется любое понимание.

2 ответа

Решение

Простая функция поможет:

def copyCertainFiles(source_folder, dest_folder, string_to_match, file_type=None):
    # Check all files in source_folder
    for filename in os.listdir(source_folder):
        # Move the file if the filename contains the string to match
        if file_type == None:
            if string_to_match in filename:
                shutil.move(os.path.join(source_folder, filename), dest_folder)

        # Check if the keyword and the file type both match
        elif isinstance(file_type, str):
            if string_to_match in filename and file_type in filename:
                shutil.move(os.path.join(source_folder, filename), dest_folder)

source_folder = полный / относительный путь к исходной папке

dest_folder = полный / относительный путь к целевой папке (необходимо создать заранее)

string_to_match = основа строки, в которую будут скопированы файлы

file_type (необязательно) = если нужно переместить только определенный тип файла.

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

f.readчитает файл. Скорее всего, вы не захотите видеть, есть ли строка в содержимом файла. Я исправил ваш код, чтобы он смотрел на имя файла:

import os
import shutil
import fnmatch
import glob

ffe_path = 'E:/FFE'
new_path = 'E:/FFE/Membership/letters'
keyword = 'membership'


os.chdir('E:/FFE/Membership')
os.mkdir('letters')



source_dir = 'E:/FFE'
dest_dir = 'E:/FFE/Membership/letters'

os.chdir(source_dir)

for top, dirs, files in os.walk(source_dir):
    for filename in files:
        if not filename.endswith('.docx'):
            continue
        file_path = os.path.join(top, filename)
        if '*membership' in filename:
            shutil.move(file_path, os.path.join(dest_dir, filename))
Другие вопросы по тегам