Paramiko utf-8 解决方法

Paramiko utf-8 workaround

我正在尝试解决 paramiko 严格的 utf-8 解码功能。我想以二进制模式打开文件并逐行读入数据帧。我该怎么做?

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

我在我的服务器上进行了测试,我看到了

这个代码

remote_file = sftp.open(remoteName)
print(remote_file.read())

读取数据为 bytes - 即使我没有设置 bytes-mode (rb)

这个代码

remote_file = sftp.open(remoteName)
print(remote_file.readlines())

通常读取数据为 string 但当我设置 bytes-mode (rb).

时可以读取为 bytes

似乎当我使用 read_csv(remote_file) 然后它使用一些内部包装器并自动转换为 utf-8 - 即使我设置 bytes-mode (rb) - 和read_csv 中的设置 encoding 无法更改。

但是我可以用read()io.StringIO用ie手动转换。 latin1

import io

remote_file = sftp.open(remoteName)

bytes = remote_file.read()
text = bytes.decode('latin1')
#text = remote_file.read().decode('latin1')

file_obj = io.StringIO(text)

df = pd.read_csv(file_obj)
#df = pd.read_csv(io.StringIO(text))

编辑:

基于 中的答案,它适用于 read_csv 中的 io.BytesIOencoding

import io 

remote_file = sftp.open(remoteName)

bytes = remote_file.read()

file_obj = io.BytesIO(bytes)

df = pd.read_csv(file_obj, encoding='latin1')
#df = pd.read_csv(io.BytesIO(bytes), encoding='latin1')