【问题标题】:Is it possible to specify the encoding of a file with Paramiko?是否可以使用 Paramiko 指定文件的编码?
【发布时间】:2021-04-27 10:22:46
【问题描述】:

我正在尝试使用 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 模块识别编码?

【问题讨论】:

    标签: python csv sftp paramiko pysftp


    【解决方案1】:

    如果文件不是很大,那么在内存中加载两次也没有问题,你可以下载并转换内存中的内容:

    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.BytesIO to io.StringIO to parse HTML page

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-13
      • 2010-10-29
      • 2012-05-26
      • 1970-01-01
      • 2016-10-21
      • 1970-01-01
      相关资源
      最近更新 更多