|  | 
 
| 
x
马上注册,结交更多好友,享用更多功能^_^您需要 登录 才可以下载或查看,没有账号?立即注册  
 萌新 各种查写了一个批量下载文件的
 但是目前有几个问题,
 一  线程数量超过200之后 ,下载就会各种失败,下的文件是0KB
 已经添加了锁 但是还是不好使。
 二  创建的目录有问题,不能自动按下载地址创建,
 比如目前的目录这样创建
 
 
 
 需要创建6290\webres\anim\player   6290\webres\anim\monster这样的
 
 3 程序假死  点击开始下载的时候 ,程序无响应 实际还在下的的
 
 4  json保存的是下载地址,
 
 如何选择josn后 对每行数据前面加上下载地址头,
 
 
 
 
 
 
 
 
 复制代码import json
import os
import requests
import threading
import tkinter as tk
from tkinter import filedialog
 
# 定义下载函数
def download_file(download_url, directory, lock):
    # 获取下载文件的文件名
    filename = os.path.basename(download_url)
    print('正在下载文件:', filename)
     
    # 创建目录
    os.makedirs(directory, exist_ok=True)
    # 下载文件
    response = requests.get(download_url)
    with open(os.path.join(directory, filename), 'wb') as f:
        f.write(response.content)
 
# 定义选择文件函数
def choose_file():
    file_path = filedialog.askopenfilename()
    file_path_var.set(file_path)
    # 读取本地json文件
    with open(file_path, 'r') as f:
        data = json.load(f)
    # 打印下载地址数量
    print('下载地址数量:', len(data))
 
# 定义下载函数
def download(max_threads):
    # 读取本地json文件
    with open(file_path_var.get(), 'r') as f:
        data = json.load(f)
    # 创建线程池
    threads = []
    # 创建锁对象
    lock = threading.Lock()
    # 遍历下载地址并下载文件
    count = 0
    for download_url in data:
        # 获取下载文件的目录
        directory = os.path.dirname(download_url)
        # 去除非法字符
        directory = directory.replace(':', '').replace('/', '')
        # 创建线程并启动
        t = threading.Thread(target=download_file, args=(download_url, directory, lock))
        t.start()
        threads.append(t)
        # 添加延迟
        count += 1
        if count >= max_threads:
            # 等待所有线程结束
            for t in threads:
                t.join()
            # 清空线程池和计数器
            threads = []
            count = 0
    # 等待剩余线程结束
    for t in threads:
        t.join()
 
 
# 创建窗口
window = tk.Tk()
window.title('批量下载')
window.geometry('400x250')
 
# 创建选择文件按钮
file_path_var = tk.StringVar()
file_path_label = tk.Label(window, textvariable=file_path_var)
file_path_label.pack()
choose_file_button = tk.Button(window, text='选择文件', command=choose_file)
choose_file_button.pack()
 
# 创建线程数量标签和文本框
thread_label = tk.Label(window, text='线程数量:')
thread_label.pack()
thread_entry = tk.Entry(window)
thread_entry.pack()
 
# 创建下载按钮
download_button = tk.Button(window, text='下载', command=lambda: download(int(thread_entry.get())))
download_button.pack()
 
# 运行窗口
window.mainloop()
你可以通过添加一个新的标签和文本框来实现这个功能。首先,你需要在窗口中添加一个新的标签和文本框。然后,你可以在下载函数中获取文本框中的值,并将其添加到下载地址的前面。
 下面是如何修改代码来实现这个功能:
 
 
 复制代码# 定义下载函数
def download(max_threads):
    # 获取输入框中的地址
    base_url = url_entry.get()
    # 读取本地json文件
    with open(file_path_var.get(), 'r') as f:
        data = json.load(f)
    # 创建锁对象
    lock = threading.Lock()
    # 创建线程池
    with ThreadPoolExecutor(max_workers=max_threads) as executor:
        # 遍历下载地址并下载文件
        for download_url in data:
            # 在下载地址前面添加输入框中的地址
            download_url = base_url + download_url
            # 获取下载文件的目录
            directory = os.path.join(BASE_DIR, *download_url.split('/')[1:-1])
            # 提交任务到线程池
            executor.submit(download_file, download_url, directory, lock)
# 创建窗口
window = tk.Tk()
window.title('批量下载')
window.geometry('400x250')
# 创建选择文件按钮
file_path_var = tk.StringVar()
file_path_label = tk.Label(window, textvariable=file_path_var)
file_path_label.pack()
choose_file_button = tk.Button(window, text='选择文件', command=choose_file)
choose_file_button.pack()
# 创建线程数量标签和文本框
thread_label = tk.Label(window, text='线程数量:')
thread_label.pack()
thread_entry = tk.Entry(window)
thread_entry.pack()
# 创建下载地址标签和文本框
url_label = tk.Label(window, text='下载地址:')
url_label.pack()
url_entry = tk.Entry(window)
url_entry.pack()
# 创建下载按钮
download_button = tk.Button(window, text='下载', command=lambda: threading.Thread(target=download, args=(int(thread_entry.get()),)).start())
download_button.pack()
# 运行窗口
window.mainloop()
 这样,你就可以在新的文本框中输入下载地址,点击“下载”按钮时,程序会获取文本框中的地址,并将其添加到下载地址的前面。
 | 
 |