2010-12-22 5 views
1

죄송합니다. 저는 Python을 처음 접했습니다. 파이썬에서 ftplib을 사용하여 FTP에서 파일을 다운로드 할 수 있지만 파일 이름 (R.pdf)과이 다운로드 (R.pdf)의 이름을 하드 코딩하는 것과 같습니다. 다운로드 방법이 있습니다. 확장자가 .PDF 인 FTP의 모든 파일을 Python을 사용하여 로컬 시스템에 저장합니다. 나는 쉘에서 이것을 단지 * .pdf를 사용하여 할 수있다.Python 스크립트를 사용하여 FTP에서 .pdf 파일 다운로드

답변

3

하면 자격 증명, 하고 다음 코드에서 을 다운로드 할 PDF 파일이있는 디렉토리의 주소 '으로 public_html/솔레'과 그것이 있어야 OK I와 호스트, 사용자 및 암호를 교체 생각한다. FTP 프로토콜은 두 개의 채널, 명령에 대한 하나의 기타를 기반으로하기 때문에

from ftplib import * 
from os import listdir 
from os.path import getsize 


ftp_dt = FTP(host,user,password) 
ftp_pi = FTP(host,user,password) 
print '\n- Ouverture de connection et logging : OK' 


ftp_dt.cwd('public_html/soleil') 
ftp_pi.cwd('public_html/soleil') 


def func(content, li = [0], la = [], si = [0], memname = ['']): 
    if name!=memname[0]: 
     memname[0],li[0:1],la[:],si[0:1] = name,[0],[],[0] 
    li[0] = li[0] + 1 
    si[0] = si[0] + len(content) 
    la.append(str(len(content))) 
    if li[0]%8==0: 
     print ' '.join(la) +\ 
       ' total: '+str(li[0])+' chunks, '+str(si[0])+' bytes' 
     la[:] = [] 
    f.write(content) 


li_files = [] 
for name in ftp_dt.nlst(): 
    try: 
     ftp_dt.size(name) 
     if name not in ('.','..') and name[-4:]=='.pdf': 
      li_files.append(name) 
    except: 
     pass 


if li_files: 
    for name in li_files: 
     print '\n- Downloading '+name 

     with open('E:\\PDF\\DOWNS\\'+name,'wb') as f: 
      ftp_pi.retrbinary('RETR '+name,func) 

     if getsize('E:\\PDF\\DOWNS\\'+name)==ftp_dt.size(name): 
      print ' OK ! Download of complete '+repr(name)+' SUCCEEDED' 
     else: 
      print ' FAILURE !! : '+name+' only partially downloaded' 
else: 
    print '\nThere is no PDF file in this FTP directory' 


ftp_dt.quit() 
ftp_pi.quit() 

두 CONNEXIONS ftp_dtftp_pi은 "데이터 전송"과 "프로토콜 해석"에 대해 정의 ..... 맞춰봐?

FUNC() 기능이 fonction retrbinary()에 콜백으로 사용

은 그냥

def func(content): 
    f.write() 

이 될 수 있지만의 기본 변수의 가능성을 조금을했다 함수. 내가 잘 이해하지 못하는

것은이 코드가 작동 FUNC에서 F 참조 동안()FUNC()의 정의 후 코드의 텍스트에서 정의하는 방법에 대해 설명합니다. 그러나 나는 그것을 테스트하고 작동합니다!

+0

덕분에이 있었다 짝 내가 – Rakesh

+0

을 찾고 있었다 당신 이 대답을 upvote하고 그것이 사용자의 문제를 해결하는 경우 허용으로 표시해야합니다 user532312. –

1

내가 이것을 시도 할 수있다. documentation의 간단한 표정은 이것이 불가능하다는 것을 나타낸다.

그러나 dir 또는 nlst 명령을 사용하여 원격 끝에있는 파일 목록을 가져온 다음 각 파일을 루프로 가져올 수 있습니다.

+0

FTP에서 PDF 파일의 세부 정보를 얻으면 for 루프를 사용하여이 작업을 수행 할 수 있습니다. A = ('111.pdf', '222.pdf', '333.pdf', '444.pdf') ftp = ftplib.FTP ("###. ###. ###. ### ") ftp.login ("********** ","*********** ") ftp.cwd ("/ Dir ") A의 I : 시도 : (. "RETR"+ I, 개방 (I, 'WB') 쓰기)을 제외하고 ftp.retrbinary : 인쇄 "오류" – Rakesh

관련 문제