Python 文件操作:复制和移动文件至指定目录

需要考虑的问题:

  • 指定文件夹是否存在,不存在则创建
  • 在指定文件夹中是否存在同名文件,是覆盖还是另存为
  • import os
    import shutil
    import traceback
    
    
    def copyfile(srcfile, dstpath, replace=False):
        """复制文件到指定文件夹
        @param srcfile: 原文件绝对路径
        @param dstpath: 目标文件夹
        @param replace: 如果目标文件夹已存在同名文件,是否覆盖
        """
        try:
            if not os.path.isfile(srcfile):
                print("%s not exist!" % (srcfile))
            else:
                fpath, fname = os.path.split(srcfile)  # 分离文件名和路径
                suffix = os.path.splitext(srcfile)[-1]
                # print(fpath, fname, suffix)
                if not os.path.exists(dstpath):
                    os.makedirs(dstpath)  # 创建路径
                if replace:
                    dstfile = os.path.join(dstpath, fname)
                    shutil.copy(srcfile, dstfile)  # 复制文件
                    print("copy %s -> %s" % (srcfile, dstfile))
                else:
                    i = 1
                    while True:
                        add = ' (%s)' % str(i) if i != 1 else ''
                        dstfile = os.path.join(dstpath, fname.replace(suffix, add + suffix))
                        if os.path.exists(dstfile) and i <= 10:
                            i += 1
                        else:
                            shutil.copy(srcfile, dstfile)  # 复制文件
                            print("copy %s -> %s" % (srcfile, dstfile))
                            break
                return dstfile
      
        except Exception as e:
            print('文件复制失败', srcfile)
            traceback.print_exc()
            
    import os
    import shutil
    import traceback
    
    def movefile(srcfile, dstpath, replace=False):
        """移动文件到指定文件夹
        @param srcfile: 原文件绝对路径
        @param dstpath: 目标文件夹
        @param replace: 如果目标文件夹已存在同名文件,是否覆盖
        """
        try:
            if not os.path.isfile(srcfile):
                print("%s not exist!" % (srcfile))
            else:
                fpath, fname = os.path.split(srcfile)  # 分离文件名和路径
                suffix = os.path.splitext(srcfile)[-1]
                # print(fpath, fname, suffix)
                if not os.path.exists(dstpath):
                    os.makedirs(dstpath)  # 创建路径
                if replace:
                    dstfile = os.path.join(dstpath, fname)
                    shutil.move(srcfile, dstfile)  # 复制文件
                    print("move %s -> %s" % (srcfile, dstfile))
                else:
                    i = 1
                    while True:
                        add = ' (%s)' % str(i) if i != 1 else ''
                        dstfile = os.path.join(dstpath, fname.replace(suffix, add + suffix))
                        if os.path.exists(dstfile) and i <= 10:
                            i += 1
                        else:
                            shutil.move(srcfile, dstfile)  # 复制文件
                            print("move %s -> %s" % (srcfile, dstfile))
                            break
        except Exception as e:
            print('文件移动失败', srcfile)
            traceback.print_exc()

    复制文件到指定文件夹V2:

    1. 判断源文件是否存在
    2. 判断目标文件夹是否存在
    3. 判断是否已存在该文件
    4. 判断已存在文件是否打开
    5. 判断是否需要替换掉已存在文件

    注意:复制文件会改变时间属性(创建日期、修改日期),不再是源文件的时间属性

    import os
    import shutil
    import traceback
    
    
    def copyfile(srcfile, dstpath, replace=False):
        """复制文件到指定文件夹
        @param srcfile: 原文件绝对路径
        @param dstpath: 目标文件夹
        @param replace: 如果目标文件夹已存在同名文件,是否覆盖
        """
        try:
            # 判断源文件是否存在
            assert os.path.isfile(srcfile), "源文件不存在"
            basename = os.path.basename(srcfile)
            fname = os.path.splitext(basename)[0]  # 不带后缀的文件名
            suffix = os.path.splitext(srcfile)[-1]
            # 判断目标文件夹是否存在
            if not os.path.exists(dstpath):
                os.makedirs(dstpath)  # 创建文件夹,可递归创建文件夹,可能创建失败
            # 判断目标文件夹是否存在
            assert os.path.exists(dstpath), "目标文件夹不存在"
    
            # 开始尝试复制文件到目标文件夹
            i = 0
            while True:
                i += 1
                add = '(%s)' % str(i) if i != 1 else ''
                dstfile = os.path.join(dstpath, fname + add + suffix)
                opened_dstfile = os.path.join(dstpath, '~$' + fname + add + suffix)  # 已打开文件
                # 判断目标文件夹是否存在该文件
                if not os.path.exists(dstfile):
                    shutil.copy(srcfile, dstfile)  # 不存在则复制文件
                    break
    
                # 存在该文件,则判断已存在文件是否打开
                if os.path.exists(opened_dstfile):
                    # 已打开则创建下一个新文件
                    continue
    
                # 已存在文件没有打开的情况
                if replace:
                    shutil.copy(srcfile, dstfile)  # 复制文件
                    break
                # 不覆盖已存在文件,则创建下一个新文件
    
            return dstfile
    
        except AssertionError as e:
            print('文件复制失败', e, srcfile)
        except Exception as e:
            print('文件复制失败', e, srcfile)
    
    if __name__ == "__main__":
    
        srcfile = r"C:\Users\Administrator\Desktop\源文件夹\test.txt"
        dir = r"C:\Users\Administrator\Desktop\目标文件夹"
        print(copyfile(srcfile, dir, replace=True))
    
    

    Python复制文件到指定文件夹,遇到相同文件名的处理

    https://www.cnblogs.com/johnthegreat/p/12748790.html

    python复制、移动文件到指定文件夹_python移动文件到指定文件夹-CSDN博客

    文件侠告诉你,Python复制文件的N种姿势! – 云+社区 – 腾讯云

    作者:令平子

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python 文件操作:复制和移动文件至指定目录

    发表回复