我正在尝试使用pysftp/Paramiko通过SFTP读取CSV。我的代码是这样的:
input_conn = pysftp.Connection(hostname, username, password)
file = input_conn.open("Data.csv")
file_contents = list(csv.reader(file))
但是当我这样做时,我得到以下错误:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x96 in position 23: invalid start byte
我知道这意味着文件预计是UTF-8编码,但不是。奇怪的是,如果我下载文件,然后用我的代码打开文件,我可以指定编码为"macroman"并且没有错误:
with open("Data.csv", "r", encoding="macroman") as csvfile:
file_contents = list(csv.reader(csvfile))
Paramiko文档说文件的编码在SFTP上是没有意义的,因为它将所有文件视为字节-但是,如果我使用Paramiko打开文件,我如何才能让Python的CSV模块识别编码?
如果文件不是很大,那么将它加载两次到内存中不是问题,您可以下载并转换内存中的内容:
with io.BytesIO() as bio:
input_conn.getfo("Data.csv", bio)
bio.seek(0)
with io.TextIOWrapper(bio, encoding='macroman') as f:
file_contents = list(csv.reader(f))
部分基于Convert io。字节对io。解析HTML页面。