是否有一个特殊的技巧来下载一个ZIP文件,并将其与Python写入磁盘?

StackOverflow https://stackoverflow.com/questions/576238

  •  05-09-2019
  •  | 
  •  

我从远程FTP站点使用Python的FTP发布FTPLIB一个zip文件。然后,我尝试将其写入到磁盘。该文件写的作品,但大多数尝试打开使用WinZip或WinRAR的失败拉链;这两个应用要求的文件被破坏。奇怪的是然而,当右击并试图用winrar,该文件以提取文件的提取物。

所以要明确,文件写入会工作,但不会的打开的流行拉链的应用程序里面,但将会的解压缩使用那些相同的应用程序。注意,Python的zip文件模块从未未能提取拉链。

下面是我使用来从FTP站点的zip文件(请忽略坏的黏合,这不是问题)的代码。

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()
有帮助吗?

解决方案

file.write直接retrbinary函数而不是传递附加器内传递。这将工作,它也不会当你下载一个大文件中使用那么多内存。

如果你想存储在一个变量中,虽然数据,你也可以有一个名为变量:

blocks = []

然后传递给retrbinary代替附加器:

blocks.append

您当前的附加器功能失常。 + =将无法正常工作时,有二进制数据,因为它会尝试做一个字符串附加在它看到第一个NULL停止。

正如@Lee B中提及也可以使用的urllib2或卷曲。但是,当前的代码几乎是正确的,如果你做了小的修改我上面提到的。

其他提示

我从来没有使用该库,但urllib2的正常工作,更简单。卷曲,甚至更好。

在你的代码看,我可以看到几件事情是错误的。你只异常醒目将异常,然后继续。对于像没有获得FTP连接致命错误,他们需要打印的消息,并退出。此外,您的FILEDATA开始了为无,那么你的appender使用+ =添加到这一点,所以你要追加一个字符串+无,这给当我尝试在这里一个TypeError。我很惊讶它的工作在所有;我早就猜到了附加器会抛出一个异常,所以FTP副本将中止。

在重新读取,我只注意到关于使用+ =上的二进制数据的另一种答案。这很可能是它;蟒蛇试图成为智能有时候,并且可以“帮助”当你加入与空白或在其中完全无效,或类似的东西串。你最好有对已打开的文件(让我们称之为OUTFILE),并使用您的appender只outfile.write(块)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top