使用Urllib出现[WinError 6] The handle is invalid错误求助
问题分析与解决
首先,你的代码出现OSError: [WinError 6] The handle is invalid错误,主要有几个关键问题:
1. 文件名参数错误(核心原因)
你调用Download(link, filenaame)时,第二个参数filenaame是整数类型,但urllib.request.urlretrieve的第二个参数需要是字符串格式的文件名。第一次运行时系统可能勉强处理,但后续循环中重复使用整数作为文件名,或者文件句柄未正确释放,就会触发句柄无效的错误。
另外你写的filenaame =+ 1是语法错误——Python里没有=+这种写法,这等价于filenaame = 1,而不是你想要的自增操作(正确写法是filenaame += 1)。这导致你的文件名一直被重置为1,进一步加剧了文件句柄的冲突。
2. 文件读取未正确关闭
你直接用f = open("links.txt", "r")打开文件,但没有手动关闭,这可能导致文件句柄泄漏,在循环中累积引发错误。推荐使用with语句自动管理文件资源。
3. 未处理换行符
readlines()读取的每行末尾会包含换行符\n,如果不处理,会导致后续的字符串分割(split('?$'))出现异常,生成的链接可能包含无效字符,间接引发下载错误。
修正后的代码
import urllib.request def Download(url, file_name): # 确保文件名是字符串格式,添加图片后缀(可根据实际格式调整) file_name_str = str(file_name) + ".jpg" urllib.request.urlretrieve(url, file_name_str) print(f"Successfully downloaded: {file_name_str}") # 使用with语句自动管理文件资源,避免句柄泄漏 with open("links.txt", "r") as f: lines = f.readlines() for line in lines: # 去除每行的换行符和空白字符,跳过空行 line = line.strip() if not line: continue for x in range(1, 5): cut_string = line.split('?$') # 校验链接格式是否符合预期 if len(cut_string) < 2: print(f"Skipping invalid link: {line}") continue new_string = cut_string[0] numerator = new_string.split('/1/') if len(numerator) < 2: print(f"Cannot split link correctly: {new_string}") continue # 构造目标下载链接 link = f"{numerator[0]}/{x}/{numerator[1]}" # 构造清晰的文件名:原名称+序号 original_name = numerator[1].split('.')[0] file_name = f"{original_name}{x}" print(f"Downloading: {file_name}") Download(link, file_name)
额外说明
- 我给文件名添加了
.jpg后缀,你可以根据实际图片格式(比如.png)修改; - 增加了格式校验逻辑,避免因links.txt里的无效链接导致程序崩溃;
- 用f-string替代了
format(),代码更简洁易读; - 跳过了空行,处理文件中可能存在的无效内容。
内容的提问来源于stack exchange,提问作者Ronald Rios
相关产品推荐
相关产品推荐

