Zip 파일을 다운로드하여 Python으로 디스크에 작성하는 특별한 트릭이 있습니까?

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

  •  05-09-2019
  •  | 
  •  

문제

Python의 ftplib을 사용하여 원격 FTP 사이트에서 zip 파일을 ftping합니다. 그런 다음 디스크에 쓰려고합니다. 파일 쓰기는 작동하지만 Winzip 또는 Winrar FAIL을 사용하여 ZIP를 열려고 시도합니다. 두 앱 모두 파일이 손상되었다고 주장합니다. 그러나 이상하게도 Winrar를 사용하여 파일을 마우스 오른쪽 버튼으로 클릭하고 추출하려고 할 때 파일 ~ 할 것이다 발췌.

명확하게 말하면 파일 쓰기가 작동하지만 열려 있는 인기있는 zip 앱 내부에서 ~ 할 것이다 동일한 앱을 사용하여 압축 압축합니다. 파이썬 지퍼 파일 모듈 절대 ZIPS를 추출하지 못합니다.

다음은 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()
도움이 되었습니까?

해결책

Pass. Pass.pond. 이것은 작동하며 큰 파일을 다운로드 할 때는 그다지 많은 RAM을 사용하지 않습니다.

변수 내부에 저장된 데이터를 원한다면 다음과 같은 변수를 가질 수도 있습니다.

blocks = []

그런 다음 Appender 대신 회고로 전달하십시오.

blocks.append

현재 Appender 기능이 잘못되었습니다. 이진 데이터가있을 때 +=는 문자열 추가를 시도하고 첫 번째 널에서 멈추기 때문에 제대로 작동하지 않습니다.

@lee b에서 언급했듯이 urllib2 또는 컬도 사용할 수도 있습니다. 그러나 위에서 언급 한 작은 수정을하면 현재 코드가 거의 정확합니다.

다른 팁

나는 그 라이브러리를 사용한 적이 없지만 urllib2는 잘 작동하며 더 간단합니다. 컬이 더 좋습니다.

당신의 코드를 보면, 나는 몇 가지 잘못을 볼 수 있습니다. 예외는 예외 만 인쇄 한 다음 계속됩니다. FTP 연결을 얻지 못하는 것과 같은 치명적인 오류의 경우 메시지를 인쇄 한 다음 종료해야합니다. 또한, 귀하의 FileData는 없음으로 시작한 다음 Appender가 + =를 추가하기 위해 사용하므로 String + None을 추가하려고합니다. 여기서 시도 할 때 TypeError를 제공합니다. 나는 그것이 전혀 작동한다는 것에 놀랐다. 나는 appender가 예외를 던질 것이라고 추측했을 것입니다. 그래서 FTP 사본은 중단 될 것입니다.

다시 읽는 동안 바이너리 데이터에서 += 사용에 대한 또 다른 답변을 발견했습니다. 그게 잘 될 수 있습니다. Python은 때때로 똑똑해 지려고 시도하며, 공백이나 숫자로 끈에 합류 할 때 "도움"할 수 있습니다. 가장 좋은 방법은 파일을 열고 (Outfile이라고 부르겠습니다), Appender를 사용하여 outfile.write (Chunk)를 사용하는 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top