使用Python从包含给定字符串的FTP服务器下载文件
我正在尝试从FTP服务器下载大量共享公共字符串(使用Python从包含给定字符串的FTP服务器下载文件,python,ftp,ftplib,Python,Ftp,Ftplib,我正在尝试从FTP服务器下载大量共享公共字符串(DEM)的文件。这些文件嵌套在多个目录中。例如,Adair/DEM*和Adams/DEM* FTP服务器位于此处:ftp://ftp.igsb.uiowa.edu/gis_library/counties/,不需要用户名和密码。 因此,我想遍历每个县并下载包含字符串DEM的文件 我在这里读了很多关于堆栈溢出和Python文档的问题,但不知道如何使用ftplib.FTP()在没有用户名和密码(这不是必需的)的情况下进入站点,我也不知道如何在ftpli
DEM
)的文件。这些文件嵌套在多个目录中。例如,Adair/DEM*
和Adams/DEM*
FTP服务器位于此处:ftp://ftp.igsb.uiowa.edu/gis_library/counties/
,不需要用户名和密码。
因此,我想遍历每个县并下载包含字符串DEM
的文件
我在这里读了很多关于堆栈溢出和Python文档的问题,但不知道如何使用ftplib.FTP()
在没有用户名和密码(这不是必需的)的情况下进入站点,我也不知道如何在ftplib或urllib中grep或使用glob.glob
提前感谢您的帮助好的,似乎有效。如果尝试下载目录或扫描文件,可能会出现问题。异常处理可以方便地捕获错误的文件类型并跳过
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)
with open(local_filename, 'wb') as fh:
fc.retrbinary('RETR '+ l + "/" + f, fh.write)
fc.close()
与本地模式匹配的解决方案是符合FTP标准的正确便携式解决方案
尽管如此,您几乎可以始终使用更简单、更高效的解决方案,如:
files = ftp.nlst("*DEM*")
for f in files:
with open(f, 'wb') as fh:
ftp.retrbinary('RETR ' + f, fh.write)