首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >下载zip文件并使用Python将其写入磁盘有什么特别的窍门吗?

问下载zip文件并使用Python将其写入磁盘有什么特别的窍门吗?
EN

Stack Overflow用户
提问于 2009-02-23 01:00:37
回答 2查看 1.3K关注 0票数 1

我是FTPing,一个使用的远程FTP站点的压缩文件。然后,我尝试将其写入磁盘。但是,大多数使用WinZip或WinRar打开zip的尝试都失败了;这两个应用程序都声称文件已损坏。然而,奇怪的是,当右键单击并试图使用WinRar提取文件时,该文件将被解压缩。

因此,要明确的是,文件写入将工作,但不会打开在流行的压缩应用程序,但将解压缩使用相同的应用。请注意,模块从不失败地提取zip。

下面是我用来从FTP站点获取zip文件的代码(请忽略坏的选项卡,这不是问题)。

代码语言:javascript
复制
filedata = None
def appender(chunk):
    global filedata
    filedata += chunk


def getfile(filename):
  try:
      ftp = None

      try:
          ftp = FTP(address)
          ftp.login('user', 'password')

      except Exception, e:
          print e

      command = 'RETR ' + filename

      idx = filename.rfind('/')
      path = filename[0:idx]
      ftp.cwd(path)
      fileonly = filename[idx+1:len(filename)]

      ftp.retrbinary('RETR ' + filename, appender)

      global filedata
      data = filedata

      ftp.close()

      filedata = ''
      return data

  except Exception, e:
      print e

data = getfile('/archives/myfile.zip')    
file = open(pathtoNTFileShare, 'wb')
file.write(data)
file.close()
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-02-23 01:13:59

直接将file.write传递到retrbinary中,而不是传递appender。这将工作,它也不会使用那么多的RAM,当你下载一个大文件。

但是,如果希望存储在变量中的数据,也可以有一个名为:

代码语言:javascript
复制
blocks = []

然后传递给retrbinary而不是appender:

代码语言:javascript
复制
blocks.append

您当前的附录函数是错误的。当存在二进制数据时,+=将无法正常工作,因为它将尝试执行一个字符串追加,并在它看到的第一个NULL处停止。

正如@Lee所提到的,您也可以使用urllib2或Curl。但是,如果您做了上面提到的一些小修改,那么当前的代码几乎是正确的。

票数 2
EN

Stack Overflow用户

发布于 2009-02-23 01:12:00

我从未使用过这个库,但是urllib2工作得很好,而且更直接。卷发更好。

看看你的代码,我可以看到一些错误的地方。您的异常捕获只打印异常,然后继续。对于致命的错误,如没有获得FTP连接,它们需要打印消息,然后退出。另外,您的文件数据以“无”开始,然后您的附录使用+=来添加,因此您尝试添加一个字符串+无,这在我这里尝试时给出了一个TypeError。我很惊讶它能起作用;我会猜到这个附录会抛出一个异常,所以FTP副本就会中止。

在重新阅读时,我刚刚注意到关于二进制数据上使用+=的另一个答案。很有可能是这样;python有时会很聪明,当您将字符串中的空格或空或类似的东西连接起来时,可能会“有所帮助”。您最好的选择是打开该文件(让我们将其称为“外文件”),并使用您的附录来只打开outfile.write(块)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/576238

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档