Copiando o geodatabase do arquivo no site ftp para o disco local usando Python?

11

Existe um geodatabase de arquivo em um site ftp que eu gostaria de baixar com um script Python. No momento, estou pensando que uma maneira de fazer isso é copiar o geodatabase ftp para um geodatabase no meu computador. Abaixo está o script que eu comecei. Alguém sabe como posso alterar esse script para obter ftp gdb? Obrigado


Abaixo está o meu código final de trabalho, com base na resposta @om_hennners fornecida.

import arcpy, os, sys
from arcpy import env
arcpy.env.overwriteOutput = True
from ftplib import FTP

directory = "/group/geodb" #location of gdb on ftp
folder = "D:\\temp\\" 
out_gdb = "data.gdb"
out_path = folder + os.sep + out_gdb
copy_gdb = "hydro.gdb" # This is the gdb I would like to copy from the ftp  site
ftp = FTP("10.4.2.22")
ftp.login("user", "pass")

ftp.cwd(os.path.join(directory, copy_gdb))
print "Changed to " + os.path.join(directory, copy_gdb)

filenames = ftp.nlst()
print filenames

print "starting to write"
for f in filenames:
    with open(os.path.join(out_path, f), 'wb') as local_file:
    ftp.retrbinary('RETR '+ f, local_file.write)      


ftp.close()
print "closed ftp connection"
Patty Jula
fonte
A menos que eu tenha esquecido, você está definindo o espaço de trabalho do ambiente em qualquer lugar? De qualquer maneira, a variável copy_gdb a usará como local.
ahigh
4
Você já pensou em compactar seu geodatabase em um arquivo ZIP? Quase não há razão para ter um geodatabase não compactado em um site FTP.
precisa saber é o seguinte
é possível definir um geodatabase no site ftp como espaço de trabalho sem a necessidade de fazer o download?
Geogeek
3
@geogeek Não, não é ...
blah238
1
@ PattyJula Tinha que escrever um script ftp hoje. Acontece que o ftplib embutido é um problema para navegar em uma hierarquia de diretórios. Em vez disso, fiz com o ftputil , o que eu recomendaria se você tentasse isso novamente.
Om_henners # 12/12

Respostas:

9

Nesse caso, você não precisa usar as bibliotecas do arcpy para copiar o geodatabase. Em vez disso, você está olhando para copiar arquivos através de uma conexão ftp, o que pode ser feito com o retrbinarycomando ftplib .

Observe também que o sistema de arquivos trata os bancos de dados geográficos como objetos de pasta com um conjunto de arquivos dentro deles. ou seja, eles não são um único arquivo binário que pode ser transferido em uma ocorrência usando o ftplib.

Então, realmente o que você quer fazer é criar uma pasta local chamada data.gdbe, em seguida, no servidor ftp, percorrer todos os arquivos hydro.gdbe fazer o download deles. Algo como o seguinte deve funcionar (com um pouco de código emprestado dessa resposta de estouro de pilha, pois não conheço muito bem o ftplib):

import os
import os.path
from ftplib import FTP

directory = "/group/geodb" #location of gdb on ftp
copy_gdb = "hydro.gdb" # This is the gdb I would like to copy from the ftp site

folder = "D:\\temp\\"
out_gdb = "data.gdb"
out_path = os.path.join(folder, out_gdb)

#First, create the out geodatabase as a folder
os.mkdir(out_path)

#FTP logon
ftp = FTP("10.4.2.22")
ftp.login("user", "pass")

#Again, treat the gdb as a folder and navigate there
ftp.cwd(os.path.join(directory, copy_gdb))
print "Changed to " + os.path.join(directory, copy_gdb)

#Now get a list of all files in the folder
filenames = ftp.nlst()
print filenames

#and loop through the filenames to download the files to your local 'gdb'
for f in filenames:
    with open(os.path.join(out_path, f), 'wb') as local_file:
        ftp.retrbinary('RETR '+ filename, local_file.write)

ftp.close()
print "closed ftp connection"
om_henners
fonte
1
Isso funcionou. Muito obrigado om_henners! Eu tive que mudar uma ou duas pequenas coisas com o seu código, postarei meu script final em breve.
Patty Jula