一、Python拷贝文件夹以及子目录
Python提供了shutil库中的copytree()函数来实现文件夹的拷贝。该函数的使用方法为:
shutil.copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2, ignore_dangling_symlinks=False)
其中src表示需要拷贝的原文件夹路径,dst表示目标文件夹路径。symlinks参数表示是否拷贝目录软链接,ignore参数表示需要排除的文件,copy_function参数表示拷贝时使用的函数,ignore_dangling_symlinks参数表示是否忽略软链接不存在的错误。
下面是一个实现拷贝整个文件夹及其子目录的例子:
import shutil import os src_folder = '/path/to/source/folder' dst_folder = '/path/to/destination/folder' # 创建目标文件夹 os.makedirs(dst_folder) # 拷贝文件夹 shutil.copytree(src_folder, dst_folder)
在执行该代码后,会将原文件夹(包括其子目录)完全拷贝到目标文件夹中。
二、Python拷贝图片到指定文件夹
Python拷贝单一类型的文件可以使用glob库中的glob()函数来获取文件列表,然后遍历列表逐一复制。下面是一个例子,拷贝当前目录下所有jpg和png图片到指定文件夹:
import shutil import glob import os image_folder = '/path/to/image/folder' dst_folder = '/path/to/destination/folder' # 获取jpg和png文件列表 image_list = glob.glob(os.path.join(image_folder, '*.[jp][pn]g')) # 创建目标文件夹 os.makedirs(dst_folder) # 遍历列表逐一复制 for image_path in image_list: shutil.copy(image_path, dst_folder)
该代码通过使用os.path.join()方法拼接路径,获取当前目录下所有jpg和png图片的列表,然后遍历列表,逐一使用shutil库中的copy()方法将文件复制到指定文件夹中。
三、Python拷贝文件夹到文件夹
使用shutil库中的copytree()函数可以将原文件夹完整拷贝至目标文件夹,并在目标文件夹中创建一个与原文件夹同名的文件夹。
import shutil import os src_folder = '/path/to/source/folder' dst_folder = '/path/to/destination/folder' # 创建目标文件夹 os.makedirs(os.path.join(dst_folder, os.path.basename(src_folder))) # 拷贝文件夹 shutil.copytree(src_folder, os.path.join(dst_folder, os.path.basename(src_folder)))
在执行该代码后,会将原文件夹完全拷贝到目标文件夹中,同时在目标文件夹中创建一个与原文件夹同名的文件夹。
四、Python拷贝文件夹到指定路径
使用shutil库中的copytree()函数可以将原文件夹完整拷贝到指定路径中。
import shutil import os src_folder = '/path/to/source/folder' dst_folder = '/path/to/destination/folder' # 拷贝文件夹 shutil.copytree(src_folder, os.path.join(dst_folder, os.path.basename(src_folder)))
在执行该代码后,会将原文件夹完全拷贝到目标文件夹中。
五、Python拷贝文件夹目录和文件
使用shutil库中的copy2()函数可以复制整个文件目录及其内容,包括文件夹内容和文件元数据(文件的权限等)。
import shutil import os src_folder = '/path/to/source/folder' dst_folder = '/path/to/destination/folder' # 获取源文件夹中所以文件和文件夹 for root, dirs, files in os.walk(src_folder): # 创建对应的目标文件夹 dst_root = root.replace(src_folder, dst_folder) os.makedirs(dst_root) # 复制所有的文件和文件夹 for directory in dirs: src_path = os.path.join(root, directory) dst_path = os.path.join(dst_root, directory) shutil.copy2(src_path, dst_path) for file in files: src_path = os.path.join(root, file) dst_path = os.path.join(dst_root, file) shutil.copy2(src_path, dst_path)
该代码采用os库中的walk()方法,查找源文件夹中的所有文件和文件夹,并逐一在目标文件夹中创建相应的目录结构和文件,并使用shutil库中的copy2()方法复制文件及其元数据到目标文件夹中。
六、Python如何拷贝文件
在Python中,使用shutil库中的copy()函数可以拷贝单个文件。
import shutil import os src_file = '/path/to/source/file' dst_file = '/path/to/destination/file' shutil.copy(src_file, dst_file)
该代码使用shutil库中的copy()方法,将指定路径下的文件复制到指定目标路径中。
七、Python拷贝文件夹下的所有图片
使用glob库可以快速获取指定文件夹下所有类型的文件,通过遍历获取的文件列表,再使用shutil库中的copy()函数逐一复制至指定目标文件夹中。
import glob import shutil import os src_folder = '/path/to/source/folder' dst_folder = '/path/to/destination/folder' # 创建目标文件夹 if not os.path.exists(dst_folder): os.makedirs(dst_folder) # 遍历指定文件夹下所有jpg、jpeg和png文件 for image_file in glob.glob(os.path.join(src_folder, '*.jpg')) + glob.glob(os.path.join(src_folder, '*.jpeg')) + glob.glob(os.path.join(src_folder, '*.png')): shutil.copy(image_file, os.path.join(dst_folder, os.path.basename(image_file)))
该示例使用glob库获取指定文件夹下所有jpg、jpeg和png文件,遍历文件列表,然后逐一使用shutil库中的copy()函数复制文件,最终将文件复制到指定目标文件夹中。
八、Python文件拷贝
使用shutil库的copy()函数可以将单个文件复制到指定位置。
import shutil import os src_file = '/path/to/source/file' dst_file = '/path/to/destination/file' shutil.copy(src_file, dst_file)
该代码使用shutil库中的copy()方法,将指定路径下的文件复制到指定目标路径中。
九、Python深拷贝和浅拷贝
Python中的拷贝操作分为深拷贝和浅拷贝两种,分别适用于不同的场景。
浅拷贝
浅拷贝只复制对象的父对象,不会复制对象内部成员,所以当原对象内部发生改变时,拷贝对象也会发生同样的改变。
import copy a = [1, 2, 3] b = copy.copy(a) # 将a中的第一个元素修改为4 a[0] = 4 print(a) # [4, 2, 3] print(b) # [1, 2, 3]
上述代码中,使用copy库中的copy()方法进行浅拷贝操作,将列表a中的元素复制到列表b中,当修改a列表的第一个元素后,b列表不会发生变化。
深拷贝
深拷贝会复制对象的所有成员,所以当原对象内部发生改变时,拷贝对象不会发生同样的改变。
import copy a = [1, 2, [3, 4]] b = copy.deepcopy(a) # 将a中的列表元素修改为[5, 6] a[2] = [5, 6] print(a) # [1, 2, [5, 6]] print(b) # [1, 2, [3, 4]]
上述代码中,使用copy库中的deepcopy()方法进行深拷贝操作,将列表a中的元素复制到列表b中,当修改a列表的第三个元素后,b列表不会发生变化。
十、Python深拷贝和浅拷贝详解
深拷贝和浅拷贝是Python中常用的拷贝方式。对于浅拷贝,只拷贝对象的基本信息,对于对象内部引用的成员数据,只是复制了指向该成员的引用,而没有真正拷贝该成员;对于深拷贝,会递归拷贝对象及其内部引用的成员数据,生成一个完全独立的对象。
需要注意的是,在Python中,某些对象是不可拷贝的,例如文件、网络连接等,会报错。
下面是一个综合示例,同时展示了不同对象在浅拷贝和深拷贝中的表现:
import copy class TestClass: def __init__(self): self.name = 'Test' class SubClass: def __init__(self): self.name = 'Sub' class ParentClass: def __init__(self): self.name = 'Parent' self.sub_class = SubClass() a = [1, 2, [3, 4]] b = copy.copy(a) c = copy.deepcopy(a) print(f'a: {a}, id: {id(a)}, id of element[2]: {id(a[2])}') print(f'b: {b}, id: {id(b)}, id of element[2]: {id(b[2])}') print(f'c: {c}, id: {id(c)}, id of element[2]: {id(c[2])}') a[2][0] = 5 print(f'a: {a}, id: {id(a)}, id of element[2]: {id(a[2])}') print(f'b: {b}, id: {id(b)}, id of element[2]: {id(b[2])}') print(f'c: {c}, id: {id(c)}, id of element[2]: {id(c[2])}') a = TestClass() b = copy.copy(a) c = copy.deepcopy(a) print(f'a: {a.name}, id: {id(a)}, id of sub_class: {id(a.sub_class)}') print(f'b: {b.name}, id: {id(b)}, id of sub_class: {id(b.sub_class)}') print(f'c: {c.name}, id: {id(c)}, id of sub_class: {id(c.sub_class)}') a.name = 'New' a.sub_class.name = 'New' print(f'a: {a.name}, id: {id(a)}, id of sub_class: {id(a.sub_class)}') print(f'b: {b.name}, id: {id(b)}, id of sub_class: {id(b.sub_class)}') print(f'c: {c.name}, id: {id(c)}, id of sub_class: {id(c.sub_class)}') a = ParentClass() b = copy.copy(a) c = copy.deepcopy(a) print(f'a: {a.name}, id: {id(a)}, id of SubClass: {id(a.sub_class)}') print(f'b: {b.name}, id: {id(b)}, id of SubClass: {id(b.sub_class)}') print(f'c: {c.name}, id: {id(c)}, id of SubClass: {id(c.sub_class)}') a.name = 'New' a.sub_class.name = 'New' print(f'a: {a.name}, id: {id(a)}, id of SubClass: {id(a.sub_class)}') print(f'b: {b.name}, id: {id(b)}, id of SubClass: {id(b.sub_class)}') print(f'c: {c.name},