You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python2转Python3的树莓派FTP上传脚本编码错误求助

解决Python3 FTP上传含特殊字节文件的UnicodeDecodeError问题

问题根源

Python2默认以字节模式处理文件读取,而Python3默认使用文本模式(会自动尝试用系统默认编码解码字节为字符串)。你的txt文件包含0xb0字节(对应GBK编码的°字符),Python3用utf-8解码时,该字节不属于合法utf-8序列,因此触发UnicodeDecodeError。

直接解决方法:二进制模式读取并上传

FTP上传本质是传输字节流,不需要将文件内容解码为字符串。修改Python上传脚本的文件读取和FTP上传方式:

  1. 以二进制模式打开文件:将open(file_path, 'r')改为open(file_path, 'rb')
  2. 使用FTP的二进制上传方法:用storbinary()替代storlines()(storlines()会按文本行处理,仍会涉及编码转换)

示例修改片段:

from ftplib import FTP

ftp = FTP('your_server')
ftp.login('user', 'pass')

# 原错误写法(文本模式)
# with open('target.txt', 'r') as f:
#     ftp.storlines('STOR target.txt', f)

# 正确写法(二进制模式)
with open('target.txt', 'rb') as f:
    ftp.storbinary('STOR target.txt', f)

ftp.quit()

额外排查思路

如果需要对文件内容做文本处理(比如修改内容后再上传),需明确Lua生成文件的编码:

  • 0xb0是GBK/GB2312编码的有效字符,若Lua脚本是按GBK编码写入文件,可指定编码打开:
    with open('target.txt', 'r', encoding='gbk') as f:
        content = f.read()
        # 处理文本内容...
        # 上传时仍需转成字节,或直接用二进制模式重新读取
    
  • 若要统一编码为utf-8,可在Lua生成文件时指定utf-8编码写入,避免后续编码不兼容问题。

报错对应场景

你遇到的UnicodeDecodeError格式通常为:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb0 in position X: invalid start byte

这完全符合上述编码不匹配的场景,二进制模式上传可直接绕过解码环节解决问题。

内容的提问来源于stack exchange,提问作者Toulon7559

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 21:01:02