Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python从包含给定字符串的FTP服务器下载文件_Python_Ftp_Ftplib - Fatal编程技术网

使用Python从包含给定字符串的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

我正在尝试从FTP服务器下载大量共享公共字符串(
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)