Python2解决中文文件名乱码:从编码检测到跨平台兼容方案

巷口听风
巷口听风
发布时间:2026-10-13| 4人浏览过
原创

本文详解Python2中获取包含中文文件名时出现乱码的原因及解决方法。通过引入chardet模块检测文件编码(如GB2312与UTF-8),并封装兼容Windows与Linux系统的解码函数,实现中文文件名的正确读取与显示。

问题背景

在Python2环境下,若直接获取包含中文字符的文件名且未进行编码转换,输出的结果通常会显示为乱码。

假设测试目录名为test,该目录下包含5个文件名含有中文的PDF文件,具体列表如下:

Python性能分析与优化.pdf

Python数据分析与挖掘实战.pdf

Python编程实战:运用设计模式、并发和程序库创建高质量程序.pdf

流畅的Python.pdf

编写高质量Python代码的59个有效方法.pdf

首先,我们尝试不经过编码转换直接打印获取到的文件名,相关代码如下:

import os
for file in os.listdir('./test'):
 print(file)

运行上述代码后,控制台输出显示为乱码:

Python���ܷ������Ż�.pdf
Python���ݷ������ھ�ʵս.pdf
Python���ʵս���������ģʽ�������ͳ���ⴴ������������.pdf
������Python.pdf
�������Python�����59��������.pdf

解决方案

为了正确解析文件名,首先需要测试文件名的实际编码格式。这里我们将使用chardet模块,安装该模块的命令如下:

pip install chardet

接下来,利用chardet.detect函数对文件名进行编码方式检测:

{'confidence': 0.99, 'encoding': 'GB2312'}
{'confidence': 0.99, 'encoding': 'GB2312'}
{'confidence': 0.99, 'encoding': 'GB2312'}
{'confidence': 0.73, 'encoding': 'windows-1252'}
{'confidence': 0.99, 'encoding': 'GB2312'}

从检测结果可以看出,GB2312编码的置信度最高。因此,我们尝试使用GB2312编码对文件名进行解码,具体代码如下:

import os
import chardet
for file in os.listdir('./test'):
 r = file.decode('GB2312')
 print(r)

执行上述代码后的输出结果如下:

Python性能分析与优化.pdf

Python数据分析与挖掘实战.pdf

Python编程实战:运用设计模式、并发和程序库创建高质量程序.pdf

流畅的Python.pdf

编写高质量Python代码的59个有效方法.pdf

经过正确的编码解码处理后,文件名在打印时显示正常。

补充说明:chardet.detect函数检测的字符串长度越长,其判断结果越准确;反之,字符串越短,准确性可能降低。

此外,上述代码仅在Windows环境下测试通过。由于Linux系统下的文件名编码通常为UTF-8,为了实现Windows与Linux系统的兼容,我们需要对代码进行封装处理,具体实现如下:

# -*- coding: utf-8 -*-
import os

def get_filename_from_dir(dir_path):
 file_list = []
 if not os.path.exists(dir_path):
  return file_list
 for item in os.listdir(dir_path):
  basename = os.path.basename(item)
  # print(chardet.detect(basename)) # 找出文件名编码,文件名包含有中文
  # windows下文件编码为GB2312,linux下为utf-8
  try:
   decode_str = basename.decode("GB2312")
  except UnicodeDecodeError:
   decode_str = basename.decode("utf-8")
  file_list.append(decode_str)
 return file_list
# 测试代码
r = get_filename_from_dir('./test')
for i in r:
 print(i)

该函数首先尝试使用GB2312进行解码,若抛出UnicodeDecodeError异常,则回退使用UTF-8解码。此方案已在Windows7和Ubuntu16.04系统中测试通过,具备良好的跨平台兼容性。

以上关于Python2获取中文文件名编码问题的解决方法分享完毕,希望能为读者提供参考,欢迎继续关注与支持。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。