浅谈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)更新脚本的生成方法
Jul 09 Python
Python优先队列实现方法示例
Sep 21 Python
python线程池(threadpool)模块使用笔记详解
Nov 17 Python
python3 发送任意文件邮件的实例
Jan 23 Python
python的常见矩阵运算(小结)
Aug 07 Python
python RC4加密操作示例【测试可用】
Sep 26 Python
解决pyCharm中 module 调用失败的问题
Feb 12 Python
python利用Excel读取和存储测试数据完成接口自动化教程
Apr 30 Python
vscode写python时的代码错误提醒和自动格式化的方法
May 07 Python
pycharm远程连接vagrant虚拟机中mariadb数据库
Jun 05 Python
用Python监控你的朋友都在浏览哪些网站?
May 27 Python
python flask开发的简单基金查询工具
Jun 02 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
在线增减.htpasswd内的用户
2006/10/09 PHP
php中curl和file_get_content的区别
2014/05/10 PHP
PHP使用http_build_query()构造URL字符串的方法
2016/04/02 PHP
php实现的SSO单点登录系统接入功能示例分析
2016/10/12 PHP
php实现websocket实时消息推送
2018/03/30 PHP
Ext第一周 史上最强学习笔记---GridPanel(基础篇)
2008/12/29 Javascript
Extjs学习过程中新手容易碰到的低级错误积累
2010/02/11 Javascript
javascript函数以及基础写法100多条实用整理
2013/01/13 Javascript
jquery动态增加删除表格行的小例子
2013/11/14 Javascript
Javascript中拼接大量字符串的方法
2015/02/05 Javascript
利用jQuery中的ajax分页实现代码
2016/02/25 Javascript
webpack学习教程之publicPath路径问题详解
2017/06/17 Javascript
vue component组件使用方法详解
2017/07/14 Javascript
javascript基本常用排序算法解析
2017/09/27 Javascript
[04:12]第二届DOTA2亚洲邀请赛选手传记-Newbee.Sccc
2017/04/03 DOTA
[58:09]Spirit vs NB Supermajor小组赛 A组败者组决赛 BO3 第三场 6.2
2018/06/03 DOTA
python中执行shell命令的几个方法小结
2014/09/18 Python
Python的类实例属性访问规则探讨
2015/01/30 Python
python3+PyQt5自定义视图详解
2018/04/24 Python
Python设计模式之状态模式原理与用法详解
2019/01/15 Python
详解小白之KMP算法及python实现
2019/04/04 Python
Python tempfile模块生成临时文件和临时目录
2020/09/30 Python
AmazeUI底部导航栏与分享按钮的示例代码
2020/08/18 HTML / CSS
REISS英国官网:伦敦High Street最受欢迎品牌
2016/12/21 全球购物
夏威夷灵感服装及配饰:Reyn Spooner
2018/09/18 全球购物
Nordgreen台湾官网:极简北欧设计手表
2019/08/21 全球购物
英国名牌男装店:Standout
2021/02/17 全球购物
请说出几个常用的异常类
2013/01/08 面试题
上课迟到检讨书100字
2014/01/11 职场文书
高中生职业生涯规划书
2014/02/24 职场文书
校园联欢晚会主持词
2014/03/17 职场文书
教师职业道德事迹材料
2014/08/18 职场文书
预备党员党支部意见
2015/06/02 职场文书
四风之害观后感
2015/06/09 职场文书
公司周年庆寄语
2019/06/21 职场文书
mybatis 解决从列名到属性名的自动映射失败问题
2021/06/30 Java/Android