Python3 - urllib.request权限被拒绝

5
当我尝试使用urllib.request.urlretrieve函数在Python 3.3.2中下载文件时,出现以下错误:
Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python33\lib\tkinter\__init__.py", line 1475, in __call__
    return self.func(*args)
  File "C:\Python33\lib\site-packages\downloader.py", line 17, in startdownload
    urllib.request.urlretrieve(url, file, reporthook)
  File "C:\Python33\lib\urllib\request.py", line 191, in urlretrieve
    tfp = open(filename, 'wb')
PermissionError: [Errno 13] Permission denied: '.\\tmp'

我正在尝试将文件保存在桌面上的tmp目录中。我在模块"downloader.py"中使用以下代码:
def download(url, file):
import urllib.request, tkinter, os, time
from tkinter import ttk

def reporthook(blocknum, blocksize, totalsize):
    readsofar = blocknum*blocksize
    percent = readsofar * 1e2 / totalsize
    GUI.title(str(int(percent)) + "% done")
    PROGRESS["value"] = percent
    PROGRESS.update()
def startdownload():
    BUTTON.destroy()
    for y in range(70, 40, -1):
        time.sleep(0.1)
        GUI.geometry("500x"+str(y))
        GUI.update()
    urllib.request.urlretrieve(url, file, reporthook)
    GUI.destroy()

GUI = tkinter.Tk()
GUI.resizable(0,0)
GUI.title("Click the download button to start downloading!")
GUI.geometry("500x70")
PROGRESS = ttk.Progressbar(GUI, length=480)
PROGRESS.place(x=10, y=10)
BUTTON = ttk.Button(GUI, text="start download", command=startdownload)
BUTTON.place(x=200, y=40)

GUI.mainloop()

我不知道如何给Python下载文件的权限。还是代码存在问题?

感谢您的帮助!


看起来你的程序正在保存到一个受限制的用户文件夹。请检查你是否有权限访问“文件名”所在的位置。请参考文档以获取更多解释。 - shad0w_wa1k3r
@AshishNitinPatil 我该如何给Python访问文件/目录的权限?我还注意到另一件事:在Python 2.5中,urllib.urlretrieve函数一切正常。请帮忙 :) - Tim Woocker
我现在一点头绪也没有。抱歉。而且,我说的是“可能”。 - shad0w_wa1k3r
1
检查download函数中的参数file是否为空字符串。我认为它试图写入一个目录而不是文件名,因此无法访问.\\tmp。编辑:我在Linux上进行了检查,如果是这种情况,你应该会得到一个IOError: [Errno 21] Is a directory: tmp的错误提示。 - user2375821
1个回答

12

我使用参数'.\\tmp'调用了我的函数,这是一个目录而不是单个文件。

你需要为urlretrieve指定一个文件名才能正常工作:'.\\tmp\\data'将被允许,只要你的tmp文件夹中没有叫做"data"的文件夹。

或者,如果你尝试下载到一个临时文件夹中,并且不指定第二个参数,文件将自动下载到你系统特定的临时文件夹中。更多信息可以在这里找到:https://docs.python.org/3.7/library/urllib.request.html#urllib.request.urlretrieve


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接