基本考虑
练习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在目标目录下新建目录即可
- 非空目录-->目录:
- 首先目标目录下新建源路径同名目录
- 遍历源目录下所有内容,若文件复制到新建目录下,若目录执行目录-->目录操作(递归)
# 目录复制目录
# 假设源目录、目标目录都存在
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)
作者初学练习,方法、思路局限,如有错误、不足请勘正,共同进步,以上共勉!