如何将多个文件移动并重命名到特定文件夹?

时间:2019-05-09 11:15:26

标签: python python-3.x file shutil

我在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 个答案:

答案 0 :(得分:1)

您正在命名AttributeError: 'float' object has no attribute 'replace' 的所有内容,因此您将永远不会获得多个文件。您需要解析文件夹中的名称,然后相应地增加文件名。

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,依此类推。