Python操作文件夹、文件封装

代码是对文件、文件夹操作进行了简单封装,以满足相应的应用场景

1. 文件复制

包含对类型的判断,子文件夹等

2. 修改文件名

3. 修改文件后缀


import os
import time
import shutil


def copyfiles_create_subfolder(sourceDir, targetDir, type='None'):
    """
    完全连子目录也会复制好,美观
    :param sourceDir: 源文件夹
    :param targetDir: 目标文件夹
    :param type: 判断复制哪个类型的文件
    :return:
    """

    for filename in os.listdir(sourceDir):
        sourceF = os.path.join(sourceDir, filename)
        targetF = os.path.join(targetDir, filename)

        if os.path.isfile(sourceF):
            if not os.path.exists(targetDir):
                os.makedirs(targetDir)
            if not os.path.exists(targetF) or (
                    os.path.exists(targetF) and (os.path.getsize(targetF) != os.path.getsize(sourceF))):
                # 判断是否需要复制特定类型文件
                if type != 'None':
                    if type == os.path.splitext(filename)[1]:
                        open(targetF, "wb").write(open(sourceF, "rb").read())
                        print("%s %s 复制完毕" % (time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())), targetF))
                else:
                    open(targetF, "wb").write(open(sourceF, "rb").read())
                    print("%s %s 复制完毕" % (time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())), targetF))
            else:
                print("%s %s 已存在,不重复复制" % (time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())), targetF))
        if os.path.isdir(sourceF):
            # 递归调用,复制子文件夹
            copyfiles_create_subfolder(sourceF, targetF, type=type)


def copyfiles_nocreate_subfolder(sourceDir,targetDir,type='None'):
    """
    将文件夹下(含子文件夹)所有特定类型的文件复制到1个文件夹中,
    这样子文件夹下不能有名字一样的文件,否则后面的文件会替换掉前面的文件
    :param sourceDir: 源文件夹
    :param targetDir: 目标文件夹
    :param type: 想要复制的文件类型
    :return:
    """
    for root, dir1, filenames in os.walk(sourceDir):
        for filename in filenames:
            old_path = os.path.join(root, filename)
            new_path = os.path.join(targetDir, filename)
            # 判断是否需要复制特定类型文件
            if type != 'None':
                if type == os.path.splitext(filename)[1]:
                    shutil.copyfile(old_path, new_path)
            else:
                shutil.copyfile(old_path, new_path)


def change_file_extension(sourceDir,sourcetype,targetype):
    """
    改变文件的后缀
    :param sourceDir: 源文件夹
    :param sourcetype: 需要修改的类型
    :param targetype: 修改后的类型
    :return:
    """
    for root, dir1, filenames in os.walk(sourceDir):
        for filename in filenames:
            # 文件名
            file = os.path.splitext(filename)[0]
            print(filename)
            # 文件后缀
            extension = os.path.splitext(filename)[1]
            print(extension)
            if extension == sourcetype:
                old_name = os.path.join(root, file + sourcetype)
                new_name = os.path.join(root, file + targetype)
                os.rename(old_name, new_name)


def change_file_name(sourceDir):
    """
    改变文件的后缀
    :param sourceDir: 源文件夹
    :param sourcetype: 需要修改的类型
    :param targetype: 修改后的类型
    :return:
    """
    for root, dir, filenames in os.walk(sourceDir):
        num = 0
        for filename in filenames:
            # 文件后缀
            extension = os.path.splitext(filename)[1]
            old_name = os.path.join(root, filename)

            file = root.split('\\')[-1] + '_' + str(num) + extension
            new_name = os.path.join(root, file)
            os.rename(old_name, new_name)
            if extension == '.xml':
                num += 1


def copyfiles_same_name(sourceDir,targetDir,saveDir):
    """
    筛选出同源文件夹内文件名字一样的文件(不含有后缀)
    :param sourceDir: 源文件夹
    :param targetDir: 目标文件夹
    :param saveDir: 保存路径
    :return:
    """

    for root, dir1, filenames in os.walk(sourceDir):
        for filename in filenames:
            targetDir_path = os.path.join(targetDir, os.path.splitext(filename)[0] + '.png')
            saveDir_path = os.path.join(saveDir, os.path.splitext(filename)[0] + '.png')
            try:
                shutil.copyfile(targetDir_path, saveDir_path)
            except:
                print(filename + '不存在!')


if __name__ == "__main__":
    # 源文件夹
    sourceDir = r"D:\360MoveData\Users\Administrator\Desktop\客户要求-原图 - 副本\qingtouqianya"
    # 目标文件夹
    targetDir = r"D:\360MoveData\Users\Administrator\Desktop\新建文件夹 (2)"

    try:
        import psyco
        psyco.profile()
    except ImportError:
        pass
    # copyfiles_create_subfolder(sourceDir, targetDir, type='None')
    # copyfiles_nocreate_subfolder(sourceDir, targetDir, type='None')
    # change_file_extension(sourceDir, '.jpg', '.jpeg')

    change_file_name(sourceDir)


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Python图像识别

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值