2011-10-20 3 views
2

필자의 주된 목표는 FTP 서버를 언제든지 확인하여 새로운 파일이 생성되면 그곳에 복사 된 새로운 파일 만있는 .txt 파일을 생성하는 것입니다. 새 파일이 없으면 아무것도 반환하지 않습니다. 여기까지 내가 지금까지 가지고있는 것이있다. 서버에서 oldlist.txt로 파일을 복사 한 다음 FTP 사이트에 연결하고 newlist.txt와 oldlist.txt의 데이터를 비교하고 임시 FTP 파일 changes.txt에서 원하는 차이점을 비교하여 시작했습니다. 연결할 때마다 newlist.txt가 변경되어 oldlist.txt가되어 다음에 연결할 때 비교할 수 있습니다. 이 작업을 수행하는 더 좋은 방법이 있습니까? 내 목록은 매번 데이터를 변경하지 않는 것 같습니다. 죄송합니다. 혼란스러워서 고마워요.FTP와리스트를 이용한 파이썬 프로그래밍

import os 
filename = "oldlist.txt" 
testing = "newlist.txt" 
tempfilename = "Temporary FTP file Changes.txt" 

old = open(filename, "r") 
oldlist = old.readlines() 
oldlist.sort() 


from ftplib import FTP 
ftp = FTP("ftpsite", "username", "password") 
ftp.set_pasv(False) 
newlist = [] 
ftp.dir(newlist.append) 
newlist.sort() 
ftp.close() 

bob = open(testing, "w") 
for nl in newlist: 
    bob.write(nl + "\n") 


hello = open(tempfilename, "w") 

for c in newlist: 
    if c not in oldlist: 
    hello.write(c + "\n") 

bob.close() 
old.close() 
hello.close() 

os.remove("oldlist.txt") 

os.rename("newlist.txt", "oldlist.txt") 

답변

2

목록을 집합으로 변환하고 정렬 걱정을하지 않아도됩니다.

for filename in set(newlist) - set(oldlist): 
    print 'New file: ', filename 

또한, 대신 원시 텍스트로 목록을 파일로 저장하는, 당신은 정기적으로 파이썬 딕셔너리처럼 편리하게 액세스 할 수있는 영구 저장소를 만들기 위해 선반 모듈을 사용할 수 있습니다.

그렇지 않으면 코드가 간단하고 직설적 인 장점이 있습니다.

는 여기에 밖으로 일 예제 :이 계획의

from ftplib import FTP 
import shelve 

olddir = shelve.open('filelist.shl') # create a persistent dictionary 

ftp = FTP('ftp1.freebsd.org') 
ftp.login() 

result = [] 
ftp.dir(result.append) 
newdir = set(result[1:]) 

print ' New Files '.center(50, '=') 
for line in sorted(set(newdir) - set(olddir)): 
    print line 
    olddir[line] = '' 
print ' Done '.center(50, '=') 
olddir.close() 
+0

그래서 oldlist.txt 파일을 작성하는 대신, 새 목록을 모듈과 비교 한 다음 파일에 변경 사항을 출력 할 수있는 곳에 저장하십시오. 미안하지만 그 말이 맞지 않으면 나는 아주 새로운 것입니다. 그리고 예제를 보여줄 수 있습니까? 도와 줘서 고마워! 또한이 코드를 실행하면 나에게 FTP 서버의 전체 목록을 보여줍니다. 나는 변화가 필요하다. – user1005974

+0

예를 들어 raymond에 감사드립니다. 나는 이것을 순간에 시도 할 것이고 그것이 무엇이 떠오르는지를 볼 것이다. 다시 감사합니다. – user1005974

+0

Raymond는 코드가 훌륭하게 작동하는 것 같습니다. 하지만 인쇄 라인 코드를 바꿔서 텍스트 파일에 복사하여 다른 프로세스를 시작할 수 있습니다. 도와 줘서 고마워. – user1005974

0

귀하의 구현이 합리적이다. 자동 FTP 메시지를 구현하기 위해이 계획을 선택하지 않을 것입니다. 이 접근 방법에는 약점이 두 가지 있습니다.

  • 반복되는 파일 이름을 지원하지 않습니다. "이전"기록에서 나타나는 파일 이름은 새 파일로 검색되지 않습니다. 어쩌면 이것은 당신을위한 문제 일 수도 있습니다. 그러나 파일 이름이 지금 유일하게 보장된다고해도, 항상 사실 일 수는 없습니다.
  • 새 파일을 사용할 준비가되었는지 여부는 알려주지 않습니다. 새 파일이 아직 업로드되는 동안 처리 될 수 있습니다. 어떤 사람들은 "X 초 동안 크기에 변화가 없음"규칙을 적용하지만, 단지 지연을 증가시키고 절단 된 연결에 취약성을 남깁니다.

비슷하지만 두 가지 문제 중 하나가없는 하나의 구성표는 실제로 파일을 예약 된 이름으로 서버에 저장하거나 별도의 장소에 저장하고 해당 타임 스탬프 (바람직하게는 파일 자체)를 사용하여 안전하게 처리 할 수있는 파일을 결정합니다. 이 "세마포어"파일은 파일 업로드의 마지막 단계로 현재 시간으로 업데이트됩니다. 세마포어 타임 스탬프보다 오래된 수정 시간을 가진 모든 파일을 처리 할 수 ​​있습니다. 처리가 완료되면 모든 파일을 업로드 폴더에서 삭제하여 두 번 처리하지 않아야합니다. 자동화 된 생산 데이터 흐름에서이 계획이 잘 작동하는 것을 보았습니다.

+0

wberry, 답변 해 주셔서 감사합니다. 클라이언트가 파일을 보낼 때마다 정확한 이름을 가진 파일에 문제가 없습니다. 파일 이름에 날짜와 시간 스탬프가 포함되어 있습니다.두 번째 단락에서 무슨 뜻인지 정말로 모르겠습니다. 나는 종류가 있지만 내 코드로 구현하는 방법을 모르겠다. 정말 고마워! – user1005974

+0

부분적으로 파일을 소비하는 필자가 선호하는 방법은 실제로 임시 폴더에 파일을 업로드 한 다음 파일을 업로드 한 후 최종 폴더로 옮기는 것입니다. 소비자는보고있는 파일을 처리 한 다음 삭제할 수 있습니다. 그러나 FTP 서버 권한은이 파일이 작동하도록 파일을 이동할 수 있어야합니다. – wberry

관련 문제