方式一
缺点,拷贝后的目录和拷贝前的目录层次结构一模一样,不够灵活
"""
需求:给定需要拷贝的源文件路径和 目标存放路径,做到对文件和文件夹的拷贝
"""
import os
def copy_file(source, destination):
with open(source, mode='rb') as r_file, open(destination, mode='wb') as w_file:
for f in r_file:
w_file.write(f)
def copy_folder(source, destination, w1, w2):
for root, dirs, files in os.walk(source):
if not os.path.exists(root.replace(w1, w2+':'))
os.makedirs(root.replace(w1, w2+':'))
for f in files:
from_path = os.path.join(root, f)
to_path = os.path.join(root.replace(w1, w2+":"), f)
copy_file(from_path, to_path)
def run(source, destination,w1,w2):
"""
:param source:
:param destination:
:param w1: 源盘符
:param w2: 目标盘符
:return:
"""
if os.path.exists(source):
if os.path.isfile(source):
copy_file(source, destination)
else:
copy_folder(source, destination,w1,w2)
else:
print('需要拷贝的文件不存在')
if __name__ == '__main__':
import re
source = input('请输入要拷贝的源文件或文件夹路径:').strip()
# 源盘符
w1 = re.match('\w:', source).group()
# 目标盘符
w2 = input('请输入要拷贝的目标盘符:').strip()
destination = source.replace(w1, f'{w2}:')
run(source, destination, w1, w2)
方式二
import os
import shutil
def copy_dirs(source, destination):
# 不存在文件夹时创建
if not os.path.exists(destination):
os.mkdir(destination)
for f in os.listdir(source):
if os.path.isfile(os.path.join(source, f)):
shutil.copy(os.path.join(source, f), os.path.join(destination, f))
else:
copy_dirs(os.path.join(source, f), os.path.join(destination, f))
if __name__ == '__main__':
source = r"D:\测试"
destination = r"E:\测试"
copy_dirs(source, destination)