浅谈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连接sql server乱码的解决方法
Jan 28 Python
Python获取脚本所在目录的正确方法
Apr 15 Python
python抽象基类用法实例分析
Jun 04 Python
Python实现类似jQuery使用中的链式调用的示例
Jun 16 Python
python 如何快速找出两个电子表中数据的差异
May 26 Python
浅谈使用Python内置函数getattr实现分发模式
Jan 22 Python
浅谈配置OpenCV3 + Python3的简易方法(macOS)
Apr 02 Python
利用Python实现kNN算法的代码
Aug 16 Python
Python编写打字训练小程序
Sep 26 Python
Python如何使用字符打印照片
Jan 03 Python
在pytorch中实现只让指定变量向后传播梯度
Feb 29 Python
Python之变量类型和if判断方式
May 05 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设计模式之单例、多例设计模式的应用分析
2013/06/30 PHP
php读取csv文件后,uft8 bom导致在页面上显示出现问题的解决方法
2013/08/10 PHP
基于PHP微信红包的算法探讨
2016/07/21 PHP
常用简易JavaScript函数
2009/04/09 Javascript
在JavaScript里防止事件函数高频触发和高频调用的方法
2014/09/06 Javascript
jQuery实现的感应鼠标悬停图片色彩渐显效果
2015/03/03 Javascript
JavaScript设计模式学习之“类式继承”
2015/03/12 Javascript
使用React实现轮播效果组件示例代码
2016/09/05 Javascript
javascript中Date对象的使用总结
2016/11/21 Javascript
ES6新特性三: Generator(生成器)函数详解
2017/04/21 Javascript
浅谈ES6 模板字符串的具体使用方法
2017/11/07 Javascript
vue favicon设置以及动态修改favicon的方法
2018/12/21 Javascript
angular6 填坑之sdk的方法
2018/12/27 Javascript
vue.js的双向数据绑定Object.defineProperty方法的神奇之处
2019/01/18 Javascript
TypeScript中的方法重载详解
2019/04/12 Javascript
python使用7z解压apk包的方法
2015/04/18 Python
编写多线程Python服务器 最适合基础
2018/09/14 Python
python开启debug模式的方法
2019/06/27 Python
Python迭代器协议及for循环工作机制详解
2020/07/14 Python
解决阿里云邮件发送不能使用25端口问题
2020/08/07 Python
python实现扫雷游戏的示例
2020/10/20 Python
python基于pexpect库自动获取日志信息
2021/02/01 Python
网页布局中CSS样式无效的十个重要原因详解
2017/08/10 HTML / CSS
HTML5之SVG 2D入门8—文档结构及相关元素总结
2013/01/30 HTML / CSS
通过HTML5规范搞定i、em、b、strong元素的区别
2017/03/04 HTML / CSS
美国领先的家庭智能音响系统品牌:Sonos
2018/07/20 全球购物
捷科时代的软件测试笔试题
2015/11/09 面试题
小学国庆节活动方案
2014/02/11 职场文书
委托协议书范本
2014/04/22 职场文书
小露珠教学反思
2014/04/30 职场文书
民事授权委托书范文
2014/08/02 职场文书
2014年采购员工作总结
2014/11/18 职场文书
《文化苦旅》读后感:阅读,让人诗意地栖居在大地上
2019/12/24 职场文书
关于Spring配置文件加载方式变化引发的异常详解
2022/01/18 Java/Android
vue项目中的支付功能实现(微信支付和支付宝支付)
2022/02/18 Vue.js
MySQL数据库实验之 触发器和存储过程
2022/06/21 MySQL