【问题标题】:Python Paramiko UTF-8 error when trying to stream file from SFTP server尝试从 SFTP 服务器流式传输文件时出现 Python Paramiko UTF-8 错误
【发布时间】:2025-11-22 17:25:01
【问题描述】:

我有一个程序,我在其中使用 Paramiko 从 SFTP 服务器获取文件。最初我使用get 在本地提取文件,然后通过打开本地副本来处理文件。但是,我试图避免使用get,而只是将文件作为流读取。在遇到不是 UTF-8 的字符(例如 )之前,这一切正常。发生这种情况时,程序会出现异常。出现问题就行了:

for line in remote_file

所以我无法从流中获取数据。我已经看到提到解码和重新编码,但我没有看到任何方法能够做到这一点,因为我没有得到 Paramiko 的数据。

是否有一个 Paramiko 参数说明要做什么或提供某种方法来获取原始数据?我该如何解决这个问题?

下面是正在处理的代码 - 前 3 行建立了连接。然后我有一些代码(未显示),我通过目录过滤找到我关心的文件列表。最后一行的下一行打开了与 SFTP 服务器上文件的连接。最后一行是发生错误的地方 - 我在整个代码块周围都有一个 try 块。遇到异常时返回的错误是

UnicodeDecodeError: 'utf-8' codec can't decode byte 0x96 in position 124: invalid start byte

ftpTransport = paramiko.Transport((FTPSERVER, FTPPORT))
ftpTransport.connect(username=FTPUSERNAME, password=FTPPASSWORD)
sftp = paramiko.SFTPClient.from_transport(ftpTransport)
remote_file = sftp.open(remoteName)
for line in remote_file:

如果我执行sftp.get 然后打开本地文件,我不会收到 UTF-8 错误。现在我已经更改了我的代码以采取该步骤,但如果我不需要,我不想在本地复制文件。

【问题讨论】:

    标签: python unicode utf-8 sftp paramiko


    【解决方案1】:

    Paramiko 假定所有文本文件都是 UTF-8 并使用“严格”解码(出现任何错误时中止)。

    要解决此问题,您可以以“二进制”模式打开文件。然后,next()readline() 和类似名称将返回“二进制字符串”,您可以使用任何您喜欢的编码对其进行解码,或者使用 UTF-8 忽略错误进行解码:

    remote_file = sftp.open(remoteName, "rb")
    for line in remote_file:
        print(line.decode("utf8", "ignore"))
    

    【讨论】:

      最近更新 更多