Копирование файловой базы геоданных с ftp сайта на локальный диск с использованием Python?

11

На ftp-сайте находится файловая база геоданных, которую я хотел бы скачать с помощью скрипта Python. Сейчас я думаю, что один из способов сделать это - скопировать базу геоданных ftp в базу геоданных на моем компьютере. Ниже приведен скрипт, который я начал. Кто-нибудь знает, как я могу изменить этот скрипт, чтобы я получил ftp GDB? Спасибо


Ниже мой окончательный рабочий код, основанный на ответе @om_hennners.

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"
Пэтти Юла
источник
Если я не упустил это из виду, вы устанавливаете рабочее место среды где-нибудь? В любом случае переменная copy_gdb будет использовать его в качестве своего местоположения.
Ahigh
4
Рассматривали ли вы архивирование базы геоданных в ZIP-файл? Почти нет причин иметь несжатую базу геоданных на FTP-сайте.
blah238
Можно ли установить базу геоданных на сайте ftp в качестве рабочей области без необходимости ее загрузки?
Geogeek
3
@geogeek Нет, это не так ...
blah238
1
@PattyJula Пришлось сегодня написать скрипт ftp. Оказывается, встроенный ftplib - это боль для навигации по иерархии каталогов. Вместо этого я сделал это с помощью ftputil , который я бы порекомендовал, если бы вы когда-нибудь попробовали это снова.
om_henners

Ответы:

9

В этом случае вам не нужно использовать библиотеки arcpy для копирования базы геоданных. Вместо этого , вы смотрите на копирование файлов через соединение FTP, которые вы можете сделать с ftplib retrbinaryкоманды.

Также обратите внимание, что файловая система рассматривает базы геоданных как объекты папок с набором файлов внутри них. то есть это не один двоичный файл, который может быть передан за один клик с помощью ftplib.

Поэтому на самом деле вы хотите создать локальную папку с именем data.gdb, а затем на ftp-сервере перебрать все файлы hydro.gdbи загрузить их. Должно работать что-то вроде следующего (с небольшим количеством кода, заимствованного из этого ответа переполнения стека, поскольку я не очень хорошо знаю 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
источник
1
Это сработало. Большое вам спасибо om_henners! Мне пришлось изменить одну или две незначительные вещи с вашим кодом, я скоро опубликую свой последний сценарий.
Пэтти Джула