浅谈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实现基于多线程、多用户的FTP服务器与客户端功能完整实例
Aug 18 Python
python虚拟环境的安装配置图文教程
Oct 20 Python
Python判断文件和字符串编码类型的实例
Dec 21 Python
python 文件转成16进制数组的实例
Jul 09 Python
python实现整数的二进制循环移位
Mar 08 Python
解决python文件双击运行秒退的问题
Jun 24 Python
python创建学生成绩管理系统
Nov 22 Python
Python 基于wxpy库实现微信添加好友功能(简洁)
Nov 29 Python
Python3 使用map()批量的转换数据类型,如str转float的实现
Nov 29 Python
pyinstaller还原python代码过程图解
Jan 08 Python
python3+openCV 获取图片中文本区域的最小外接矩形实例
Jun 02 Python
Python面向对象实现方法总结
Aug 12 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自动加载的两种实现方法
2010/06/21 PHP
PHP 代码规范小结
2012/03/08 PHP
仿dedecms下拉分页样式修改的thinkphp分页类实例
2014/10/30 PHP
javascript之卸载鼠标事件的代码
2007/05/14 Javascript
javascript getElementsByClassName 和js取地址栏参数
2010/01/02 Javascript
ajax更新数据后,jquery、jq失效问题
2011/03/16 Javascript
jquery获取tr中控件值并操作tr实现思路
2013/03/27 Javascript
jQuery中on()方法用法实例
2015/01/19 Javascript
AngularJS 中的指令实践开发指南(一)
2016/03/20 Javascript
ionic2打包android时gradle无法下载的解决方法
2017/04/05 Javascript
基于Vue2的独立构建与运行时构建的差别(详解)
2017/12/06 Javascript
vue脚手架及vue-router基本使用
2018/04/09 Javascript
vue 国际化 vue-i18n 双语言 语言包
2018/06/07 Javascript
jQuery子选择器与可见性选择器实例分析
2019/06/28 jQuery
bootstrap Table实现合并相同行
2019/07/19 Javascript
微信小程序获取地理位置及经纬度授权代码实例
2019/09/18 Javascript
VSCode 配置uni-app的方法
2020/07/11 Javascript
element-ui tree结构实现增删改自定义功能代码
2020/08/31 Javascript
在Django的form中使用CSS进行设计的方法
2015/07/18 Python
python 转换 Javascript %u 字符串为python unicode的代码
2016/09/06 Python
JSONLINT:python的json数据验证库实例解析
2017/11/28 Python
Python实现正弦信号的时域波形和频谱图示例【基于matplotlib】
2018/05/04 Python
jupyter notebook插入本地图片的实现
2020/04/13 Python
Python logging日志模块 配置文件方式
2020/07/12 Python
Python引入多个模块及包的概念过程解析
2020/09/21 Python
python实现自动打卡的示例代码
2020/10/10 Python
CSS3中的content属性使用示例
2015/07/20 HTML / CSS
利用css3-animation实现逐帧动画效果
2016/03/10 HTML / CSS
创业女性典型材料
2014/05/02 职场文书
文明礼仪伴我行演讲稿
2014/05/12 职场文书
2014年信息宣传工作总结
2014/12/18 职场文书
2015年学校食堂工作总结
2015/04/22 职场文书
2016党校学习心得体会
2016/01/07 职场文书
如何用threejs实现实时多边形折射
2021/05/07 Javascript
spring cloud gateway中如何读取请求参数
2021/07/15 Java/Android
vue报错function () { [native code] },无法出现我们想要的内容 Unknown custom element
2022/04/11 Vue.js