Pythonを使用してFTPサイトのファイルジオデータベースをローカルディスクにコピーしますか?


11

PythonスクリプトでダウンロードしたいFTPサイトにファイルジオデータベースがあります。現在、これを行う1つの方法は、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を使用して1回のヒットで転送できる単一のバイナリファイルではありません。

本当にしたいのは、というローカルフォルダーを作成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"

1
うまくいきました。om_hennersどうもありがとう!コードで1つまたは2つの小さな変更を加える必要がありました。最終スクリプトをすぐに投稿します。
パティジュラ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.