2016-08-14 10 views
1

ftpサーバーから共通の文字列( 'DEM')を共有する多数のファイルをダウンロードしようとしています。これらのファイルは、複数のディレクトリにネストされています。たとえば、「Adair> DEM *」および「Adams> DEM *」Pythonを使用して指定された文字列を含むFTPサーバーからファイルをダウンロード

FTPサーバーは、ftp://ftp.igsb.uiowa.edu/gis_library/counties/にあり、ユーザー名とパスワードは必要ありません。 だから、私は各郡を通過して、 'DEM'という文字列を含むファイルをダウンロードしたいと思います。

ここでは、スタック上の多くの質問とpythonのドキュメントを読んでいますが、ftplibの使い方を理解できません。 FTP()はユーザー名とパスワード(必須ではありません)を使わずにサイトに入るため、ftplibやurllibの中でglob.globをgrepまたは使用する方法を理解できません。

ご協力いただきありがとうございます

答えて

1

ディレクトリをダウンロードしようとするか、ファイルをスキャンしようとすると問題が発生することがあります。例外処理は、間違ったファイルタイプをトラップしてスキップするのに便利です。あなたは、リモートのファイルシステムにしているので、

glob.globが動作することはできませんが、名前

に一致するようfnmatchを使用することができますここでは、コードです:それは、ディレクトリによってソート、TEMPディレクトリに*DEM*に一致するすべてのファイルをダウンロードしてください。

import ftplib,sys,fnmatch,os 

output_root = os.getenv("TEMP") 

fc = ftplib.FTP("ftp.igsb.uiowa.edu") 
fc.login() 
fc.cwd("/gis_library/counties") 

root_dirs = fc.nlst() 
for l in root_dirs: 
    sys.stderr.write(l + " ...\n") 
    #print(fc.size(l)) 
    dir_files = fc.nlst(l) 
    local_dir = os.path.join(output_root,l) 
    if not os.path.exists(local_dir): 
     os.mkdir(local_dir) 

    for f in dir_files: 
     if fnmatch.fnmatch(f,"*DEM*"): # cannot use glob.glob 
      sys.stderr.write("downloading "+l+"/"+f+" ...\n") 
      local_filename = os.path.join(local_dir,f) 
      fh = open(local_filename, 'wb') 
      fc.retrbinary('RETR '+ l + "/" + f, fh.write) 

fc.close() 
+0

お寄せいただきありがとうございます。 fc.cwd( '/ GIS_Library/Counties /')とfc.nlst()を使用すると、ディレクトリのリストを簡単に作成できます。しかし、ワイルドカードを使用して各サブディレクトリ内の文字列 "DEM"を含むファイルを検索してダウンロードする方法はまだ分かりません。 – geos

+0

完全なコードが提供されていますが、動作しているようです(すべてがダウンロードされるまで待つことはありませんでした) –

+0

これは現在動作しています。あなたの助けをありがとう! – geos

関連する問題