Python 3中读取含西里尔字符文件名及解码os.listdir输出方法
解决Python 3.6在Ubuntu下解码西里尔字符文件名的问题
这问题我之前处理多语言文件名的时候也踩过坑,咱们一步步来搞定它。
首先,你看到的['\udcd0\udc9e\udcd0\udc94 \udcd0\udc94.bmp']其实是UTF-16代理对字符——本质是系统或Python输出层错误地把UTF-8编码的文件名字节用UTF-16解码了,才导致显示成这种乱码形式。要还原成原文件名ОД Д.bmp,可以用以下方法:
手动还原文件名的代码示例
import os # 获取os.listdir返回的错误文件名 bad_name = '\udcd0\udc9e\udcd0\udc94 \udcd0\udc94.bmp' # 1. 将代理对字符串转回UTF-16字节(surrogatepass参数保留代理对不报错) byte_data = bad_name.encode('utf-16', 'surrogatepass') # 2. 用正确的UTF-8编码解码字节,得到原文件名 correct_name = byte_data.decode('utf-8') print(correct_name) # 输出:ОД Д.bmp
从根源避免这个问题
如果每次手动转换太麻烦,可以检查并修复系统/Python的编码设置:
- 先确认Python的文件系统编码:
Ubuntu环境下正常应该输出import sys print(sys.getfilesystemencoding())utf-8,如果不是,你可以在启动Python前设置环境变量:
这样Python就能正确识别UTF-8编码的西里尔字符文件名,export LC_ALL=en_US.UTF-8 export PYTHONIOENCODING=utf-8os.listdir会直接返回正确的Unicode字符串。
内容的提问来源于stack exchange,提问作者Atin Ghosh
相关产品推荐
相关产品推荐

