浅谈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线程锁(thread)学习示例
Dec 04 Python
python数据库操作常用功能使用详解(创建表/插入数据/获取数据)
Dec 06 Python
python中is与双等于号“==”的区别示例详解
Nov 21 Python
python机器学习理论与实战(一)K近邻法
Jan 28 Python
解决Python selenium get页面很慢时的问题
Jan 30 Python
Python中三元表达式的几种写法介绍
Mar 04 Python
Python @property使用方法解析
Sep 17 Python
Python FFT合成波形的实例
Dec 04 Python
Python ATM功能实现代码实例
Mar 19 Python
推荐值得学习的12款python-web开发框架
Aug 10 Python
解决pycharm导入numpy包的和使用时报错:RuntimeError: The current Numpy installation (‘D:\\python3.6\\lib\\site-packa的问题
Dec 08 Python
AI:如何训练机器学习的模型
Apr 16 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
discuz论坛 用户登录 后台程序代码
2008/11/27 PHP
PHP5.4中json_encode中文转码的变化小结
2013/01/30 PHP
php获取、检查类名、函数名、方法名的函数方法
2015/06/25 PHP
php实现PDO中捕获SQL语句错误的方法
2017/02/16 PHP
利用Homestead快速运行一个Laravel项目的方法详解
2017/11/14 PHP
麦鸡的TAB切换功能结合了javascript和css
2007/12/17 Javascript
JS版网站风格切换实例代码
2008/10/06 Javascript
Javascript base64编码实现代码
2011/12/02 Javascript
js控制iframe的高度/宽度让其自适应内容
2014/04/09 Javascript
打造个性化的功能强大的Jquery虚拟键盘(VirtualKeyboard)
2014/10/11 Javascript
JavaScript中Number.NEGATIVE_INFINITY值的使用详解
2015/06/05 Javascript
使用jQuery判断Div是否在可视区域的方法 判断div是否可见
2016/02/17 Javascript
AngularJS基础 ng-init 指令简单示例
2016/08/02 Javascript
实现JavaScript高性能的数据存储
2016/12/11 Javascript
Bootstrap输入框组件简单实现代码
2017/03/06 Javascript
web.js.字符串与正则表达式操作
2017/05/13 Javascript
Javascript中的getter和setter初识
2017/08/17 Javascript
javascript实现日历效果
2019/06/17 Javascript
AngularJS动态生成select下拉框的方法实例
2019/11/17 Javascript
js根据后缀判断文件文件类型的代码
2020/05/09 Javascript
一道python走迷宫算法题
2018/01/22 Python
在Python中实现shuffle给列表洗牌
2018/11/08 Python
Python 从相对路径下import的方法
2018/12/04 Python
pycharm远程开发项目的实现步骤
2019/01/20 Python
Django Form 实时从数据库中获取数据的操作方法
2019/07/25 Python
python+rsync精确同步指定格式文件
2019/08/29 Python
利用python中集合的唯一性实现去重
2020/02/11 Python
Python使用pycharm导入pymysql教程
2020/09/16 Python
Django-celery-beat动态添加周期性任务实现过程解析
2020/11/26 Python
最畅销的视频游戏享受高达90%的折扣:CDKeys
2020/02/10 全球购物
英国领先的男装设计师服装独立零售商:Repertoire Fashion
2020/10/19 全球购物
交通安全教育制度
2014/02/02 职场文书
导游个人求职信
2014/04/25 职场文书
政审证明范文
2015/06/19 职场文书
李白经典诗之一:全文无一“月”字,却句句有月
2019/07/12 职场文书
不知如何爱孩子,这些方法教会您
2019/08/06 职场文书