2011-10-20 8 views
2

私の主な目標は、いつでも新しいファイルが見つかるようにFTPサーバーをチェックし、そこでコピーされた新しいファイルだけを含む.txtファイルを生成することです。新しいファイルがない場合は何も返しません。ここまで私がこれまで持っていたことがあります。私は、サーバーからoldlist.txtにファイルをコピーし、次にFTPサイトに接続し、newlist.txtとoldlist.txtのデータと、一時的なFTPファイルのchanges.txtで差異を比較することから始めました。接続するたびにnewlist.txtを変更してoldlist.txtにして、次回の接続時と比較できるようにします。これを行うより良い方法はありますか?私のリストは毎回データを変更しないようです。これは混乱のおかげで申し訳ありません。FTPとリストを使用したPythonプログラミング

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 

また、代わりに生のテキストとしてファイルにリストを保存するには、通常のPythonの辞書のような便利なアクセス可能な永続ストアを作るために棚上げモジュールを使用することができます。

そうしないと、コードが簡単で簡単になるという利点があります。

はここで働いた例です。この方式の

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

レイモンドあなたのコードはすごくうまくいくようです。しかし、私は印刷ラインコードをスワップし、テキストファイルにコピーして、別のプロセスを開始することができます。ご協力ありがとうございました。 – user1005974

0

あなたの実装が合理的です。あなたがやっているのであれば、自動FTPメッセージングを実装するためにこのスキームを選択しません。この方法には2つの弱点があります。

  • 繰り返しするファイル名はサポートしていません。 「古い」履歴に存在するファイル名は、新しいファイルとして検出されません。たぶんこれはあなたのための問題です、多分そうではありません。しかし、ファイル名が今では一意に保証されていても、それは常に真実ではないかもしれません。
  • 新しいファイルが使用可能かどうかはわかりません。新しいファイルがまだアップロードされている間に処理される可能性があります。一部の人は、「X秒間サイズの変更はありません」ルールを適用しますが、遅れが増え、切断された接続に脆弱性が残ります。

類似しているが、これらの2つの問題のいずれも持たない1つのスキームは、ファイルを予約された名前で、または別の場所に実際にサーバーに格納し、そのタイムスタンプ(好ましくはファイル自体)を使用して、どのファイルを安全に処理できるかを決定します。この "セマフォ"ファイルは、ファイルをアップロードする最後のステップとして現在の時刻に更新されます。セマフォタイムスタンプよりも古い変更時刻のファイルはすべて処理できます。処理が完了したら、すべてのファイルをアップロードフォルダから削除して、2回処理しないようにする必要があります。私はこの計画が自動化された生産データフローでうまく機能することを見てきました。

+0

wberry、ご返信ありがとうございます。クライアントがファイルを送信するたびに、ファイル名に日付とタイムスタンプが含まれているので、私は全く同じ名前のファイルに問題はありません。私は本当にあなたの2番目の段落で何を意味するか分からない。私の考えはありますが、私のコードでそれをどのように実装するのかは分かりません。本当にありがとう! – user1005974

+0

部分的にファイルを消費する方法としては、実際にはtempフォルダにファイルをアップロードし、アップロード後に最終フォルダに移動するのが一般的です。消費者は、見たファイルを処理してから削除することができます。しかし、FTPサーバーのアクセス許可では、これを動作させるためにファイルを移動できる必要があります。 – wberry

関連する問題