Есть ли способ разместить файлы в папке на основе совпадающих строк в обоих? - PullRequest
0 голосов
/ 09 мая 2020

Я новичок в python, я использую это как второй опыт, чтобы продолжить свое обучение. Мой первый проект (с использованием pandas для анализа данных) будет сложнее, чем этот, но это будет новая арена, и мне нужна помощь, чтобы начать работу, потому что я даже не знаю, что искать в какой-либо документации.

У меня есть много папок с названиями телешоу в одном каталоге. И у меня есть много файлов с несколькими эпизодами нескольких из этих шоу в другом каталоге. Проблема будет в том, что каждый выпуск сохраняется в папке с тем же названием, когда я его загружаю. До сих пор я организовывал файлы вручную, но сейчас автоматизация была бы хорошей (и хорошим упражнением). Есть ли способ найти в папке «Загрузки» папки, содержащие файлы, содержащие строку, например «Родина», и переместить этот файл (эпизод) в папку с названием «Родина», которая находится в другом каталоге? Мне также нужно сопоставить более одной строки для каждого файла / папки, например «Игра» и «Престолы». Переместить их в каталоги достаточно просто, но получение соответствующих строк - вот где я хотел бы получить некоторое представление. Тогда моей следующей целью было бы l oop по каждому файлу в разделе «Загрузки» и отсортировать его по нужной папке телешоу.

folders = 'list of folders in downloads'
#maybe I need to create a list here or a function that creates a list?

source_dir = "C:\Users\Downloads"
destination_dir = "C:\Users\TV Shows"
for folder_names in folders:
   if folder_name contains destination_name:
   # destination_name will be undefined but this is what i want
   source_path = str(source_dir) + str(file_name) + str(.mp4)
   destination_path = str(destination_dir) + str(file_name) + 
   str(.mp4)
      shutil.move(source_path, destination_path)
   if not:
      do nothing

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

1 Ответ

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

, если у вас много файлов и папок, используйте for -loops для работы с ними.

Вам нужно будет разделить имя файла на слова - split(' ') - и использовать for -l oop для проверки каждого слова отдельно в имени папки и подсчета слов, которые находятся в имени папки. Когда количество равно 2 или больше, переместите файл.

Более или менее:

all_filenames = [
    'Game of Throne part II.mp4',
    'other file.mp4',
]

all_folders = [
    'Game Throne',
    'Other Files'
]

for filename in all_filenames:

    words = filename.lower().split(' ')
    moved = False

    for folder in all_folders:

        count = 0

        for word in words:
            if word in folder.lower():
                count += 1

        if count >= 2:
            print('count:', count, '|', filename, '->', folder)
            # TODO: move file
            moved = True
            break

    if not moved:
        print('not found folder for:', filename)
        # TODO: you could move file to `Other Files`

EDIT: версия, которая получает все совпадающие папки и просит пользователя выберите правильную папку.

Я не тестировал. Для проверки правильности выбора пользователем номера может потребоваться дополнительный код. И, в конце концов, добавить возможность пропустить его и не перемещать файл.

all_filenames = [
    'Game of Throne part II.mp4',
    'other file.mp4',
]

all_folders = [
    'Game Throne',
    'Other Files'
]

for filename in all_filenames:

    words = filename.lower().split(' ')
    matching = []


    for folder in all_folders:

        count = 0

        for word in words:
            if word in folder.lower():
                count += 1

        if count >= 2:
            print('count:', count, '|', filename, '->', folder)
            matching.append(folder)

    #if not matching:
    if len(matching) == 0:
        print('not found folder for:', filename)
        # TODO: you could move file to `Other Files`
    elif len(matching) == 1:
        print('move:', filename, '->', matching[0])
        # TODO: move file to folder matching[0]
    else:
        for number, item in enumerate(matching):
            print(number, item)
        answer = int(input('choose number:'))
        print('move:', filename, '->', matching[answer])
        # TODO: move file to folder matching[answer]
...