我正在尝试使用 Paramiko 和 Python 从 SFTP 下载文件。 我没有找到任何解决方案来避免 unicode 错误。
它可以使用
sftp.get()
方法工作,但我必须首先过滤文件名,因为它们是动态的。
for entry in sftp.listdir_attr(path):
mode = entry.st_mode
if S_ISREG(mode) and "erapsuspj" in entry.filename:
list_rep.append(entry.filename)
我收到以下错误:
Traceback (most recent call last):
File "....\getRep.py", line 49, in <module>
for entry in sftp.listdir_attr(path):
File "....\site-packages\paramiko\sftp_client.py", line 254, in listdir_attr
filename = msg.get_text()
File "....\site-packages\paramiko\message.py", line 184, in get_text
return u(self.get_string())
File "....\site-packages\paramiko\util.py", line 333, in u
return s.decode(encoding)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe2 in position 7: invalid continuation byte
有什么想法吗?谢谢,亚历克斯
在SFTP中,所有字符串都是UTF-8。您的 SFTP 服务器似乎已损坏并且正在以其他编码发送文件名。
没有简单的解决方案。 Paramiko(正确地)不允许您更改它用于解码文件名的编码。
您可以自己实现
listdir_attr
所做的事情,除了 UTF-8 解码之外。请调用 msg.get_text()
,而不是 msg.get_string().decode(actual_encoding)
。
或者修补
u()
函数以使用其他编码。