将硬盘中的数据移动到工作目录

 

多线程文件复制

import os
import shutil
import multiprocessing

# 目标文件夹列表,即需要复制的源文件所在的文件夹路径
target_file = ['/mnt/d/data/CLAM/DateSet/use_data/']

# 目的文件夹列表,即文件复制后的目标文件夹路径
destination_file = ['/mnt/d/data/CLAM/DateSet/use_/']

# 定义一个函数用于复制文件,A为源文件路径,B为目标文件路径
def CopyJPG(A, B):
    shutil.copy(A, B) # 将文件从A复制到B

# 遍历需要复制的源文件夹列表
for file_path in range(len(target_file)):
    print(file_path)  # 输出当前遍历的目标文件夹的索引
    
    # 检查目标文件夹是否存在,如果不存在则创建目标文件夹
    if not os.path.exists(destination_file[file_path]):
        os.makedirs(destination_file[file_path])
    
    # 获取源文件夹下的所有文件名
    file_id = os.listdir(target_file[file_path])
    
    # 构建复制文件所需的参数列表,其中每个参数为一个元组(A, B),表示复制文件A到B
    args_list = [
        (target_file[file_path] + file_id[i],
         destination_file[file_path] + file_id[i]) for i in range(len(file_id))
    ]
    
    # 创建进程池并执行文件复制任务
    p = multiprocessing.Pool(32)
    p.starmap(CopyJPG, args_list)
    p.close() # 记得关闭
    p.join()

这段代码的作用是将 target_file 中的文件复制到 destination_file 中。

其中,target_filedestination_file 是两个列表,存储了源文件和目标文件夹的路径。

代码通过遍历 target_file 列表,逐个复制其中的文件到相应的目标文件夹。

请注意,这段代码只能处理一个目标文件夹,因为 target_filedestination_file 都只有一个元素。

如果你想要处理多个目标文件夹,需要将列表中的元素增加,每个元素对应一个目标文件夹。

另外,在使用文件路径时,确保路径设置正确,如果需要在 WSL 中操作 Windows 盘符 D:,则需要将其转换为 WSL 内的路径 /mnt/d/

代码解读 

模块一

# 目标文件夹列表,即需要复制的源文件所在的文件夹路径
target_file = ['/mnt/d/data/CLAM/DateSet/use_data/']

# 目的文件夹列表,即文件复制后的目标文件夹路径
destination_file = ['/mnt/d/data/CLAM/DateSet/use_/']

# 定义一个函数用于复制文件,A为源文件路径,B为目标文件路径
def CopyJPG(A, B):
    shutil.copy(A, B) # 将文件从A复制到B

 这段代码是一个简单的文件复制程序,它实现了将一个文件夹中的所有文件复制到另一个文件夹的功能。下面对代码中的每一行进行解释:

`target_file = ['/mnt/d/data/CLAM/DateSet/use_data/']`: 这行代码定义了一个列表 `target_file`,其中包含了一个目标文件夹的路径。`target_file` 是需要复制的源文件所在的文件夹路径。

`destination_file = ['/mnt/d/data/CLAM/DateSet/use_/']`: 这行代码定义了一个列表 `destination_file`,其中包含了一个目标文件夹的路径。`destination_file` 是文件复制后的目标文件夹路径,即复制后的文件将会被放置在这个文件夹中。

`def CopyJPG(A, B):`: 这行代码定义了一个名为 `CopyJPG` 的函数,该函数用于复制文件。`A` 是源文件路径,`B` 是目标文件路径。

`shutil.copy(A, B)`: 这行代码使用 `shutil` 模块的 `copy` 函数,将源文件 `A` 复制到目标文件 `B`。这行代码实现了将一个文件从源文件夹复制到目标文件夹的功能。

综上所述,这段代码定义了需要复制的源文件夹路径和目标文件夹路径,并定义了一个文件复制函数 `CopyJPG`,用于将源文件夹中的文件复制到目标文件夹中。但是,目前的代码并没有执行具体的复制操作,只是定义了函数和文件夹路径。要实际执行复制操作,还需要调用函数并传递正确的参数。

 模块二

# 遍历需要复制的源文件夹列表
for file_path in range(len(target_file)):
    print(file_path)
    # 检查目标文件夹是否存在,如果不存在则创建目标文件夹
    if not os.path.exists(destination_file[file_path]):
        os.makedirs(destination_file[file_path])
    
    # 获取源文件夹下的所有文件名
    file_id = os.listdir(target_file[file_path])
    
    # 构建复制文件所需的参数列表,其中每个参数为一个元组(A, B),表示复制文件A到B
    args_list = [
        (target_file[file_path] + file_id[i],
         destination_file[file_path] + file_id[i]) for i in range(len(file_id))
    ]

 这段代码是一个文件复制的遍历过程,它遍历了需要复制的源文件夹列表 `target_file` 中的每个文件夹路径,然后执行了一系列操作来实现文件复制。

1. `for file_path in range(len(target_file)):`: 这行代码使用 `for` 循环遍历 `target_file` 列表中的每个元素。`range(len(target_file))` 返回一个包含 `target_file` 列表长度范围内整数的可迭代对象,通过遍历这个可迭代对象,我们可以获取到 `target_file` 中的每个文件夹路径。

2. `print(file_path)`: 这行代码打印当前遍历的 `target_file` 列表中文件夹路径的索引。索引从0开始,所以在每次循环中,它会打印出0、1、2等。

3. `if not os.path.exists(destination_file[file_path]):`: 这行代码检查目标文件夹是否存在。`os.path.exists()` 是一个函数,用于检查给定路径是否存在。`destination_file[file_path]` 表示当前遍历到的目标文件夹路径。如果目标文件夹不存在,执行后续操作。

4. `os.makedirs(destination_file[file_path])`: 这行代码使用 `os.makedirs()` 函数创建目标文件夹。`os.makedirs()` 函数可以递归地创建目录,即如果目标文件夹的上层目录不存在,它会自动创建上层目录。

5. `file_id = os.listdir(target_file[file_path])`: 这行代码获取当前遍历到的源文件夹下的所有文件名。`os.listdir()` 函数返回给定路径下的文件和文件夹列表。

6. `args_list = [...]`: 这是一个列表推导式,用于构建复制文件所需的参数列表 `args_list`。在列表推导式中,通过遍历 `file_id` 列表,为每个文件构建一个元组 `(A, B)`,其中 `A` 是源文件的完整路径(由源文件夹路径和文件名拼接而成),`B` 是目标文件的完整路径(由目标文件夹路径和文件名拼接而成)。

综上所述,这段代码遍历了需要复制的源文件夹列表中的每个文件夹路径,对于每个文件夹路径,它检查目标文件夹是否存在,如果不存在则创建目标文件夹,并获取源文件夹下的所有文件名。然后,通过列表推导式构建了复制文件所需的参数列表 `args_list`,其中每个参数为一个元组 `(A, B)`,表示复制文件 `A` 到目标文件 `B`。

 模块三

    # 创建进程池并执行文件复制任务
    p = multiprocessing.Pool(32)
    p.starmap(CopyJPG, args_list)
    p.close() # 记得关闭
    p.join()

这段代码是使用 Python 中的 `multiprocessing` 模块来实现多线程文件复制的过程。

下面对代码中的每一行进行解释:

 `p = multiprocessing.Pool(32)`: 这行代码创建了一个名为 `p` 的进程池对象。`multiprocessing.Pool` 是 Python 中的一个进程池类,它允许并行地执行多个函数。

括号中的参数 `32` 表示进程池的大小,即最多同时执行 32 个进程。这样可以利用多核处理器的优势,同时复制多个文件。

`p.starmap(CopyJPG, args_list)`: 这行代码使用进程池 `p` 中的多个进程来执行 `CopyJPG` 函数,其中 `args_list` 是一个参数列表,包含了多个元组,每个元组表示一个文件复制的任务。`starmap` 函数会遍历 `args_list` 中的每个元组,并将元组的元素作为参数传递给 `CopyJPG` 函数,然后执行复制任务。

 `p.close()`: 这行代码关闭进程池 `p`,表示不再接受新的任务加入进程池。一旦进程池被关闭,就不能再向其中添加新的任务。

`p.join()`: 这行代码等待所有进程完成任务后再继续执行主线程的代码。也就是说,它会阻塞主线程,直到所有的复制任务都完成。

综上所述,这段代码创建了一个拥有 32 个进程的进程池 `p`,然后使用该进程池并行地执行文件复制任务,最后等待所有任务完成。这样可以加快文件复制的速度,提高程序的性能。

 模块四

import os
import shutil
import multiprocessing

1. `os` 模块:

`os` 模块提供了许多与操作系统交互的功能,可以访问文件系统、环境变量、进程管理等。

常用函数:

- `os.listdir(path)`: 返回指定路径下的文件和目录列表。
- `os.makedirs(path, mode=0o777, exist_ok=False)`: 递归创建目录,包括所有必需但不存在的中间目录。`mode` 参数指定目录的权限,默认为 `0o777`。
- `os.path.exists(path)`: 判断指定路径是否存在。
- `os.path.join(path, *paths)`: 将多个路径组合成一个路径,避免手动拼接路径字符串的错误。
- `os.path.isdir(path)`: 判断指定路径是否为目录。
- `os.path.isfile(path)`: 判断指定路径是否为文件。

2. `shutil` 模块:

`shutil` 模块是 `os` 模块的补充,提供了更方便的高级文件操作功能。

常用函数:

- `shutil.copy(src, dst, follow_symlinks=True)`: 将文件从源路径 `src` 复制到目标路径 `dst`。
- `shutil.move(src, dst)`: 将文件从源路径 `src` 移动到目标路径 `dst`,同时可以用于重命名文件。
- `shutil.rmtree(path, ignore_errors=False, οnerrοr=None)`: 递归地删除目录及其内容。
- `shutil.make_archive(base_name, format, root_dir=None, base_dir=None)`: 创建压缩文件或归档文件。

3. `multiprocessing` 模块:

`multiprocessing` 模块用于实现多进程编程,允许在 Python 程序中创建和管理多个并发执行的进程。

常用类和函数:

- `multiprocessing.Process`: 用于创建新的进程。
- `multiprocessing.Pool`: 创建进程池,用于批量执行任务。
- `multiprocessing.Manager`: 创建管理器对象,用于进程间共享数据。

在给定的代码中,

`os` 模块被用于创建目标文件夹(`os.makedirs`)、获取源文件夹下的文件列表(`os.listdir`)和检查目标文件夹是否存在(`os.path.exists`)。

`shutil` 模块的 `shutil.copy` 函数被用于执行文件复制操作。

`multiprocessing` 模块的 `multiprocessing.Pool` 被用于创建进程池,并通过 `p.starmap` 方法并行执行文件复制任务。

 程序输出结果

```
0
[None, None, None, None, None, None, None, None, None, None]
```

这是代码运行的结果。让我解释一下每一行的含义:

1. `0`: 这是在代码中 `print(file_path)` 这行代码的输出结果。`file_path` 的值是 0,因为代码中使用了 `range(len(target_file))`,它会生成一个从 0 开始,到 `len(target_file)-1` 结束的整数序列。由于 `target_file` 中只有一个元素,所以 `len(target_file)` 的值为 1,因此 `range(len(target_file))` 生成的序列就只有一个元素,即 0。所以输出为 0。

2. `[None, None, None, None, None, None, None, None, None, None]`: 这是在代码中 `p.starmap(CopyJPG, args_list)` 这行代码的输出结果。`starmap` 函数会对 `args_list` 中的每个元组调用 `CopyJPG` 函数,并将其返回值作为一个列表返回。由于 `CopyJPG` 函数没有明确的返回值,所以默认返回 `None`。因此,输出结果是一个包含了多个 `None` 的列表,列表的长度与 `args_list` 中的元素个数相同。在这里,`args_list` 的长度是 10(假设源文件夹中有 10 个文件),所以输出结果中有 10 个 `None`。

这些输出结果表明代码已经运行成功,复制任务完成,并且成功创建了目标文件夹 `/mnt/d/data/CLAM/DateSet/use_/`。输出中的 `None` 表示每个复制任务都成功执行,但因为 `CopyJPG` 函数没有明确的返回值,所以 `starmap` 默认返回了一个包含多个 `None` 的列表。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Guangpengwgp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值