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

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的文件系统编码:
    import sys
    print(sys.getfilesystemencoding())
    
    Ubuntu环境下正常应该输出utf-8,如果不是,你可以在启动Python前设置环境变量:
    export LC_ALL=en_US.UTF-8
    export PYTHONIOENCODING=utf-8
    
    这样Python就能正确识别UTF-8编码的西里尔字符文件名,os.listdir会直接返回正确的Unicode字符串。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:27:44