使用Python下载文件

时间:2012-12-20 00:24:03

标签: python download

我必须下载一些文件。我在python中尝试了以下代码。

import urllib2
ul = urllib2.urlopen('http://dds.cr.usgs.gov/emodis/Africa/historical/TERRA/2012/comp_056/AF_eMTH_NDVI.2012.047-056.QKM.COMPRES.005.2012059143841.zip.sum').read()
open("D:/Thesis/test_http_dl", "w").write(ul)

它抛出了这个错误:

IOError: [Errno 13] Permission denied: 'D:/Thesis/test_http_dl'

你知道为什么会这样吗?我做错了吗? 我尝试了不同的文件夹,但没有用。我的文件夹不是只读的。 print(repr(ul[:60]))的结果是'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">\n<htm' urllib.urlretrieve()只在文件夹中创建一个1 kb的文件,显然不是下载的文件。

3 个答案:

答案 0 :(得分:2)

错误告诉您到底出了什么问题。您无权写入路径D:/Thesis/test_http_dl

有四种可能的原因:

  1. 您已经拥有一个具有该名称的文件,您无权使用该文件。
  2. 您无权在D:\Thesis
  3. 中创建新文件
  4. 您根本没有对D:驱动器的写入权限(例如,因为它是CD-ROM)。
  5. 其他一些进程打开文件进行独占访问。
  6. 您需要查看D:\Thesis\test_http_dl的ACL(如果存在),或者查看D:\Thesis\的ACL,并查看您的用户(您正在运行该脚本的用户)是否具有写访问权限,以及还要检查该路径或D驱动器本身是否具有“只读”标志,并检查是否有任何其他进程打开该文件。 (我不知道最后一个的任何内置工具,但handleProcess Explorer urllib2可以轻松地为您完成。)

    与此同时,open("D:/Thesis/test_http_dl", "w") 的所有内容都与此无关。您只需执行以下操作即可验证:

    open("D:/Thesis/test_http_dl", "w").write(ul)
    

    你会得到完全相同的例外。

    如果异常没有告诉你到底出了什么问题,那么值得知道如何用“硬”的方式解决这个问题。你在这样的行中得到一个例外:

    f = open("D:/Thesis/test_http_dl", "w")
    f.write(ul)
    

    出了点问题,如果你没有足够的信息来说明它是什么,你会怎么做?好吧,首先,将其分解成碎片,因此每行只有一个操作:

    ul

    现在您知道这两个中的哪一个获得异常。

    当你在这里时,由于这段代码唯一依赖的是ul = 'junk' f = open("D:/Thesis/test_http_dl", "w") f.write(ul) ,你可以创建一个更简单的程序来测试它:

    write

    即使这对您没有直接帮助,也意味着您不需要每次都通过测试循环等待下载,并且您可以更简单地发布到SO(请参阅sysinternals更多),这是你可以输入交互式解释器的东西。您可以从help(f)dir(f)开始实时播放,而不是试图猜出打印出来以查看open引发异常的原因。 (在这种情况下,我猜它实际上是write失败了,而不是AF_eMTH_NDVI.2012.047-056.QKM.COMPRES.005.2012059143841.zip,但你不应该猜测。)

    关于你的第二个问题:

      

    urllib.urlretrieve()只在文件夹中创建一个1 kb的文件,显然不是下载的文件。

    实际上,我认为下载的文件。您不是要求AF_eMTH_NDVI.2012.047-056.QKM.COMPRES.005.2012059143841.zip.sum,而是要求dir,这可能是校验和文件 - 一种准标准类型的文件,其中包含可帮助您确保文件的元数据下载在运输过程中没有损坏或被黑客篡改。典型的校验和文件具有一行或多行,每行以可下载文件的形式将可下载文件映射到校验和或加密散列摘要(在某种格式中)。有时它们有三列 - 校验和/散列的类型,一些字符串格式的校验和/散列的值,以及文件的文件名或完整URL。有时第一列被省略,你必须从别处知道正在使用什么类型的校验和/哈希(通常是MD5作为十六进制字符串)。有时列的顺序不同。有时它们会被逗号或制表符分隔,或者在固定宽度字段或其他变体中分开。

    无论如何,你希望.sum文件长约80个字节。如果你在资源管理器或ul命令中查看它,它通常会四舍五入到最接近的1K。因此,如果您成功下载,则应该看到1K文件。

    同时

      

    print(repr(ul [:60]))是'\ n

    你应该尝试打印其余内容,因为它可能是某种文件,用人的话来解释你做错了什么。这可能是因为您需要传递URL代理,首选编码,引用或其他标题。

    但是,我测试了您重复使用的完全相同的代码行,1ba6437044bfa9259fa2d3da8f95aebd AF_eMTH_NDVI.2012.047-056.QKM.COMPRES.005.2012059143841.zip 始终是:

    {{1}}

    换句话说,它是一个完全有效的校验和文件,而不是HTML页面。所以,我怀疑你真正发生的事情是你没有测试你向我们展示的相同代码。

答案 1 :(得分:0)

我已经尝试过您的代码并遇到同样的错误

所以试试这个:D

import urllib
urllib.urlretrieve('http://dds.cr.usgs.gov/emodis/Africa/historical/TERRA/2012/comp_056/AF_eMTH_NDVI.2012.047-056.QKM.COMPRES.005.2012059143841.zip.sum','C:\\path_of_your_folder\\xx.zip.sum')

和我一起工作!

答案 2 :(得分:0)

import urllib2
def download(url, file):
    dataset = urllib2.urlopen(url)
    CHUNK = 16 * 1024
    with open(file, 'wb') as dl:
        while True:
            peice = dataset.read(CHUNK)
            if not peice: break
            dl.write(peice)

download(r'http://dds.cr.usgs.gov/emodis/Africa/historical/TERRA/2012/comp_056/AF_eMTH_NDVI.2012.047-056.QKM.COMPRES.005.2012059143841.zip',r'AF_eMTH_NDVI.2012.047-056.QKM.COMPRES.005.2012059143841.zip')