玖叶教程网

前端编程开发入门

关于《Python入门:os常用函数》中复制文件(夹)函数从简到繁

基本考虑

练习os模块及file读写操作:将给定的源路径的文件(夹)复制到目标路径

简单实现

# 文件到文件的复制
path_src='E:\src.txt'
path_tar='D:\\tar.txt'
with open(path_src, 'rb') as f_src:
    stream_src = f_src.read()
    with open(path_tar, 'wb') as f_tar:
        f_tar.write(stream_src)

情况1

考虑到:依赖于路径的复制不单有文件到文件,实际可能有4种:文件-->文件、文件-->目录、目录-->文件、目录-->目录,需要区分不同方法。

文件-->文件:第02节已提供

文件-->目录:

# 文件复制目录下
# 假设目标目录已存在
path_src = 'E:\src.txt'
path_tar = 'D:\\tar'
with open(path_src, 'rb') as f_src:
    # 读取源文件流
    stream_src = f_src.read()
    # 获取文件名
    filename = os.path.split(path_src)[1]
    # 将目标路径与文件名组合成新文件名
    path_file_tar = os.path.join(path_tar, filename)
    with open(path_file_tar, 'wb') as f_tar:
        # 写文件
        f_tar.write(stream_src)

目录-->文件:报错

print('Sorry, cannot copy a directory to a file.')

目录-->目录:

思路:

  • 空目录-->目录:直接用os.mkdir在目标目录下新建目录即可
  • 非空目录-->目录:
  1. 首先目标目录下新建源路径同名目录
  2. 遍历源目录下所有内容,若文件复制到新建目录下,若目录执行目录-->目录操作(递归)
# 目录复制目录
# 假设源目录、目标目录都存在
path_src = 'E:\src'
path_tar = 'D:\\tar'


def copy_file(path_src, path_tar):
    with open(path_src, 'rb') as f_src:
        stream_src = f_src.read()
        with open(path_tar, 'wb') as f_tar:
            f_tar.write(stream_src)


def copy_dir(path_src, path_tar):
    # 目标目录下新建目录的目录路径
    list_path_src = path_src.split(('\\'))
    path_dir_tar = os.path.join(path_tar, list_path_src[-1])
    # 按该路径新建目录
    os.mkdir(path_dir_tar)
    # 获取原目录内所有文件、目录
    files = os.listdir(path_src)
    for file in files:
        # 结合形成源路径
        path_file_src = os.path.join(path_src, file) 
        # 源路径为文件则复制到新建目录内
        if os.path.isfile(path_file_src):
            path_file_tar = os.path.join(path_dir_tar, file)
            copy_file(path_file_src, path_file_tar)
        # 目标路径为目录则将目录复制到新建目录内
        else:
            copy_dir(path_file_src, path_dir_tar)


copy_dir(path_src, path_tar)

情况2

考虑到:给定的路径可能不存在,目标路径不存在新建文件(夹)即可,源路径不存在则会报错。

解决:仅检查源路径是否存在即可

if not os.path.exists(path_src):
    print('Source path does not exist.')

情况3

实际碰到:os.mkdir(path)应用时,若path所代表的目录已存在则报错。

解决:mkdir之前检查该目录是否已存在

# 目标目录内没有同名目录新建即可
if not os.path.exists(path_tar):
    os.mkdir(path_tar)
    os.mkdir(path_dir_tar)
# 目标目录内已有同名目录,提示信息并返回
elif os.path.exists(path_dir_tar):
    print('Target directory has already exist. Cannot create directory.')
    return

情况4

实际碰到:使用os.path.isdir、os.path.isfile时会出现与预期不同的结果。

分析:查看文档os.path.isdir当路径为目录时为True、为其他或不存在时为False,os.path.isfile当路径为文件时为True、为其他或不存在时为False。

解决:综合情况2,源路径不存在时报错,存在时可进行下步操作。若目标路径不存在且不为文件(暂且认为后缀为空)则创建目录,存在时进行目录复制操作即可。

    if not os.path.exists(path_src):
        print('Source path does not exist.')
    elif not os.path.exists(path_tar) and not os.path.splitext(path_tar)[1]:
        os.mkdir(path_tar)
        copy_all(path_src,path_tar)

情况5

考虑到:文件复制操作可以复用,抽出成为一个函数

综合代码如下:

import os


# 源路径为文件、目标路径为文件:另存为
# 源路径为目录、目标路径为文件:报错
# 源路径为文件、目标路径为目录:复制到目标目录下
# 源路径为目录、目标路径为目录:复制到目标目录下
# 1.目标目录下创建源目录同名目录
# 2.获取源目录下文件、目录
# 3.若文件,直接复制到同名目录
# 4.若目录,同名目录下新建同名目录,重复1、2

def copy_file(path_src, path_tar):
    with open(path_src, 'rb') as f_src:
        stream_src = f_src.read()
        with open(path_tar, 'wb') as f_tar:
            f_tar.write(stream_src)


def copy_all(path_src, path_tar):
    # 源路径不存在,报错
    if not os.path.exists(path_src):
        print('Source path does not exist.')
		# 目标路径不存在,创建目录
        # 目标路径不存在,且后缀为空
    elif not os.path.exists(path_tar) and not os.path.splitext(path_tar)[1]:
    else:
        isdir_src = os.path.isdir(path_src)
        isdir_tar = os.path.isdir(path_tar)
        # 文件复制到文件(另存)
        if not isdir_src and not isdir_tar:
            copy_file(path_src, path_tar)
        # 目录复制到文件将报错
        elif isdir_src and not isdir_tar:
            print('Sorry, cannot copy a directory to a file.')
        # 目录复制到目录下
        elif isdir_src and isdir_tar:
            # 目标目录下新建目录的目录路径,用目标目录和源目录文件夹名表示
            list_path_src = path_src.split(('\\'))
            path_dir_tar = os.path.join(path_tar, list_path_src[-1])
            # 目标目录不存在,新建目标目录并在目标目录下新建同名目录
            if not os.path.exists(path_dir_tar):
                 os.mkdir(path_dir_tar)
            # 目标目录内已有同名目录,提示信息并返回
            elif os.path.exists(path_dir_tar):
                print('Target directory has already exist. Cannot create directory.')
                return
            # 获取原目录内所有文件、目录
            files = os.listdir(path_src)
            for file in files:
                # 结合形成目标路径
                path_file_src = os.path.join(path_src, file)
                # 目标路径为文件则复制到新建目录内
                if os.path.isfile(path_file_src):
                    path_file_tar = os.path.join(path_dir_tar, file)
                    copy_file(path_file_src, path_file_tar)
                # 目标路径为目录则将目录复制到新建目录内
                else:
                    copy_all(path_file_src, path_dir_tar)
        # 文件复制到目录下
        elif not isdir_src and isdir_tar:
            filename = os.path.split(path_src)[1]
            path_file_tar = os.path.join(path_tar, filename)
            print(path_file_tar)
            copy_file(path_src, path_file_tar)


if __name__ == '__main__':
    path_src = 'E:\src'
    path_tar = r'D:\tar'
    copy_all(path_src, path_tar)

作者初学练习,方法、思路局限,如有错误、不足请勘正,共同进步,以上共勉!

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言