尝试从 SFTP 服务器传输文件时出现 Python Paramiko UTF-8 错误

efu*_*ltz 5 python unicode sftp utf-8 paramiko

我有一个程序,其中使用 Paramiko 从 SFTP 服务器获取文件。最初,我在本地提取文件get,然后通过打开本地副本来处理文件。但是,我试图避免get并只是将文件作为流读取。这工作正常,直到我遇到非 UTF-8 字符 - 例如 <96>。发生这种情况时,程序会出现异常。问题发生在线路上:

for line in remote_file
Run Code Online (Sandbox Code Playgroud)

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

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

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

UnicodeDecodeError:“utf-8”编解码器无法解码位置 124 中的字节 0x96:起始字节无效

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:
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ryl 4

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

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

remote_file = sftp.open(remoteName, "rb")
for line in remote_file:
    print(line.decode("utf8", "ignore"))
Run Code Online (Sandbox Code Playgroud)