首页 > 解决方案 > 使用 pdfplumber 和 Paramiko 从 SFTP 服务器读取 PDF 文件

问题描述

我有一个与 SFTP 服务器的直接连接——连接没有任何问题,我可以显示所选目录中的文件而没有任何重大问题。服务器上有不同的文件,我有几个函数可以读取它们,下面是一段关于.pdf文件的代码——我pdfplumber用来读取 PDF 文件:

# SSH.connect configuration

sftp = ssh.open_sftp()

path = "/server_path/.."
for filename in sftp.listdir(path):
    fullpath = path + "/" + filename
    if filename.endswith('.pdf'):
        #fullpath - full server path with filename - like /server_path/../file.pdf
        #filename - filename without path - like file.pdf
        with sftp.open(fullpath, 'rb') as fl:
            pdf = pdfplumber.open(fl)

在这个for循环中,我想读取.pdf所选目录中的所有文件 - 它在本地主机上对我有用,没有任何问题。

我试图以这种方式解决它with sftp.open(path, 'rb') as fl:- 但在这种情况下,这个解决方案不起作用,并且出现这样的错误代码:

Traceback (most recent call last):
pdf = pdfplumber.open(fl)
return cls(open(path, "rb"), **kwargs)
TypeError: expected str, bytes or os.PathLike object, not SFTPFile

pdfplumber.open将文件的确切路径及其名称作为参数——在本例中为完整路径。我怎样才能解决这个问题,以便它直接从服务器工作?在这种情况下如何管理内存——因为我知道这些文件以某种方式被拉入内存。请给我一些提示。

标签: pythonsftpparamiko

解决方案


ParamikoSFTPClient.open返回一个类似文件的对象。

要将类似文件的对象与 一起使用pftplumber,您似乎可以使用loadfunction

pdf = pdfplumber.load(fl)

您还需要阅读以下内容:
Reading file opens with Python Paramiko SFTPClient.open method is slow


由于 Paramiko 类文件对象在与pftplumber.load函数结合使用时似乎效果不佳,因此作为一种解决方法,您可以将文件下载到内存中:

flo = BytesIO()
sftp.getfo(fullpath, flo)
flo.seek(0)
pdfplumber.load(flo)

请参阅如何使用 Paramiko getfo 将文件从 SFTP 服务器下载到内存以进行处理


推荐阅读