Создание папок из имен файлов, используя только часть имени файла - PullRequest
0 голосов
/ 26 сентября 2019

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

WS1_APAL4900.pdf
WS1_APAL4900_A.pdf
WS1_APAL4900_B.pdf
WS1_APAL4900_C.pdf
WS1_CANM0901.pdf
WS1_CANM0901_A.pdf
WS2_CANM0901.pdf
WS2_CANM0901_A.pdf
WS3_CANM0901.pdf
WS3_CANM0901_A.pdf
WS3_CONT6565.pdf

Моя цель - разделить имена файлов в разделителях подчеркивания / s на 2 или 3 строки и взятьтолько вторая слева, которая содержит строку из 8 слов / цифр и создает из нее новые папки с таким именем: «MFMO1720», независимо от того, является ли оно именем с 2 или 3 строками.Теперь все файлы, которые имеют 8-символьную букву справа от первого подчеркивания слева, независимо от того, имеют ли они ИЛИ с именами _A, _B и т. Д., Должны быть перемещены в новую папку с 8-символьным символом.name.

На данный момент, когда я запускаю код, файлы с '_x' собраны все в одной папке (то есть папка 'APAL4900' содержит в себе 'WS1_APAL4900_A.pdf', 'WS1_APAL4900_B.pdf' и 'WS1_APAL4900_C.pdf », но не« WS1_APAL4900.pdf »).Файлы, которые НЕ имеют _A, _B, _C и т. Д., Попадают в папку с расширением .pdf в своем имени, т.е.«APAL4900.pdf» содержит только один файл (WS1_APAL4900.pdf).

Я пробовал split () и rsplit (), а также другие методы разбиения, но ни один из них не помогает мне получить все файлы с одинаковыми 8-характер к той же папке.

Любая помощь будет оценена!

Вот код:


folder = 'C:/test'

for file_path in glob.glob(os.path.join(folder, '*.*')):
    new_dir = file_path.rsplit('_', 2)[1]
    try:
        os.mkdir(os.path.join(folder, new_dir))
    except WindowsError:
        # Handle the case where the target dir already exist.
        pass
    shutil.move(file_path, os.path.join(new_dir, os.path.basename(file_path)))```



Ответы [ 3 ]

0 голосов
/ 26 сентября 2019

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

import re
new_dir = re.split("_([a-zA-Z0-9]*)(_|\.)", file_path)[1]

Это регулярное выражение в основном делает следующее:

  • _ соответствует символу _
  • [a-zA-Z0-9]* соответствует 0 или более символам в диапазоне az, AZ или 0-9
  • _|\. соответствует символу _ или.

, который будет выводить:

APAL4900
APAL4900
APAL4900
APAL4900
CANM0901
CANM0901
CANM0901
CANM0901
CANM0901
CANM0901
CONT6565

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

0 голосов
/ 26 сентября 2019

Отлично работает Хавьер.Вот окончательный код:


folder = 'C:/Test'

for file_path in glob.glob(os.path.join(folder, '*.*')):
    new_dir = file_path.replace('.', '_').replace(' ', '').split('_')[1]
    try:
        os.mkdir(os.path.join(folder, new_dir))
    except WindowsError:
        # Handle the case where the target dir already exist.
        pass
    shutil.move(file_path, os.path.join(new_dir, os.path.basename(file_path)))
0 голосов
/ 26 сентября 2019

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

Так что-то вроде (вместо вашего назначения new_dir):

new_dir = file_path.replace('.', '_').split('_')[1]
...