使用 pysftp 从 SFTP 读取 SHP 文件

Read SHP file from SFTP using pysftp

我正在尝试使用 pysftp 的 getfo() 读取 shapefile(无需下载)。但是,我得到的输出似乎不可行,我不确定是否可以使用 shapefile 执行此操作。

理想情况下,我想读入文件并将其转换为 Geopandas GeoDataFrame。

import pysftp
import io

with pysftp.Connection(host=host, username=user, password=pass) as sftp:
    print("Connection established ... ")

    flo = io.BytesIO()
    sites = sftp.getfo('sites/Sites.shp', flo)
    value=flo.getvalue()

从这里我无法解码值并且不确定如何继续。

应该这样做:

flo.seek(0)
df = geopandas.read_file(shp=flo)

尽管使用 Connection.getfo 会不必要地将整个原始文件保存在内存中。更有效的是:

with sftp.open('sites/Sites.shp', bufsize=32768) as f:
    df = geopandas.read_file(f)

(为了bufsize=32768的目的,见


虽然如果我理解正确的话,你需要多个文件。当您通过类似文件的对象提供“shp”时,geopandas 无法神奇地访问远程服务器上的其他相关文件。 Geopandas 不知道“shp”从何而来,甚至不知道它的物理名称是什么。您需要为所有单个文件提供类似文件的对象。参见 Using pyshp to read a file-like object from a zipped archive – 他们不使用 Geopandas,但原理是相同的。

对于 Geopandas,底层 fiona 库似乎可以处理该问题,但我没有找到相关参数的任何文档。

我想 像这样的东西 可能会,但这只是一个疯狂的猜测:

with sftp.open('sites/Sites.shp', bufsize=32768) as shp,
     sftp.open('sites/Sites.shx', bufsize=32768) as shx:
     sftp.open('sites/Sites.dbf', bufsize=32768) as dbf:
     ...
    df = geopandas.read_file(shp, shx=shx, dbf=dbf, ...)

或者切换到shapefile/pyshp module:

with sftp.open('sites/Sites.shp', bufsize=32768) as shp,
     sftp.open('sites/Sites.shx', bufsize=32768) as shx:
     sftp.open('sites/Sites.dbf', bufsize=32768) as dbf:
     ...
    r = shapefile.Reader(shp=shp, shx=shx, dbf=dbf)

另一个技巧是将所有文件打包成 zip 存档:


顺便说一句,请注意代码 下载 文件。如果不实际 下载 文件内容,您将无法解析远程文件内容。该代码只是避免将下载的文件内容存储到(临时)本地文件中。