浅谈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 递归遍历文件夹,并打印满足条件的文件路径实例
Aug 30 Python
Python排序算法之选择排序定义与用法示例
Apr 29 Python
浅谈python常用程序算法
Mar 22 Python
详解DeBug Python神级工具PySnooper
Jul 03 Python
python2.7实现复制大量文件及文件夹资料
Aug 31 Python
python requests模拟登陆github的实现方法
Dec 26 Python
python GUI库图形界面开发之PyQt5菜单栏控件QMenuBar的详细使用方法与实例
Feb 28 Python
Django获取model中的字段名和字段的verbose_name方式
May 19 Python
matlab、python中矩阵的互相导入导出方式
Jun 01 Python
python能否java成为主流语言吗
Jun 22 Python
无惧面试,带你搞懂python 装饰器
Aug 17 Python
Python日志打印里logging.getLogger源码分析详解
Jan 17 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
DC动画很好看?新作烂得令人发指,名叫《红色之子》
2020/04/09 欧美动漫
基于Zookeeper的使用详解
2013/05/02 PHP
php实现微信扫码支付
2017/03/26 PHP
Yii2框架类自动加载机制实例分析
2018/05/02 PHP
PHP大文件分割分片上传实现代码
2020/12/09 PHP
Javascript实例教程(19) 使用HoTMetal(7)
2006/12/23 Javascript
JQuery 动画卷页 返回顶部 动画特效(兼容Chrome)
2010/02/15 Javascript
基于jquery的分页控件(C#)
2011/01/06 Javascript
jquery ready(fn)事件使用介绍
2013/08/21 Javascript
屏蔽IE弹出"您查看的网页正在试图关闭窗口,是否关闭此窗口"的方法
2013/12/31 Javascript
JS阻止冒泡事件以及默认事件发生的简单方法
2014/01/17 Javascript
Javascript 函数parseInt()转换时出现bug问题
2014/05/20 Javascript
node.js 使用ejs模板引擎时后缀换成.html
2015/04/22 Javascript
js实现网页多级级联菜单代码
2015/08/20 Javascript
JavaScript图像延迟加载库Echo.js
2016/04/05 Javascript
Bootstrap3制作图片轮播效果
2016/05/12 Javascript
概述VUE2.0不可忽视的很多变化
2016/09/25 Javascript
微信页面倒计时代码(解决safari不兼容date的问题)
2016/12/13 Javascript
async/await让异步操作同步执行的方法详解
2019/11/01 Javascript
浅谈element中InfiniteScroll按需引入的一点注意事项
2020/06/05 Javascript
vue data对象重新赋值无效(未更改)的解决方式
2020/07/24 Javascript
Python正则表达式非贪婪、多行匹配功能示例
2017/08/08 Python
全面分析Python的优点和缺点
2018/02/07 Python
pyqt5实现俄罗斯方块游戏
2019/01/11 Python
Python多线程同步---文件读写控制方法
2019/02/12 Python
详解Python可视化神器Yellowbrick使用
2019/11/11 Python
使用css3制作动感导航条示例
2014/01/26 HTML / CSS
详解css3中的伪类before和after常见用法
2020/11/17 HTML / CSS
全球知名的婚恋交友网站:Match.com
2017/01/05 全球购物
Bally巴利英国官网:经典瑞士鞋履、手袋及配饰奢侈品牌
2018/05/07 全球购物
金融行业职业生涯规划范文
2014/01/17 职场文书
公安交警中队队长个人对照检查材料思想汇报
2014/10/05 职场文书
领导欢迎词致辞
2015/01/23 职场文书
MySQL8.0无法启动3534的解决方法
2021/06/03 MySQL
JS的深浅复制详细
2021/10/16 Javascript
微信小程序 根据不同用户切换不同TabBar
2022/04/21 Javascript