Zip 파일을 다운로드하여 Python으로 디스크에 작성하는 특별한 트릭이 있습니까?
문제
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)를 사용하는 것입니다.