Python: Если имя файла в указанном пути содержит строку, то перейти в папку - PullRequest
0 голосов
/ 05 мая 2020

Впервые на 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 ]

2 голосов
/ 05 мая 2020

Простая функция сделает свое дело:

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 (необязательно) = если нужно переместить только определенный тип файла.

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

1 голос
/ 05 мая 2020

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))
...