5 votos

Descargar datos mediante un servidor de ftp usando características de polígono

La secuencia de comandos adjunta de bucles a través de las características de un polígono featureclass y utiliza esa información de atributo para descargar archivos en particular a través de un servidor ftp. El script funciona muy bien para la descarga de archivos mientras todos los archivos en el servidor ftp están contenidos dentro de una carpeta (ejemplo).

Ahora, tengo que descargar las imágenes a través de un servidor ftp con un archivo diferente estructura (ejemplo) donde los archivos están contenidos dentro de varias carpetas. ¿Cómo puedo modificar el código de modo que se producen las siguientes acciones?:

  1. Uso polígono características para identificar el archivo necesario para descargar (terminado)
  2. Acceso a la carpeta correcta y descargar las imágenes

Sospecho que necesito para utilizar el sistema operativo.ruta de acceso del módulo, sin embargo, no puedo parecer para poner las piezas juntas.


# Download data via a ftp server

import arcpy, ftplib, os, socket

HOST = 'ftp.agrc.utah.gov'
DIRN = '/Imagery/NAIP2011_4-band/'
#FILE = ''     # Defined later in for loop
workspace = r'F:\my\workspace'  # This is where the downloads go
quads = r'F:\path\to\polygon\shapefile' # Used to define which files to download

# Get current working directory
print 'The current working directory is %s' % os.getcwd()

# Change the current working directory to a download folder
os.chdir(workspace)
print 'The workspace has been changed to %s' % workspace 

try:
    f = ftplib.FTP(HOST)
except (socket.error, socket.gaierror), e:
    print 'ERROR: cannot reach "%s"' % HOST
print '*** Connected to host "%s"' % HOST

try:     
    f.login()
except ftplib.error_perm:
    print 'Error: cannot login anonymously'
    f.quit()
print '*** Logged in as "anonymous"'

try:
    f.cwd(DIRN)
except ftplib.error_perm:
    print 'ERROR: cannot CD to "%s"' % DIRN
    f.quit()
print '*** Changed to "%s" folder' % DIRN

# Use search cursor to loop through download polygons,
# get the name of the required file and use that name to download file on ftp site
with arcpy.da.SearchCursor(quads, ("TILE_NAME", "QUADID")) as cursor:
    for row in cursor:
        print row[0]
        FILE = row[0] + ".tif"
        name = row[1]

        try:
            f.retrbinary('RETR %s' % FILE, open(FILE, 'wb').write)
            arcpy.Rename_management(os.path.join(workspace, FILE), os.path.join(workspace, name + ".tif"))
        except ftplib.error_perm:
            print 'ERROR: cannot read file "%s"' % FILE
            os.unlink(FILE)
        else:
            print '*** Downloaded "%s" to CWD' % FILE
f.quit()

6voto

Markus Olsson Puntos 12651

En tu ejemplo tienes una carpeta de raíz que contiene muchas carpetas numeradas.

Se puede simplemente:

1) usa python para listar las carpetas numeradas:

    files = ftp.dir()
    print files

2) coincide con la función de polígono a la carpeta correcta

3) Abra el directorio correcto

ftp.cwd("/numbered_folder")

4) utilizar el código existente para descargar los archivos.

2voto

Aaron Puntos 25882

La respuesta es un revestimiento de dos:

Agregar un nombre de carpeta de la tabla de atributos del polígono

folder = row[0][:5] + "/"

Y luego cambiar el directorio en cada iteración

f.cwd(DIRN + folder)

Poner todos juntos a partir de la with declaración:

with arcpy.da.SearchCursor(quads, ("TILE_NAME", "QUADID")) as cursor:
    for row in cursor:
        print row[0]
        FILE = row[0] + ".tif"
        name = row[1]
        folder = row[0][:5] + "/"

        try:
            f.cwd(DIRN + folder)
            f.retrbinary('RETR %s' % FILE, open(FILE, 'wb').write)
            arcpy.Rename_management(os.path.join(workspace, FILE), os.path.join(workspace, name + ".tif"))
        except ftplib.error_perm:
            print 'ERROR: cannot read file "%s"' % FILE
            os.unlink(FILE)
        else:
            print '*** Downloaded "%s" to CWD' % FILE

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X