2016-08-14 90 views
1

我試圖從ftp服務器下載大量共享共同字符串('DEM')的文件。這些文件嵌套在多個目錄中。例如,'Adair> DEM *'和'Adams> DEM *'從包含給定字符串的FTP服務器使用python下載文件

FTP服務器位於:ftp://ftp.igsb.uiowa.edu/gis_library/counties/並且不需要用戶名和密碼。 所以,我想經過每個縣和下載包含字符串「DEM」

我讀過很多關於堆棧,以及從Python中的文件的問題在這裏的文件,但無法弄清楚如何使用FTPLIB。 FTP()進入沒有用戶名和密碼(這不是必需的),並且我無法弄清楚如何grep或使用ftplib或urllib內的glob.glob到網站。

在此先感謝您的幫助

回答

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

相關問題