Python2转Python3的树莓派FTP上传脚本编码错误求助
解决Python3 FTP上传含特殊字节文件的UnicodeDecodeError问题
问题根源
Python2默认以字节模式处理文件读取,而Python3默认使用文本模式(会自动尝试用系统默认编码解码字节为字符串)。你的txt文件包含0xb0字节(对应GBK编码的°字符),Python3用utf-8解码时,该字节不属于合法utf-8序列,因此触发UnicodeDecodeError。
直接解决方法:二进制模式读取并上传
FTP上传本质是传输字节流,不需要将文件内容解码为字符串。修改Python上传脚本的文件读取和FTP上传方式:
- 以二进制模式打开文件:将
open(file_path, 'r')改为open(file_path, 'rb') - 使用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
相关产品推荐
相关产品推荐

