因为要迁移下载的视频文件(含部分未解压文件),发现没有太合适的程序,于是便用python3写一个。内容如下:

第一步:首先,先建一个解压缩文件的MyUnRar用来解压要迁移视频的文件夹,避免有些还没解压。


import zipfile
import os
from pathlib import Path
import rarfile


def unzip_file(file_zip_path):
    new_zip_dir = file_zip_path.rsplit('\\', 1)[0] + '/data'
    if not os.path.isdir(new_zip_dir):
        os.makedirs(new_zip_dir)
    zFile = zipfile.ZipFile(file_zip_path, "r")
    # ZipFile.namelist(): 获取ZIP文档内所有文件的名称列表
    for fileM in zFile.namelist():
        # zFile.extract(fileM, new_zip_dir)
        # 解压出来单个文件
        extracted_path = Path(zFile.extract(fileM, new_zip_dir))
        # print("fileM.encode('cp437').decode('gbk')",fileM.encode('cp437').decode('gbk'))
        # print("extracted_path",extracted_path)
        # 文件重命名,将中文的文件名还原
        extracted_path.rename(new_zip_dir + '//' + fileM.encode('cp437').decode('gbk'))
    zFile.close()
    return new_zip_dir


def unrar_file(filename):
    new_zip_dir = filename.rsplit('\\', 1)[0] + '/data'
    if not os.path.isdir(new_zip_dir):
        os.makedirs(new_zip_dir)

    rar = rarfile.RarFile(filename, mode='r')  # mode的值只能为'r'
    rar.extractall(new_zip_dir)  # 解压文件
    rar.close()  # 关闭文件,必须有,释放内存


def chkzipdir(strdir):
    for root, dirs, files in os.walk(strdir, topdown=False):
        for name in files:
            file_name_path = os.path.join(root, name)
            if os.path.isfile(file_name_path):
                print("准备解压", file_name_path)
                filename = os.path.basename(file_name_path)
                if filename.endswith('.zip'):
                    unzip_file(file_name_path)
                elif filename.endswith('.rar'):
                    unrar_file(file_name_path)
                else:
                    print("不是压缩文件", file_name_path)
            else:
                print("不是文件", file_name_path)

第二步:建立main.py文件用来对要迁移的文件夹进行处理(我是小白,更小白注意,用这个运行。第一个py文件是用来引用)


import os
import re
import shutil

import MyUnRar as myRar


def getfilenames(filepath='', filelist_out=[]):
    for fpath, dirs, fs in os.walk(filepath):
        for f in fs:
            fi_d = os.path.join(fpath, f)
            if os.path.splitext(fi_d)[1] in ['.mp4', '.avi', '.MP4', '.AVI', 'ts', '.mkv']:
                filelist_out.append(re.sub(r'\\', '/', fi_d))
            else:
                pass
        filelist_out.sort()
    return filelist_out


def rm_move(src, dst):  # src:源目录 dst:新目录
    s = getfilenames(src)  # 源目录
    count = 0
    for i in s:
        # 需要增加判断,仅仅新目录中有没有的视频文件至指定的目录
        count += 1
        try:  # 程序正常时,即要移动的文件和目的地文件没有相同的文件,用shutil.move命令
            shutil.move(i, dst)  # 递归的去移动文件,它类似mv命令,其实就是重命名,如果有重复文件报错
        except Exception as e:  # 程序异常时,即要移动的文件和目的地文件有相同的文件,用shutil.copy命令,并删除源文件
            print(e)  # 输出错误内容
            shutil.copy2(i, dst)  # 拷贝文件,用它有重复文件覆盖
            os.remove(i)  # 删除拷贝的源文件

    if count > 0:
        print('成功从源目录%s移动到新目录%s视频文件:%d 个' % (src, dst, count))
    else:
        print("没有视频文件可以进行迁移!")


def del_emp_dir(path):  # 删除迁移视频文件夹中的空目录函数,发现删除目录时如是迅雷建立的文件夹,即便为空,里面可能还存在隐藏文件,故不能删除
    for (root, dirs, files) in os.walk(path):
        for item in dirs:
            this_dir = os.path.join(root, item)
            try:
                os.rmdir(this_dir)  # os.rmdir() 方法用于删除指定路径的目录。仅当这文件夹是空的才可以, 否则, 抛出OSError。
                print(this_dir)
            except Exception as e:
                print('错误!', e)


if __name__ == '__main__':
    src_dir = input("请输入源目录以便搜索及转移视频文件使用:")
    dst_dir = input("请输入新目录以便迁移视频文件使用:")
    if not os.path.exists(dst_dir):  # 如果没有要新建的目录则可以
        os.mkdir(dst_dir)  # 创建新目录
        myRar.chkzipdir(src_dir)  # 要搜索及移动视频文件夹中如有压缩文件都解压到data文件夹中
        rm_move(src_dir, dst_dir)  # 搜索及移动视频文件
        del_emp_dir(src_dir)  # 删除搜索及移动视频文件中的空文件夹
    else:
        str_answer = input(" 文件夹已存在,您是否确定要在这个文件夹中操作,'Y'继续,'N'退出")
        if str_answer.lower() == 'y':
            myRar.chkzipdir(src_dir)  # 要搜索及移动视频文件夹中如有压缩文件都解压到data文件夹中
            rm_move(src_dir, dst_dir)  # 搜索及移动视频文件
            del_emp_dir(src_dir)  # 删除搜索及移动视频文件中的空文件夹
        elif str_answer.lower() == 'n':
            print("程序终止!")
        else:
            print("您输入的有问题!")


第三步:计划后续改造成直接运行的程序并带窗体界面,目前的还是不太友好,但基本功能有了。代码参考了网上的部分内容。