浅谈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实现子类调用父类的方法
Nov 10 Python
Python通过90行代码搭建一个音乐搜索工具
Jul 29 Python
使用Mixin设计模式进行Python编程的方法讲解
Jun 21 Python
Python内置函数——__import__ 的使用方法
Nov 24 Python
Python第三方库face_recognition在windows上的安装过程
May 03 Python
python如何实现视频转代码视频
Jun 17 Python
python切片的步进、添加、连接简单操作示例
Jul 11 Python
Python小程序 控制鼠标循环点击代码实例
Oct 08 Python
浅谈tensorflow 中tf.concat()的使用
Feb 07 Python
Keras中的多分类损失函数用法categorical_crossentropy
Jun 11 Python
在Tensorflow中实现leakyRelu操作详解(高效)
Jun 30 Python
Python过滤序列元素的方法
Jul 31 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
预告映像公开!第1章续篇剧场版动画《Princess Principal Crown Handler》4月10日上映!
2020/03/06 日漫
SONY ICF-SW55的电路分析
2021/03/02 无线电
php下用GD生成生成缩略图的两个选择和区别
2007/04/17 PHP
PHP学习笔记之三 数据库基本操作
2011/01/17 PHP
PHP并发查询MySQL的实例代码
2017/08/09 PHP
php反序列化长度变化尾部字符串逃逸(0CTF-2016-piapiapia)
2020/02/15 PHP
jquery.validate使用攻略 第五步 正则验证
2010/07/01 Javascript
JS获取几种URL地址的方法小结
2014/02/26 Javascript
JS中自定义定时器让它在某一时刻执行
2014/09/02 Javascript
详解javascript遍历方式
2015/11/11 Javascript
JavaScript实现输入框(密码框)出现提示语
2016/01/12 Javascript
JavaScript实现的CRC32函数示例
2016/11/23 Javascript
JS多文件上传的实例代码
2017/01/11 Javascript
15分钟深入了解JS继承分类、原理与用法
2019/01/19 Javascript
详解keep-alive + vuex 让缓存的页面灵活起来
2019/04/19 Javascript
ES6中异步对象Promise用法详解
2019/07/31 Javascript
vue 添加和编辑用同一个表单,el-form表单提交后清空表单数据操作
2020/08/03 Javascript
python解析发往本机的数据包示例 (解析数据包)
2014/01/16 Python
在Python的Django框架中为代码添加注释的方法
2015/07/16 Python
Python操作列表常用方法实例小结【创建、遍历、统计、切片等】
2019/10/25 Python
python根据文本生成词云图代码实例
2019/11/15 Python
解决python中0x80072ee2错误的方法
2020/07/19 Python
翻新二手苹果产品的网络领导者:Mac of all Trades
2017/12/19 全球购物
英国复古皮包品牌:Beara Beara
2018/07/18 全球购物
SQL里面IN比较快还是EXISTS比较快
2012/07/19 面试题
怎样在 Applet 中建立自己的菜单(MenuBar/Menu)?
2012/06/20 面试题
自主招生自荐信格式
2013/12/03 职场文书
科级干部考察材料
2014/02/15 职场文书
学校课外活动总结
2014/05/08 职场文书
公司的门卫岗位职责
2014/09/09 职场文书
试用期转正后的自我评价
2014/09/21 职场文书
欠款起诉书范文
2015/05/19 职场文书
基于python的matplotlib制作双Y轴图
2021/04/20 Python
html+css实现赛博朋克风格按钮
2021/05/26 HTML / CSS
Spring Bean是如何初始化的详解
2022/03/22 Java/Android
Python安装及建立虚拟环境的完整步骤
2022/06/25 Servers