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

5

我正在使用Paramiko从SFTP服务器获取文件的程序。最初,我使用get将文件拉到本地,然后通过打开本地副本来处理文件。但是,我尝试避免使用get,而是将文件视为流进行读取。这很好用,直到遇到不是UTF-8的字符,比如 <96>。此时程序会抛出异常。问题出现在以下代码行:

for line in remote_file

我无法从流中获取数据。我看到了解码和重新编码的提及,但是由于Paramiko没有给我数据,所以我看不到任何方法能够做到这一点。

是否有Paramiko参数可以指定要执行的操作或提供某种方式来获取原始数据?如何解决这个问题?

下面是正在处理的代码 - 前三行建立连接。然后我有一些代码(未显示)在其中过滤目录并找到我关心的文件列表。倒数第二行打开与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:

如果我使用sftp.get然后打开本地文件,就不会出现UTF-8错误。目前我已经改变了我的代码来执行这一步骤,但如果不必要的话,我宁愿不复制本地文件。

1个回答

4
Paramiko假定所有文本文件都是UTF-8编码,并使用“严格”解码(在任何错误时中止)。为了解决这个问题,您可以以“二进制”模式打开文件。然后,next()、readline()等函数将返回“二进制字符串”,您可以使用任何编码进行解码,或者使用忽略错误的UTF-8进行解码:
remote_file = sftp.open(remoteName, "rb")
for line in remote_file:
    print(line.decode("utf8", "ignore"))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接