文件夹下载器案例实战

本文介绍了一种使用Python的multiprocessing模块实现的多任务文件下载器。该下载器能够并行下载指定文件夹下的所有文件,并将其保存到新的文件夹中。通过创建进程池和使用队列来管理任务,实现了高效的文件复制过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 使用进程的思想来实现多任务,从而来完成一个简单的文件下载器,可以实现将一个文件中的所有文件下载到指定文件夹下
  2. 代码实例
import os
import multiprocessing


def copy_file(q, file_name, old_folder_name, new_folder_name):
    # print("===拷贝==%s从%s拷贝到%s" % (file_name, old_folder_name, new_folder_name))
    old_f = open(old_folder_name + "/" + file_name, "rb")
    content = old_f.read()
    old_f.close()
    new_f = open(new_folder_name + "/" +file_name, "wb")
    new_f.write(content)  # 这里注注意要下载的文件夹下的文件夹是写入的
    new_f.close()
    # 如果拷贝完文件就向队列中写入一个消息表明已经完成
    q.put(file_name)

def main():
    # 获取用户要拷贝文件夹的名字
    old_folder_name = input("请输入要拷贝的文件夹名字:")
    # 创建一个新的文件夹
    try:  # 防止创建的文件夹存在报错
        new_folder_name = old_folder_name + "_other"
        os.mkdir(new_folder_name)  # 使用os模块中的mkdri来创建文件夹,文件夹存在就报错
    except:
        pass
    # 获取文件夹中所有待拷贝的文件的名字:listdir(文件夹的位置)会返回文件夹中所有文件的名字,文件夹也会被返回
    file_names = os.listdir(old_folder_name)  # os.listdir(文件的路径,直接写文件名则只能在当前文件所在的目录下进行查找)返回的是一个列表
    # print(file_names)
    # 创建进程池
    po = multiprocessing.Pool(5)
    # 创建队列:用来判断拷贝了多少文件
    q = multiprocessing.Manager().Queue()  # 在进程池中使用队列必须要用Manager()下的Queue()类来创建
    # 想进程池中添加拷贝文件的任务
    for file_name in file_names:
        po.apply_async(copy_file, (q, file_name, old_folder_name, new_folder_name))
    po.close()
    # po.join()  # 这里通过while循环判断是否拷贝完毕来结束主进程所以不需要等待子进程执行完毕
    all_file_num = len(file_names)
    # print("原文件共有%d个文件" % all_file_num)
    cp_file_num = 0  # 判定已经拷贝文件的数量
    temp = 1
    while True:
        # file_name_get = q.get()
        q.get()  # 当队列中没有数据时会堵塞
        # print("第%d个文件%s已经完成拷贝" % (temp, file_name_get))
        print("\r拷贝的进度为%.2f%%" % ((cp_file_num + 1) / all_file_num * 100),end="")  # \r的作用是返回当前鼠标所在位置的行首

        # temp += 1
        cp_file_num += 1
        if cp_file_num == all_file_num:  # 通过判断是否拷贝完毕来结束子进程
            print("")
            break


if __name__ == '__main__':
    main()
资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 wget是Linux系统中一款非常实用的命令行下载工具,尤其在没有图形界面的环境下,它可以帮助用户轻松地从互联网上获取所需的文件,比如软件包、备份文件等,是Linux用户不可或缺的工具之一。 高稳定性:即使在带宽有限或网络不稳定的情况下,wget也能表现出色。如果下载因网络问题中断,它会自动重试,直到文件完整下载。 支持断点续传:下载过程中若被中断,wget可以从上次停止的位置继续下载,这对于下载大型文件非常有用,尤其是那些限制链接时间的服务器。 适应性强:无论是桌面系统还是服务器环境,wget都能很好地适应,是下载文件的首选工具之一。 -a <日志文件>:将下载过程中的信息记录到指定的日志文件中,便于后续查看或分析。 -A <后缀名>:指定要下载的文件类型,多个后缀名用逗号分隔,例如-A .jpg,.png,表示只下载JPG和PNG图片。 -b:让wget在后台运行,用户可以同时进行其他操作。 -B <连接地址>:设置基准地址,便于处理相对路径的链接。 -c:继续上次中断的下载任务,适合下载大文件。 -C <标志>:设置服务器数据块功能标志,on表示启用,off表示禁用,默认为on。 -d:以调试模式运行,便于排查问题。 -D <域名列表>:设置要遵循的域名列表,多个域名用逗号分隔。 -e <指令>:作为.wgetrc文件的一部分执行特定指令,可用于自定义配置。 -i <文件>:从指定文件中读取URL列表进行下载。 -l <目录列表>:设置要遵循的目录列表,多个目录用逗号分隔。 -L:仅遵循与当前页面相关的链接。 -r:递归下载,即下载当前页面及其所有子页面上的资源。 -nc:当文件已存在时,不会覆盖原有文件。 -nv:只显示更新和错误信息,隐藏详细下载过程。 -q:静默模式,不显示
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值