Sao chép tập tin geodatabase trên trang web ftp vào đĩa cục bộ bằng Python?


11

Có một cơ sở dữ liệu địa lý tập tin đang ngồi trên một trang web ftp mà tôi muốn tải xuống với một tập lệnh Python. Ngay bây giờ tôi đang nghĩ một cách để làm điều này là sao chép cơ sở dữ liệu địa lý ftp vào cơ sở dữ liệu địa lý trên máy tính của tôi. Dưới đây là kịch bản tôi đã bắt đầu. Có ai biết làm thế nào tôi có thể thay đổi tập lệnh này để tôi có được ftp gdb không? Cảm ơn bạn


Dưới đây là mã làm việc cuối cùng của tôi dựa trên câu trả lời @om_hennners được cung cấp.

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"

Trừ khi tôi bỏ qua nó, bạn có thiết lập không gian làm việc môi trường ở bất cứ đâu không? Dù bằng cách nào, biến copy_gdb sẽ sử dụng nó làm vị trí của nó.
AHigh

4
Bạn đã xem xét việc nén cơ sở dữ liệu địa lý của mình vào một tệp ZIP chưa? Hầu như không có lý do để có một cơ sở dữ liệu địa lý không nén trên một trang FTP.
blah238

bạn có thể đặt cơ sở dữ liệu địa lý trên trang web ftp làm không gian làm việc mà không cần phải tải xuống không?
geogeek

3
@geogeek Không, không phải ...
blah238

1
@PattyJula Hôm nay phải viết một tập lệnh ftp. Hóa ra ftplib inbuilt là một nỗi đau để điều hướng một người thừa kế thư mục. Thay vào đó tôi đã làm điều đó với ftputil , mà tôi khuyên bạn nên thử lại lần nữa.
om_henners

Câu trả lời:


9

Trong trường hợp này, bạn không cần phải sử dụng các thư viện arcpy để sao chép cơ sở dữ liệu địa lý. Thay vào đó, bạn đang xem xét sao chép các tập tin qua kết nối ftp, bạn có thể thực hiện với retrbinarylệnh ftplib .

Cũng lưu ý rằng hệ thống tệp xử lý cơ sở dữ liệu địa lý dưới dạng đối tượng thư mục với một tập hợp các tệp bên trong chúng. tức là chúng không phải là một tệp nhị phân duy nhất có thể được chuyển trong một lần nhấn bằng cách sử dụng ftplib.

Vì vậy, thực sự những gì bạn muốn làm là tạo một thư mục cục bộ được gọi data.gdb, và sau đó trên các vòng lặp máy chủ ftp thông qua tất cả các tệp trong hydro.gdbvà tải chúng xuống. Một cái gì đó như sau sẽ hoạt động (với một chút mã được mượn từ câu trả lời tràn ngăn xếp này vì tôi không biết rõ về 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
Điều đó đã làm việc. Cảm ơn bạn rất nhiều om_henners! Tôi đã phải thay đổi một hoặc hai điều nhỏ với mã của bạn, tôi sẽ sớm đăng kịch bản cuối cùng của mình.
Patty Jula
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.