您的位置:

Python拷贝文件夹详解

一、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},