Python에서 FTP 프로토콜 클라이언트를 구현하려면 표준 라이브러리인 ftplib 모듈을 사용합니다. 이 모듈의 FTP 클래스는 FTP 프로토콜의 클라이언트 측 기능 전체를 담당하며, 파일 업로드·다운로드부터 디렉터리 관리까지 다양한 작업을 손쉽게 처리할 수 있습니다.
FTP 서버에 연결하기
FTP 서버와 연결을 설정하려면 먼저 FTP 객체를 생성해야 합니다. 호스트명을 인자로 전달하면 해당 서버와의 연결이 초기화됩니다.
from ftplib import FTP
con = FTP('ftp.example.com')FTP 클래스의 주요 메서드
FTP 클래스는 다음과 같은 메서드들을 제공합니다.
connect(host, port)
지정된 호스트와 포트로 연결합니다. 기본 포트 번호는 FTP 프로토콜 표준에 따라 21입니다.
getwelcome()
서버가 최초 접속 시 응답으로 보내는 환영 메시지(welcome message)를 반환합니다.
login(user='anonymous', passwd='', acct='')
지정한 사용자 계정으로 로그인합니다. passwd와 acct 매개변수는 선택 사항이며 기본값은 빈 문자열입니다. 사용자를 지정하지 않으면 'anonymous'로 로그인되며, 이 경우 기본 비밀번호는 'anonymous@'로 설정됩니다.
abort()
현재 진행 중인 파일 전송을 중단(중지)합니다.
retrbinary(cmd, callback, blocksize=8192, rest=None)
바이너리(이진) 전송 모드로 파일을 내려받습니다. cmd에는 적절한 RETR 명령어, 즉 'RETR 파일명' 형식의 문자열을 지정해야 합니다. 콜백 함수는 수신된 데이터 블록마다 호출됩니다.
storbinary(cmd, fp)
바이너리 전송 모드로 파일을 서버에 저장(업로드)합니다. cmd는 'STOR 파일명' 형태여야 하며, fp는 바이너리 모드('rb')로 열린 파일 객체입니다. 파일은 EOF(파일 끝)에 도달할 때까지 read() 메서드로 읽혀 전송됩니다.
dir()
LIST 명령어 결과로 반환되는 디렉터리 목록을 생성하여 표준 출력으로 출력합니다.
delete(filename)
서버에서 지정한 이름의 파일을 삭제합니다.
cwd(pathname)
서버상의 현재 작업 디렉터리를 변경합니다.
mkd(pathname)
서버에 새로운 디렉터리를 생성합니다.
pwd()
서버상의 현재 디렉터리 경로(pathname)를 반환합니다.
rmd(dirname)
서버에서 지정한 이름의 디렉터리를 제거합니다.
size(filename)
서버에 있는 특정 파일의 크기를 요청합니다. 성공 시 파일 크기를 정수로 반환하고, 실패하면 None을 반환합니다. 참고로 SIZE 명령어는 표준화되어 있지 않지만, 대부분의 일반적인 FTP 서버 구현체에서 지원됩니다.
quit()
서버에 QUIT 명령어를 전송하고 연결을 종료합니다.
실전 예제: 파일 다운로드 및 업로드
다음 예제는 익명(anonymous) 연결로 FTP 서버에 접속한 뒤, 원격 파일을 로컬 폴더로 다운로드하고, 반대로 로컬 파일을 서버에 업로드하는 과정을 보여줍니다.
from ftplib import FTP
import os
def downloadFile():
filename = 'README.MIRRORS'
localfile = open(filename, 'wb')
ftp.retrbinary('RETR ' + filename, localfile.write, 1024)
ftp.quit()
localfile.close()
def uploadFile():
filename = '/home/malhar/file.txt'
ftp.storbinary('STOR ' + filename, open(filename, 'rb'))
ftp.quit()
with FTP("ftp1.at.proftpd.org") as ftp:
ftp.login()
ftp.getwelcome()
ftp.dir()
downloadFile()
uploadFile()위 코드에서는 with 문을 사용하여 작업이 끝나면 연결이 자동으로 정리되도록 구성했습니다. 실제 운영 환경에서는 예외 처리(try-except)를 추가하고, 전송 오류나 네트워크 문제에 대비하는 것이 좋습니다. 또한 보안이 중요한 환경이라면 평문으로 데이터를 전송하는 FTP 대신 SFTP(pysftp, paramiko 등) 또는 FTPS 사용을 권장합니다.