浅谈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 输出一个两行字符的变量
Feb 05 Python
Java中重定向输出流实现用文件记录程序日志
Jun 12 Python
简单上手Python中装饰器的使用
Jul 12 Python
Python之父谈Python的未来形式
Jul 01 Python
Python将8位的图片转为24位的图片实现方法
Oct 24 Python
对pandas中两种数据类型Series和DataFrame的区别详解
Nov 12 Python
python协程之动态添加任务的方法
Feb 19 Python
Django密码存储策略分析
Jan 09 Python
Python利用逻辑回归分类实现模板
Feb 15 Python
python nohup 实现远程运行不宕机操作
Apr 16 Python
python中的yield from语法快速学习
Nov 06 Python
浅谈Python xlwings 读取Excel文件的正确姿势
Feb 26 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提示Notice: Undefined variable的解决办法
2012/11/24 PHP
ThinkPHP权限认证Auth实例详解
2014/07/22 PHP
php中get_meta_tags()、CURL与user-agent用法分析
2014/12/16 PHP
PHP创建/删除/复制文件夹、文件
2016/05/03 PHP
php实现的二叉树遍历算法示例
2017/06/15 PHP
jquery 实现的全选和反选
2009/04/15 Javascript
jquery中ajax函数执行顺序问题之如何设置同步
2014/02/28 Javascript
javascript中style.left和offsetLeft的用法说明
2014/03/07 Javascript
浅谈jQuery中对象遍历.eq().first().last().slice()方法
2014/11/26 Javascript
JavaScript设计模式之装饰者模式介绍
2014/12/28 Javascript
JS实现往下不断流动网页背景的方法
2015/02/27 Javascript
谈谈jQuery Ajax用法详解
2015/11/27 Javascript
深入理解js promise chain
2016/05/05 Javascript
JavaScript中的splice方法用法详解
2016/07/20 Javascript
原生js实现放大镜效果
2017/01/11 Javascript
微信小程序 自定义消息提示框
2017/08/06 Javascript
Web开发使用Angular实现用户密码强度判别的方法
2017/09/27 Javascript
用Webpack构建Vue项目的实践
2017/11/07 Javascript
简述JS控制台的使用
2018/07/15 Javascript
小程序从手动埋点到自动埋点的实现方法
2019/01/24 Javascript
vue(2.x,3.0)配置跨域代理
2019/11/27 Javascript
[02:36]DOTA2英雄基础教程 斯拉克
2013/11/29 DOTA
使用beaker让Facebook的Bottle框架支持session功能
2015/04/23 Python
python函数的5种参数详解
2017/02/24 Python
PyTorch读取Cifar数据集并显示图片的实例讲解
2018/07/27 Python
使用python制作一个为hex文件增加版本号的脚本实例
2019/06/12 Python
PyTorch中model.zero_grad()和optimizer.zero_grad()用法
2020/06/24 Python
Foot Locker英国官网:美国知名运动产品零售商
2019/02/21 全球购物
房屋买卖授权委托书
2014/09/27 职场文书
代收款委托书范本
2014/10/01 职场文书
2014年档案管理员工作总结
2014/12/01 职场文书
感谢信格式范文
2015/01/22 职场文书
天那边观后感
2015/06/09 职场文书
导游词之无锡古运河
2019/11/14 职场文书
关于Python使用turtle库画任意图的问题
2022/04/01 Python
Go gorilla/sessions库安装使用
2022/08/14 Golang