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

标签 python unicode utf-8 sftp paramiko

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

for line in remote_file

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

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

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

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 错误。现在我已经更改了我的代码以执行该步骤,但如果不需要,我宁愿不在本地复制文件。

最佳答案

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

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

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

关于尝试从 SFTP 服务器流式传输文件时出现 Python Paramiko UTF-8 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54078205/

相关文章:

javascript - 使用 JavaScript 进行 Python RQ 排队

php - 在 mySQL 中插入带有特殊字符的 JSON 编码值失败

具有多层条件的Python正则表达式匹配组

python - 如何将可变数量的参数格式化为字符串?

python - 尝试/除非在证书/ key 不匹配的情况下不使用扭曲的 starttls

c - 使用 TPL 在结构中序列化 wchar_t*

qt - Qt中Utf-32字符的长度

python - 我应该在 Python 中使用哪个微数据解析器

c - 如果将 Unicode 数据解析为多字节,程序会崩溃吗?

python - BTS 正在抓取带有 utf8 错误的文本,但在原始网页上看起来不错