浅谈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的类实例属性访问规则探讨
Jan 30 Python
python检查序列seq是否含有aset中项的方法
Jun 30 Python
django创建自定义模板处理器的实例详解
Aug 14 Python
Python读取word文本操作详解
Jan 22 Python
matplotlib 纵坐标轴显示数据值的实例
May 25 Python
python多进程提取处理大量文本的关键词方法
Jun 05 Python
Django 表单模型选择框如何使用分组
May 16 Python
Python django框架应用中实现获取访问者ip地址示例
May 17 Python
PYQT5实现控制台显示功能的方法
Jun 25 Python
wxPython多个窗口的基本结构
Nov 19 Python
python如何删除文件、目录
Jun 23 Python
Python+unittest+requests+excel实现接口自动化测试框架
Dec 23 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与XML、XSLT、Mysql的结合运用实现代码
2009/11/19 PHP
PHP中file_get_contents函数抓取https地址出错的解决方法(两种方法)
2015/09/22 PHP
PHP使用星号替代用户名手机和邮箱的实现代码
2018/02/07 PHP
Laravel框架模型的创建及模型对数据操作示例
2019/05/07 PHP
PHP实现给定一列字符,生成指定长度的所有可能组合示例
2019/06/22 PHP
JSQL 基于客户端的成绩统计实现方法
2010/05/05 Javascript
Microsfot .NET Framework4.0框架 安装失败的解决方法
2013/08/14 Javascript
jQuery学习笔记之jQuery.fn.init()的参数分析
2014/06/09 Javascript
javascript实现的HashMap类代码
2014/06/27 Javascript
js鼠标点击图片切换效果代码分享
2015/08/26 Javascript
快速学习jQuery插件 jquery.validate.js表单验证插件使用方法
2015/12/01 Javascript
简单谈谈axios中的get,post方法
2017/06/25 Javascript
jquery.uploadView 实现图片预览上传功能
2017/08/10 jQuery
js嵌套的数组扁平化:将多维数组变成一维数组以及push()与concat()区别的讲解
2019/01/19 Javascript
仿iPhone通讯录制作小程序自定义选择组件的实现
2019/05/23 Javascript
layui select 禁止点击的实现方法
2019/09/05 Javascript
基于vue 动态菜单 刷新空白问题的解决
2020/08/06 Javascript
在Python中使用异步Socket编程性能测试
2014/06/25 Python
Python标准库之sqlite3使用实例
2014/11/25 Python
Python将xml和xsl转换为html的方法
2015/03/10 Python
python将unicode转为str的方法
2017/06/21 Python
Python pandas常用函数详解
2018/02/07 Python
python3+PyQt5实现柱状图
2018/04/24 Python
在pycharm上mongodb配置及可视化设置方法
2018/11/30 Python
解决Jupyter notebook更换主题工具栏被隐藏及添加目录生成插件问题
2020/04/20 Python
python3爬虫中多线程的优势总结
2020/11/24 Python
HTML5上传文件显示进度的实现代码
2012/08/30 HTML / CSS
购买大码女装:Lane Bryant
2016/09/07 全球购物
澳大利亚第一旅行车和房车配件店:Caravan RV Camping
2020/12/26 全球购物
优秀管理者获奖感言
2014/02/17 职场文书
学习教师法的心得体会
2014/09/03 职场文书
2016元旦晚会主持词
2015/07/01 职场文书
酒店开业主持词
2015/07/02 职场文书
一劳永逸彻底解决pip install慢的办法
2021/05/24 Python
Python scrapy爬取起点中文网小说榜单
2021/06/13 Python
Android开发手册Chip监听及ChipGroup监听
2022/06/10 Java/Android