2013-04-15 4 views
4

ftplib을 사용하여 파이썬에서 파일을 다운로드하고 있습니다. 최근까지 모든 것이 정상적으로 작동하는 것처럼 보였습니다. 파일을 다음과 같이 다운로드 중입니다.Python ftplib 파일 손상?

ftpSession = ftplib.FTP(host,username,password) 
ftpSession.cwd('rlmfiles') 
ftpFileList = filter(lambda x: 'PEDI' in x, ftpSession.nlst()) 
ftpFileList.sort() 
for f in ftpFileList: 
    tempFile = open(os.path.join(localDirectory,f),'wb') 
    ftpSession.retrbinary('RETR '+f,tempFile.write) 
    tempFile.close() 
ftpSession.quit() 
sys.exit(0) 

최근까지 예상대로 파일을 다운로드하고있었습니다. 그러나 지금은 다운로드중인 파일이 손상되어 긴 가비지 문자열이 포함되어 있습니다. 나는 그것이 동일한 FTP에서 성공적으로 이것을하는 Perl 스크립트를 가지고 있기 때문에 나는 그것들을 끌어 당기고있는 FTP에 게시 된 파일이 아니라는 것을 알고있다.

enter image description here

사람이 파이썬의 FTPLIB에 retrbinary()를 사용하여 손상된 파일 내용에 문제가 발생했습니다 :

는 여기에, 추가 정보 인 경우 파일을 다운로드 할 때 디버거가 명령 프롬프트에서두고 무엇인가?

나는 정말로 좌절감에 빠졌고, 여기에 가능한 부패와 관련된 것을 발견하지 못했다. 어떤 도움을 주셔서 감사합니다.

답변

1

나는 텍스트 파일을 다운로드하려고 할 때 어제이 문제와 마주 쳤습니다. 그게 당신이하고있는 일인지 확신 할 수 없지만 ASCII 가비지가 있다고 말했기 때문에 텍스트로되어 있기 때문에 텍스트 편집기에서 열었다 고 가정합니다.

이 경우 파일이 텍스트 파일이고 이진 모드로 다운로드하려고하는 것이 문제입니다.

대신 ASCII 전송 모드에서 파일을 검색하십시오.

tempFile = open(os.path.join(localDirectory,f),'w') # Changed 'wb' to 'w' 
ftpSession.retrlines('RETR '+f,tempFile.write)  # Changed retrbinary to retrlines 

불행히도이 명령은 파일에서 모든 개행 문자를 제거합니다. 왝!

tempFile = open(os.path.join(localDirectory,f),'w') 
textLines = [] 
ftpSession.retrlines('RETR '+f,textLines.append) 
tempFile.write('\n'.join(textLines)) 

이 작동해야하지만 수로는 좋은 보이지 않는 :

그래서 당신은 다시 밖으로 제거 개행 문자를 추가해야합니다. 따라서 약간의 정리 노력으로 우리를 얻을 수 있습니다 :

temporaryFile = open(os.path.join(localDirectory, currentFile), 'w') 
textLines  = [] 
retrieveCommand = 'RETR ' 

ftpSession.retrlines(retrieveCommand + currentFile, textLines.append) 
temporaryFile.write('\n'.join(textLines))