2016-08-14 93 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

相关问题