Как переместить и переименовать несколько файлов в определенную папку? - PullRequest
2 голосов
/ 09 мая 2019

У меня небольшая проблема с инструментом, который я создал в Python.

Этот инструмент работает для классификации файлов по именам файлов и создания папок по слову в каждом имени файла, а затем перемещает все файлы в соответствующую папку.

Файлы:

  • 09052019_6_filetype1_currenttime_randomnumber.xml
  • 09052019_2_filetype2_currenttime_randomnumber.xml
  • 09052019_9_filetype3_currenttime_randomnumber.xml
  • 09052019_1_filetype3_currenttime_randomnumber.xml
  • 09052019_1_filetype3_currenttime_randomnumber.xml

Фактические результаты:

  • filetype1_Status_6 (папка)
    • 09052019_6_filetype1_currenttime_randomnumber.xml
  • filetype2_Status_2 (папка)
    • 09052019_2_filetype2_currenttime_randomnumber.xml
  • filetype3_Status_9 (папка)
    • 09052019_9_filetype3_currenttime_randomnumber.xml
  • filetype3_Status_1 (папка)
    • 09052019_1_filetype3_currenttime_randomnumber.xml
    • 09052019_1_filetype3_currenttime_randomnumber.xml

Кодовая версия 1.0

#!/usr/bin/python3
# v1.0
# Importing  modules
import os
import shutil
import sys

# Path of input and output files
src = input('Input files: ')
dest = input('Destination files: ')

os.chdir(dest)

def classify():
    for f in os.listdir(src):
        splitname = f.split('_')
        status = splitname[1]
        topic = splitname[2]
        foldername = topic + '_' + 'Status_' + status
        if not os.path.exists(foldername):
            os.mkdir(foldername)
        shutil.move(os.path.join(src, f), foldername)

print('Sorting out files, please wait...')
classify()
print('¡DONE!')

Улучшение

Но в v2.0 я хотел бы немного «улучшить» его, просто сохранив то же удобство использования, но изменив имена файлов с исходного имени на «Message _ *. Xml», и это работает, но перемещая только один файл, а не все из них.

Текущие результаты:

  • filetype1_Status_6 (папка)
    • Message_.xml
  • filetype2_Status_2 (папка)
    • Message.xml
  • filetype3_Status_9 (папка)
    • Message_.xml
  • filetype3_Status_1 (папка)
    • Message_.xml

Ожидаемые результаты:

  • filetype1_Status_6 (папка)
    • Message_.xml
  • filetype2_Status_2 (папка)
    • Message.xml
  • filetype3_Status_9 (папка)
    • Message_.xml
  • filetype3_Status_1 (папка)
    • Message_.xml
    • Message_1.xml

Кодовая версия 2.0

#!/usr/bin/python3
# v2.0
# Importing  modules
import os
import shutil
import sys

# Path of input and output files
src = input('Input files: ')
dest = input('Destination files: ')

os.chdir(dest)

def classify():
    for f in os.listdir(src):
        splitname = f.split('_')
        status = splitname[1]
        topic = splitname[2]
        foldername = topic + '_' + 'Status_' + status
        newFileName = foldername + '\\' + 'Message_' + '.xml'
        if not os.path.exists(foldername):
            os.mkdir(foldername)
        shutil.copy(os.path.join(src, f), newFileName)

print('Sorting out files, please wait...')
classify()
print('¡DONE!')

1 Ответ

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

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

msgName = 'Message_0'
newFileName = foldername + '\\' + msgName + '.xml'
if not os.path.exists(foldername):
    os.mkdir(foldername)
else:
    while os.path.isfile(newFileName) is True:
        msgInt = int(msgName[8:])
        msgInt += 1
        msgName = msgName[:8] + str(msgInt)
        newFileName = foldername + '\\' + msgName + '.xml'    
shutil.copy(os.path.join(src, f), newFileName)

Теперь, если в вашей папке уже есть message_0.xml, вместо этого вы получите message_1.xml и так далее.

...