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中使用HTMLParser解析HTML的教程
Apr 29 Python
Python使用pip安装报错:is not a supported wheel on this platform的解决方法
Jan 23 Python
Python基础之循环语句用法示例【for、while循环】
Mar 23 Python
python实现kmp算法的实例代码
Apr 03 Python
Python爬虫实现的根据分类爬取豆瓣电影信息功能示例
Sep 15 Python
python打包成so文件过程解析
Sep 28 Python
python创建n行m列数组示例
Dec 02 Python
python 求10个数的平均数实例
Dec 16 Python
解决python虚拟环境切换无效的问题
Apr 30 Python
Python接口测试结果集实现封装比较
May 01 Python
Nginx+Uwsgi+Django 项目部署到服务器的思路详解
May 08 Python
python 检测图片是否有马赛克
Dec 01 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
Protoss兵种对照表
2020/03/14 星际争霸
php使用base64加密解密图片示例分享
2014/01/20 PHP
JQuery学习笔记 nt-child的使用
2011/01/17 Javascript
基于jquery的textarea发布框限制文字字数输入(添加中文识别)
2012/02/16 Javascript
javascript实现回到顶部特效
2015/05/06 Javascript
JavaScript检测字符串中是否含有html标签实现方法
2015/07/01 Javascript
jQuery取得元素标签名称小结(附代码)
2017/08/16 jQuery
利用js给datalist或select动态添加option选项的方法
2018/01/25 Javascript
js屏蔽退格键(backspace或者叫后退键与F5)
2019/02/10 Javascript
vue远程加载sfc组件思路详解
2019/12/25 Javascript
js实现验证码干扰(动态)
2021/02/23 Javascript
Python实现测试磁盘性能的方法
2015/03/12 Python
python实现中文输出的两种方法
2015/05/09 Python
在Python中使用swapCase()方法转换大小写的教程
2015/05/20 Python
Ruby使用eventmachine为HTTP服务器添加文件下载功能
2016/04/20 Python
Python实现完整的事务操作示例
2017/06/20 Python
关于python pyqt5安装失败问题的解决方法
2017/08/08 Python
Python下使用Scrapy爬取网页内容的实例
2018/05/21 Python
python3 pygame实现接小球游戏
2019/05/14 Python
python用线性回归预测股票价格的实现代码
2019/09/04 Python
TensorFlow2.X结合OpenCV 实现手势识别功能
2020/04/08 Python
flask项目集成swagger的方法
2020/12/09 Python
优秀求职自荐信怎样写
2013/12/18 职场文书
一月红领巾广播稿
2014/02/11 职场文书
《难忘的泼水节》教学反思
2014/02/27 职场文书
同学会主持词
2014/03/18 职场文书
美食节目策划方案
2014/05/31 职场文书
企业环保标语
2014/06/10 职场文书
家长学校培训材料
2014/08/20 职场文书
委托书的写法
2014/09/16 职场文书
领导干部贪图享乐整改措施
2014/09/21 职场文书
自习课吵闹检讨书范文
2014/09/26 职场文书
毕业生入职感言
2015/07/31 职场文书
2016年元旦致辞
2015/08/01 职场文书
初中数学教学随笔
2015/08/15 职场文书
《我的伯父鲁迅先生》教学反思
2016/02/16 职场文书