|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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()
复制代码
这样,你就可以在新的文本框中输入下载地址,点击“下载”按钮时,程序会获取文本框中的地址,并将其添加到下载地址的前面。
|
|