浅谈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中使用摄像头实现简单的延时摄影技术
Mar 27 Python
Python基础入门之seed()方法的使用
May 15 Python
Python实现栈的方法
May 26 Python
答题辅助python代码实现
Jan 16 Python
python实现将excel文件转化成CSV格式
Mar 22 Python
解决tensorflow测试模型时NotFoundError错误的问题
Jul 26 Python
python将txt文件读取为字典的示例
Dec 22 Python
Pandas库之DataFrame使用的学习笔记
Jun 21 Python
pytorch 预训练层的使用方法
Aug 20 Python
keras 实现轻量级网络ShuffleNet教程
Jun 19 Python
解决python 虚拟环境删除包无法加载的问题
Jul 13 Python
使用Python+OpenCV进行卡类型及16位卡号数字的OCR功能
Aug 30 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 array_search() 函数使用
2010/04/13 PHP
修改ThinkPHP缓存为Memcache的方法
2014/06/25 PHP
php+xml结合Ajax实现点赞功能完整实例
2015/01/30 PHP
php保存任意网络图片到服务器的方法
2015/04/14 PHP
详解WordPress中创建和添加过滤器的相关PHP函数
2015/12/29 PHP
PHP实现微信图片上传到服务器的方法示例
2017/06/29 PHP
PHP PDO数据库操作预处理与注意事项
2019/03/16 PHP
Javascript实例教程(19) 使用HoTMetal(3)
2006/12/23 Javascript
写出更好的JavaScript程序之undefined篇(中)
2009/11/23 Javascript
javascript作用域容易记错的两个地方分析
2012/06/22 Javascript
一个简单的瀑布流效果(主体形式自写)
2013/05/27 Javascript
js 限制input只能输入数字、字母和汉字等等
2013/12/18 Javascript
Get中文乱码IE浏览器Get中文乱码解决方案
2013/12/26 Javascript
js+html5实现canvas绘制圆形图案的方法
2015/06/05 Javascript
jquery显示loading图片直到网页加载完成的方法
2015/06/25 Javascript
jQuery平滑旋转幻灯片特效代码分享
2015/09/07 Javascript
浅谈JSON.stringify()和JOSN.parse()方法的不同
2016/08/29 Javascript
Vue.js Ajax动态参数与列表显示实现方法
2016/10/20 Javascript
JavaScript组成、引入、输出、运算符基础知识讲解
2016/12/08 Javascript
js实现一个可以兼容PC端和移动端的div拖动效果实例
2016/12/09 Javascript
Vue.js基础知识小结
2017/01/13 Javascript
jQuery 判断元素整理汇总
2017/02/28 Javascript
纯js实现隔行变色效果
2017/11/29 Javascript
微信小程序 腾讯地图SDK 获取当前地址实现解析
2019/08/12 Javascript
[51:11]2014 DOTA2国际邀请赛中国区预选赛5.21 LGD-CDEC VS DT
2014/05/22 DOTA
[01:20]DOTA2上海特级锦标赛现场采访:谁的ID最受青睐
2016/03/25 DOTA
python使用super()出现错误解决办法
2017/08/14 Python
python脚本之一键移动自定格式文件方法实例
2019/09/02 Python
python实现密码强度校验
2020/03/18 Python
pip安装tensorflow的坑的解决
2020/04/19 Python
宝塔面板成功部署Django项目流程(图文)
2020/06/22 Python
基于Python实现2种反转链表方法代码实例
2020/07/06 Python
HTML5 对各个标签的定义与规定:body的介绍
2012/06/21 HTML / CSS
酒店中秋节促销方案
2014/01/30 职场文书
小学英语教学反思案例
2014/02/04 职场文书
2015年导购员工作总结
2015/04/25 职场文书