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删除空文件和空文件夹的方法
Jul 14 Python
简介二分查找算法与相关的Python实现示例
Aug 26 Python
Python的地形三维可视化Matplotlib和gdal使用实例
Dec 09 Python
python机器学习之神经网络(三)
Dec 20 Python
一个月入门Python爬虫学习,轻松爬取大规模数据
Jan 03 Python
Python编程二分法实现冒泡算法+快速排序代码示例
Jan 15 Python
Django 路由系统URLconf的使用
Oct 11 Python
django中使用Celery 布式任务队列过程详解
Jul 29 Python
python 哈希表实现简单python字典代码实例
Sep 27 Python
Python面向对象程序设计之类和对象、实例变量、类变量用法分析
Mar 23 Python
Python二元算术运算常用方法解析
Sep 15 Python
Python中三种花式打印的示例详解
Mar 19 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
php中理解print EOT分界符和echo EOT的用法区别小结
2010/02/21 PHP
学习php中的正则表达式
2014/08/17 PHP
PHP实现简易blog的制作
2016/10/24 PHP
php递归函数怎么用才有效
2018/02/24 PHP
javascript通过元素id和name直接取得元素的方法
2015/04/28 Javascript
JS框架之vue.js(深入三:组件1)
2016/09/29 Javascript
jQuery学习笔记——jqGrid的使用记录(实现分页、搜索功能)
2016/11/09 Javascript
AngularJS指令与控制器之间的交互功能示例
2016/12/14 Javascript
简单实现Bootstrap标签页
2020/08/09 Javascript
微信小程序实现图片压缩功能
2018/01/26 Javascript
vue-cli项目中使用公用的提示弹层tips或加载loading组件实例详解
2018/05/28 Javascript
react-native android状态栏的实现
2018/06/15 Javascript
微信小程序实现点赞、取消点赞功能
2018/11/02 Javascript
微信小程序实现点击图片旋转180度并且弹出下拉列表
2018/11/27 Javascript
微信小程序实现页面浮动导航
2019/01/28 Javascript
使vue实现jQuery调用的两种方法
2019/05/12 jQuery
[01:28]一分钟告诉你DOTA2 TI9不朽宝藏Ⅱ中有什么!
2019/07/09 DOTA
Python logging模块学习笔记
2014/05/24 Python
Python实现字典依据value排序
2016/02/24 Python
分析Python中设计模式之Decorator装饰器模式的要点
2016/03/02 Python
基于Python的XSS测试工具XSStrike使用方法
2017/07/29 Python
对Python中type打开文件的方式介绍
2018/04/28 Python
python excel转换csv代码实例
2019/08/26 Python
Django框架 查询Extra功能实现解析
2019/09/04 Python
Docker部署Python爬虫项目的方法步骤
2020/01/19 Python
如何基于pythonnet调用halcon脚本
2020/01/20 Python
使用pycharm和pylint检查python代码规范操作
2020/06/09 Python
英国团购网站:Groupon英国
2017/11/28 全球购物
上班离岗检讨书
2014/01/27 职场文书
电台编导求职信
2014/05/06 职场文书
庆祝三八妇女节标语
2014/10/09 职场文书
2015年大学生实习评语
2015/03/25 职场文书
在校证明模板
2015/06/17 职场文书
学生病假条范文
2015/08/17 职场文书
原生Js 实现的简单无缝滚动轮播图的示例代码
2021/05/10 Javascript
python process模块的使用简介
2021/05/14 Python