使用 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 存档:
顺便说一句,请注意代码 下载 文件。如果不实际 下载 文件内容,您将无法解析远程文件内容。该代码只是避免将下载的文件内容存储到(临时)本地文件中。
我正在尝试使用 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 存档:
顺便说一句,请注意代码 下载 文件。如果不实际 下载 文件内容,您将无法解析远程文件内容。该代码只是避免将下载的文件内容存储到(临时)本地文件中。