浅谈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中操作时间之strptime()方法的使用
Dec 30 Python
示例详解Python3 or Python2 两者之间的差异
Aug 23 Python
对pandas中时间窗函数rolling的使用详解
Nov 28 Python
Python 200行代码实现一个滑动验证码过程详解
Jul 11 Python
Django 反向生成url实例详解
Jul 30 Python
Python3.7 pyodbc完美配置访问access数据库
Oct 03 Python
关于Python字符串显示u...的解决方式
Mar 06 Python
解决pycharm下pyuic工具使用的问题
Apr 08 Python
Python sqlalchemy时间戳及密码管理实现代码详解
Aug 01 Python
Python调用jar包方法实现过程解析
Aug 11 Python
Anaconda使用IDLE的实现示例
Sep 23 Python
Python编写nmap扫描工具
Jul 21 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
ThinkPHP标签制作教程
2014/07/10 PHP
PHP多态代码实例
2015/06/26 PHP
搭建基于Docker的PHP开发环境的详细教程
2015/07/01 PHP
php大小写转换函数(strtolower、strtoupper)用法介绍
2017/11/17 PHP
Javascript 复制数组实现代码
2009/11/26 Javascript
javascript学习笔记(十七) 检测浏览器插件代码
2012/06/20 Javascript
用javascript模仿ie的自动完成类似自动完成功的表单
2012/12/12 Javascript
ie8 不支持new Date(2012-11-10)问题的解决方法
2013/07/31 Javascript
JQUERY 设置SELECT选中项代码
2014/02/07 Javascript
jquery选择器排除某个DOM元素的方法(实例演示)
2014/04/25 Javascript
使用Jquery获取带特殊符号的ID 标签的方法
2014/04/30 Javascript
jQuery实现渐变下拉菜单的简单方法
2015/03/11 Javascript
JS实现的自定义网页拖动类
2015/11/06 Javascript
使用Ajax生成的Excel文件并下载的实例
2016/11/21 Javascript
Bootstrap标签页(Tab)插件使用方法
2017/03/21 Javascript
BootStrap 动态表单效果
2017/06/02 Javascript
详解Vue.js分发之作用域槽
2017/06/13 Javascript
jQuery中each循环的跳出和结束实例
2017/08/16 jQuery
JS高阶函数原理与用法实例分析
2019/01/15 Javascript
原生js实现分页效果
2020/09/23 Javascript
python BeautifulSoup使用方法详解
2013/11/21 Python
Python写的英文字符大小写转换代码示例
2015/03/06 Python
关于sys.stdout和print的区别详解
2019/12/05 Python
Python读取pdf表格写入excel的方法
2021/01/22 Python
丝芙兰香港官网:Sephora香港
2018/03/13 全球购物
Maxpeedingrods美国:高性能汽车零件
2020/02/14 全球购物
linux面试题参考答案(6)
2016/06/23 面试题
禁烟标语大全
2014/06/11 职场文书
小学生美德少年事迹材料
2014/08/24 职场文书
2014年旅游局法制宣传日活动总结
2014/11/01 职场文书
台风停课通知
2015/04/24 职场文书
父母教会我观后感
2015/06/17 职场文书
2015年小学重阳节活动总结
2015/07/29 职场文书
运动会口号霸气押韵
2015/12/24 职场文书
2016高中社会实践心得体会范文
2016/01/14 职场文书
古诗之爱国古诗5首
2019/09/20 职场文书