浅谈Python2获取中文文件名的编码问题


Posted in Python onJanuary 09, 2018

问题:

Python2获取包含中文的文件名是如果不转码会出现乱码。

这里假设要测试的文件夹名为test,文件夹下有5个文件名包含中文的文件分别为:

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

经过编码之后,文件名打印正确。

PS: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解码,如果出错再用utf-8解码,这样就兼容了Windows和Linux(在Win7和Ubuntu16.04测试通过)。

以上这篇浅谈Python2获取中文文件名的编码问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python映射拆分操作符用法实例
May 19 Python
Python通过90行代码搭建一个音乐搜索工具
Jul 29 Python
Python使用getpass库读取密码的示例
Oct 10 Python
python 3.0 模拟用户登录功能并实现三次错误锁定
Nov 01 Python
使用python装饰器计算函数运行时间的实例
Apr 21 Python
python 保存float类型的小数的位数方法
Oct 17 Python
Python实现FTP弱口令扫描器的方法示例
Jan 31 Python
python语言元素知识点详解
May 15 Python
python数据库编程 Mysql实现通讯录
Mar 27 Python
PyQt5结合matplotlib绘图的实现示例
Sep 15 Python
Scrapy中如何向Spider传入参数的方法实现
Sep 28 Python
Pandas||过滤缺失数据||pd.dropna()函数的用法说明
May 14 Python
在CentOS6上安装Python2.7的解决方法
Jan 09 #Python
浅谈Matplotlib简介和pyplot的简单使用——文本标注和箭头
Jan 09 #Python
用tensorflow实现弹性网络回归算法
Jan 09 #Python
Python+matplotlib实现计算两个信号的交叉谱密度实例
Jan 08 #Python
python matplotlib 注释文本箭头简单代码示例
Jan 08 #Python
Python自定义简单图轴简单实例
Jan 08 #Python
[原创]python爬虫(入门教程、视频教程)
Jan 08 #Python
You might like
PHP聊天室技术
2006/10/09 PHP
支持php4、php5的mysql数据库操作类
2008/01/10 PHP
php将fileterms函数返回的结果变成可读的形式
2011/04/21 PHP
php函数传值的引用传递注意事项分析
2016/06/25 PHP
从javascript语言本身谈项目实战
2006/12/27 Javascript
js loading加载效果实现代码
2009/11/24 Javascript
解析JavaScript中的标签语句
2013/06/19 Javascript
一个网页标题title的闪动提示效果实现思路
2014/03/22 Javascript
angularjs中的单元测试实例
2014/12/06 Javascript
javascript下使用Promise封装FileReader
2016/02/19 Javascript
Three.js基础学习之场景对象
2017/09/27 Javascript
详解vue中$nextTick和$forceUpdate的用法
2019/12/11 Javascript
微信小程序利用button控制条件标签的变量问题
2020/03/15 Javascript
浅析JavaScript预编译和暗示全局变量
2020/09/03 Javascript
[47:03]Ti4第二日主赛事败者组 LGD vs iG 2
2014/07/21 DOTA
用Python进行TCP网络编程的教程
2015/04/29 Python
详解Python中contextlib上下文管理模块的用法
2016/06/28 Python
python使用xlrd与xlwt对excel的读写和格式设定
2017/01/21 Python
python实现数据预处理之填充缺失值的示例
2017/12/22 Python
python 函数中的内置函数及用法详解
2019/07/02 Python
SELENIUM自动化模拟键盘快捷键操作实现解析
2019/10/28 Python
Pycharm调试程序技巧小结
2020/08/08 Python
Python+pyftpdlib实现局域网文件互传
2020/08/24 Python
史上最全面的Java面试题汇总!
2015/02/03 面试题
保安拾金不昧表扬信
2014/01/15 职场文书
机械设计毕业生自荐信
2014/02/02 职场文书
《风筝》教学反思
2014/04/10 职场文书
银行柜员求职自荐书
2014/06/18 职场文书
党的群众路线教育实践活动领导班子整改措施
2014/10/28 职场文书
群众路线个人剖析材料及整改措施
2014/11/04 职场文书
2014年党支部书记工作总结
2014/12/04 职场文书
世界红十字日活动总结
2015/02/10 职场文书
锦旗赠语
2015/06/23 职场文书
golang goroutine顺序输出方式
2021/04/29 Golang
html5调用摄像头实例代码
2021/06/28 HTML / CSS
springboot读取nacos配置文件
2022/05/20 Java/Android