【问题标题】:Python DownloaderPython 下载器
【发布时间】:2010-11-04 00:48:10
【问题描述】:

所以我正在尝试编写一个脚本来使用 python 下载图片文件,我使用谷歌找到了这个 def,但是我下载的每张图片都“损坏”了。任何想法...

def download(url):
 """Copy the contents of a file from a given URL
 to a local file.
 """
 import urllib
 webFile = urllib.urlopen(url)
 localFile = open(url.split('/')[-1], 'w')
 localFile.write(webFile.read())
 webFile.close()
 localFile.close()

编辑:代码标签没有很好地保留缩进,但我可以向你保证它们在那里,这不是我的问题。

【问题讨论】:

  • 你为什么不用urllib2
  • 没有原因,这正是我找到它时的功能。
  • 请注意,如果文件很大,像这样将整个东西读入内存是非常低效的。如下所述,urllib.urlretrieve() 是一个更好的选择。
  • 在这里试试这个,less4us.blogspot.com/2012/06/… 告诉我它是否适合你

标签: python file download


【解决方案1】:

你可以simply do

urllib.urlretrieve(url, filename)

并为自己省去任何麻烦。

【讨论】:

  • 是的,感谢您指出这一点。这最终是我最终做的。并且只是使用 ntpath.basename 将文件名从 url 的末尾拉出
【解决方案2】:

需要以二进制方式打开本地文件:

localFile = open(url.split('/')[-1], 'wb')

否则二进制流中的 CR/LF 字符将被破坏,损坏文件。

【讨论】:

    【解决方案3】:

    如果您打算编写二进制文件,则必须包含“b”标志。第 7 行变为:

    localFile = open(url.split('/')[-1], 'wb')
    

    代码没有必要工作,但将来您可能会考虑:

    • 在您的函数之外导入。
    • 使用 os.path.basename,而不是字符串解析来获取路径的名称组件。
    • 使用 with 语句来管理文件,而不必手动关闭它们。它使您的代码更简洁,并确保在您的代码引发异常时正确关闭它们。

    我会将你的代码重写为:

    import urllib
    import os.path
    
    def download(url):
     """Copy the contents of a file from a given URL
     to a local file in the current directory.
     """
     with urllib.urlopen(url) as webFile:
      with open(os.path.basename(url), 'wb') as localFile:
       localFile.write(webFile.read())
    

    【讨论】:

      【解决方案4】:

      它出现损坏是因为您使用的函数正在将字节写入文件,就好像它是纯文本一样。但是,您需要做的是以二进制模式 (wb) 将字节写入其中。以下是您应该做什么的想法:

      import urllib
      
      def Download(url, filename):
        Data = urllib.urlopen(url).read()
        File = open(filename, 'wb')
        File.Write(Data)
        #Neatly close off the file...
        File.flush()
        File.close()
        #Cleanup, for you neat-freaks.
        del Data, File
      

      【讨论】:

        【解决方案5】:
        import subprocess
        outfile = "foo.txt"
        url = "http://some/web/site/foo.txt"
        cmd = "curl.exe -f -o %(outfile)s %(url)s" % locals()
        subprocess.check_call(cmd)
        

        脱壳可能看起来不优雅,但当您开始遇到更复杂的网站问题时,curl 有丰富的逻辑来处理让您通过网络服务器(cookie、身份验证、会话等)提供的障碍

        wget 是另一种选择。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-01-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-19
          • 2023-01-14
          • 2012-07-30
          相关资源
          最近更新 更多