Python打印不合法的文件名


Posted in Python onJuly 31, 2020

问题

你的程序获取了一个目录中的文件名列表,但是当它试着去打印文件名的时候程序崩溃, 出现了 UnicodeEncodeError 异常和一条奇怪的消息—— surrogates not allowed 。

解决方案

当打印未知的文件名时,使用下面的方法可以避免这样的错误:

def bad_filename(filename):
  return repr(filename)[1:-1]

try:
  print(filename)
except UnicodeEncodeError:
  print(bad_filename(filename))

如果你有代码需要操作文件名或者将文件名传递给 open() 这样的函数,一切都能正常工作。 只有当你想要输出文件名时才会碰到些麻烦(比如打印输出到屏幕或日志文件等)。 特别的,当你想打印上面的文件名列表时,你的程序就会崩溃:

>>> for name in files:
...   print(name)
...
spam.py
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
UnicodeEncodeError: 'utf-8' codec can't encode character '\udce4' in
position 1: surrogates not allowed
>>>
>>> for name in files:
... try:
...   print(name)
... except UnicodeEncodeError:
...   print(bad_filename(name))
...
spam.py
b\udce4d.txt
foo.txt
>>>

在 bad_filename() 函数中怎样处置取决于你自己。 另外一个选择就是通过某种方式重新编码,示例如下:

def bad_filename(filename):
  temp = filename.encode(sys.getfilesystemencoding(), errors='surrogateescape')
  return temp.decode('latin-1')

译者注:

surrogateescape:
这种是Python在绝大部分面向OS的API中所使用的错误处理器,
它能以一种优雅的方式处理由操作系统提供的数据的编码问题。
在解码出错时会将出错字节存储到一个很少被使用到的Unicode编码范围内。
在编码时将那些隐藏值又还原回原先解码失败的字节序列。
它不仅对于OS API非常有用,也能很容易的处理其他情况下的编码错误。

使用这个版本产生的输出如下:

>>> for name in files:
...   try:
...     print(name)
...   except UnicodeEncodeError:
...     print(bad_filename(name))
...
spam.py
bäd.txt
foo.txt
>>>

这一小节主题可能会被大部分读者所忽略。但是如果你在编写依赖文件名和文件系统的关键任务程序时, 就必须得考虑到这个。否则你可能会在某个周末被叫到办公室去调试一些令人费解的错误。

以上就是Python打印不合法的文件名的详细内容,更多关于Python 打印文件名的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python dict remove数组删除(del,pop)
Mar 24 Python
python之yield表达式学习
Sep 02 Python
python logging类库使用例子
Nov 22 Python
Python快速从注释生成文档的方法
Dec 26 Python
Python安装模块的常见问题及解决方法
Feb 05 Python
Python机器学习之K-Means聚类实现详解
Feb 22 Python
Python实现基于KNN算法的笔迹识别功能详解
Jul 09 Python
python TK库简单应用(实时显示子进程输出)
Oct 29 Python
Python assert关键字原理及实例解析
Dec 13 Python
使用OpenCV获取图片连通域数量,并用不同颜色标记函
Jun 04 Python
python用字节处理文件实例讲解
Apr 13 Python
如何在Python项目中引入日志
May 31 Python
Django+Uwsgi+Nginx如何实现生产环境部署
Jul 31 #Python
Python 如何测试文件是否存在
Jul 31 #Python
Python高并发解决方案实现过程详解
Jul 31 #Python
Python如何执行精确的浮点数运算
Jul 31 #Python
Python使用shutil模块实现文件拷贝
Jul 31 #Python
Python基于pyjnius库实现访问java类
Jul 31 #Python
Python如何将字符串转换为日期
Jul 31 #Python
You might like
Yii框架响应组件用法实例分析
2019/09/04 PHP
CheckBox 如何实现全选?
2006/06/23 Javascript
用js生产批量批处理执行命令
2008/07/28 Javascript
使弱类型的语言JavaScript变强势
2009/06/22 Javascript
js获取当前时间显示在页面上并每秒刷新
2014/12/24 Javascript
Linux下编译安装php libevent扩展实例
2015/02/14 Javascript
JavaScript中reduce()方法的使用详解
2015/06/09 Javascript
表格展示利器 Bootstrap Table实例代码
2017/09/06 Javascript
angular json对象push到数组中的方法
2018/02/27 Javascript
Vue中使用方法、计算属性或观察者的方法实例详解
2018/10/31 Javascript
jquery操作checkbox的常用方法总结【附测试源码下载】
2019/06/10 jQuery
百度小程序之间的页面通信过程详解
2019/07/18 Javascript
JS 自执行函数原理及用法
2019/08/05 Javascript
Python学习笔记(一)(基础入门之环境搭建)
2014/06/05 Python
Python实现列表转换成字典数据结构的方法
2016/03/11 Python
如何优雅地改进Django中的模板碎片缓存详解
2018/07/04 Python
Python操作Excel插入删除行的方法
2018/12/10 Python
python打包exe开机自动启动的实例(windows)
2019/06/28 Python
python中hasattr()、getattr()、setattr()函数的使用
2019/08/16 Python
Pytorch实现神经网络的分类方式
2020/01/08 Python
Python爬虫爬取百度搜索内容代码实例
2020/06/05 Python
详解python metaclass(元类)
2020/08/13 Python
python如何设置静态变量
2020/09/07 Python
如何用PyPy让你的Python代码运行得更快
2020/12/02 Python
HTML5 video循环播放多个视频的方法步骤
2020/08/06 HTML / CSS
国际礼品店:GiftsnIdeas
2018/05/03 全球购物
美国球鞋寄卖网站:Stadium Goods
2018/05/09 全球购物
2014年小学元旦活动方案
2014/02/12 职场文书
高级编程求职信模板
2014/02/16 职场文书
生物学专业求职信
2014/07/23 职场文书
导游词之黄帝陵景区
2019/09/16 职场文书
MySql开发之自动同步表结构
2021/05/28 MySQL
Spring boot应用启动后首次访问很慢的解决方案
2021/06/23 Java/Android
Python中的嵌套循环详情
2022/03/23 Python
python模板入门教程之flask Jinja
2022/04/11 Python
Redis基本数据类型List常用操作命令
2022/06/01 Redis