" [WinError 6]句柄无效"使用Urllib

时间:2018-05-18 16:18:55

标签: python urllib

import urllib.request

def Download(url, file_name):
    urllib.request.urlretrieve(url, file_name)

f = open("links.txt", "r")
lines = f.readlines()

for line in lines:
    for x in range (1, 5):
        filenaame = x


        cut_string = line.split('?$')
        new_string = cut_string[0]
        numerator = new_string.split('/1/')
        separator = ''

        link = (separator.join(numerator[0] + "/{}/".format(x) + numerator[1]))

        file_name = link.split('/{}/'.format(x))
        file_name = file_name[1]
        file_name = file_name.split('.')
        file_name = (separator.join(file_name[0] + "{}".format(filenaame)))
        filenaame =+ 1

        print("Downloading: {}".format(file_name))
        Download(link, filenaame)

错误:

Traceback (most recent call last):
  File "C:\python\downloader\rr.py", line 29, in <module>
    Download(link, filenaame)
  File "C:\python\downloader\rr.py", line 5, in Download
    urllib.request.urlretrieve(url, file_name)
  File "C:\python\lib\urllib\request.py", line 258, in urlretrieve
    tfp = open(filename, 'wb')
OSError: [WinError 6] The handle is invalid

我已经搜索了很多关于此的内容,并且在每个结果中我都发现这个人正在使用子流程模块,而我并不是这样,这使得它变得更加困难。

代码用于下载图像。它会成功下载第一个,然后崩溃。任何人都知道造成错误的原因是什么?我还是个初学者。

2 个答案:

答案 0 :(得分:0)

您已将计数器作为第二个参数传递。最后,该函数将其用作文件名,将下载的数据复制到。

通过传递一个整数,你可以启用&#34;传递一个低级文件描述符&#34;到open

  

文件是字符串或字节对象,给出要打开的文件的路径名(绝对或相对于当前工作目录)或要包装的文件的整数文件描述符

但是文件描述符并不存在(幸运的是!)

让我们在这里重现这个问题:

>>> open(4,"rb")
Traceback (most recent call last):
  File "<string>", line 301, in runcode
  File "<interactive input>", line 1, in <module>
OSError: [Errno 9] Bad file descriptor

修复显然是:

Download(link, file_name)

(我建议您将filenaame计数器重命名为更有意义的内容,避免出现类似的错误。

答案 1 :(得分:0)

在这一行,

urllib.request.urlretrieve(url, file_name)

此处 file_name 应该是字符串,因此在调用 Download(link,filenaame)之前,请使整数filenaame成为字符串try。

Download(link, str(filenaame))

用于下载图像的示例

def download_img(url):
    name = random.randrange(100,1000)
    full_name = str(name)+ ".jpg"
    urllib.request.urlretrieve(url, full_name)


download_img("http://images.freeimages.com/images/small-previews/25d/eagle-1523807.jpg")