Python 에서 FTP 파일 전송 을 실현 하 는 실례
FTP 는 PASV 와 PORT 두 가지 접근 방식 에 대응 하 는데 각각 수 동적 이 고 주동 적 이 며 FTP 서버 단 을 대상 으로 구분 되 며 정상 적 인 전송 과정 에서 21 번 포트 는 명령 전송 에 사용 되 고 데이터 전송 포트 는 다른 포트 를 사용한다.
PASV:클 라 이언 트 가 데이터 전송 요청 을 하고 서버 측 이 데이터 포트 를 되 돌려 주 며 서버 측 이 이 포트 에서 데 이 터 를 기다 리 는 것 을 감청 하기 시작 하여 수 동적 모드 입 니 다.
PORT:클 라 이언 트 감청 포트 를 서버 측 에 요청 하고 서버 측 이 이 포트 에 주동 적 으로 연결 하여 데이터 전송 을 하 며 주동 적 인 모드 입 니 다.
그 중에서 TYPE 는 두 가지 모델 로 나 뉘 는데 I 는 바 이 너 리 모델,A 는 ASCII 모델 에 대응 합 니 다.
PASV 는 클 라 이언 트 에 게 요청 을 보 낸 후 227 은 서버 측 에 작업 코드 를 되 돌려 주 는 데 성 공 했 고 뒤에 서버 측 감청 이 있 는 포트:143 x 256(왼쪽 이동 8 비트)+48
이후 STOR 명령 을 통 해 데 이 터 를 다운로드 하고 다운로드 가 완료 되면 226 을 되 돌려 데이터 전송 이 완료 되 었 음 을 표시 합 니 다.
2.Python 코드 구현:
중국어 경로 문제:FTP 는 ASCII 인 코딩 을 지원 하기 때문에 Python ftplib 에서 인 코딩 방식 은 latin-1 을 사용 하고 window 의 기본 인 코딩 방식 은 gbk 이기 때문에 Python 을 사용 하여 처리 할 때 중국어 경 로 를 gbk 로 인 코딩 한 다음 latin-1 문자 로 디 코딩 해 야 합 니 다.
업로드 다운 로드 는 storline 과 retrline 을 사용 하고 바 이 너 리 는 storbinary 와 retrbinary 를 사용 합 니 다.stor 클래스 함수 뒤의 매개 변수 fp 는 파일 대상 을 받 아들 이 고 read 방법 을 지원 합 니 다.일반적으로 업로드 할 원본 파일 을 열기 위해 retr 클래스 함수 뒤의 매개 변 수 는 데 이 터 를 되 돌려 주 는 처리 방법 을 표시 합 니 다.
FTP 서버 에서 다른 FTP 서버 로 의 데이터 전송:
로 컬 컴퓨터 를 데이터 캐 시 로 사용 하지만 데 이 터 를 하 드 디스크 에 저장 하지 않 고 메모리 에 만 저장 하여 데이터 전송 을 합 니 다.그 중 하 나 는 다운로드 의 한 끝 으로 데이터 로 업로드 된다.
먼저 두 개의 FTP 서버 에 로그 인 합 니 다.transfercmd 함 수 는 명령 을 보 내 고 연 결 된 로 컬 Socket 을 되 돌려 줍 니 다.이 때 각각 두 개의 로 컬 Socket 에서 데 이 터 를 송 수신 하면 됩 니 다.
테스트 에서 파일 을 보 낸 후에 socket 을 제때에 닫 아야 21 포트 가 226 로 돌아 가 고 데이터 가 지 시 를 완료 합 니 다.그래 야 다음 파일 을 순환 할 수 있 습 니 다.완 료 된 후에 FTP 를 종료 해 야 합 니 다.
#coding=utf-8
import ftplib,os.path,os
import socket
f1=ftplib.FTP('172.16.2.76')
f2=ftplib.FTP('172.16.25.153')
class myFTP:
path='file/download/bbb/'
# ftplib latin-1
title=' '.encode(encoding='gbk').decode(encoding='latin-1')
path1=path+title
localDir='E:\\ver\\fp\\'
path2='abc/edf/'
def __init__(self):
try:
f1.login('username','password')
except ftplib.error_perm:
print('f1 cannot loggin!')
return
try:
f2.login()
except ftplib.error_perm:
print('f2 cannot loggin!')
return
def ftpD(self):
filelist=[]
fileLIST=[]
filels=f1.retrlines('LIST %s'%(self.path1),callback=filelist.append)
f1.cwd(self.path1)
for file in filelist:
fileAttr=file.split(' ')
fileName=fileAttr[-1]
fileType=fileAttr[0][0]
if fileType=='-':
fileLIST.append(fileName)
for file in fileLIST:
path=self.localDir+file
f1.retrbinary('RETR %s'%(file),open(path,'wb').write)
print('%s download.....'%(file))
f1.quit()
def ftpU(self,fun=1):
os.chdir(self.localDir)
fileList=os.listdir()
# upload file
if fun==1:
for file in fileList:
path=self.path2
f2.storbinary('STOR %s'%(path+file),open(file,'rb'))
print('%s uploading......'%(file))
#delete file
if fun==0:
try:
for file in fileList:
path=self.path2
f2.delete(path+file)
print('%s delete......'%(file))
except ftplib.error_perm:
print('no file to delete!!')
return
f2.quit()
def test(self):
f1.cwd(self.path1)
f2.cwd(self.path2)
fileList=f1.nlst()
print(fileList)
for file in fileList:
print('transfer %s......'%(file))
f1.voidcmd('TYPE I')
f2.voidcmd('TYPE I')
sock1=f1.transfercmd('RETR %s'%(file))
sock2=f2.transfercmd('STOR %s'%(file))
while 1:
data=sock1.recv(1024)
sock2.sendall(data)
if len(data)==0:
break
# socket, 21
sock1.close()
sock2.close()
res1=f1.getresp()
#print('f1 >> %s'%(res1))
res2=f2.getresp()
#print('f2 >> %s'%(res2))
f1.quit()
f2.quit()
if __name__=='__main__':
ftptest=myFTP()
ftptest.ftpU(0)
#ftptest.test()
#ftptest.ftpD()
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Python의 None과 NULL의 차이점 상세 정보그래서 대상 = 속성 + 방법 (사실 방법도 하나의 속성, 데이터 속성과 구별되는 호출 가능한 속성 같은 속성과 방법을 가진 대상을 클래스, 즉 Classl로 분류할 수 있다.클래스는 하나의 청사진과 같아서 하나의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.