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实现的扫雷游戏实例代码
Aug 01 Python
python删除列表内容
Aug 04 Python
Python实现在线暴力破解邮箱账号密码功能示例【测试可用】
Sep 06 Python
python 用opencv调用训练好的模型进行识别的方法
Dec 07 Python
在win10和linux上分别安装Python虚拟环境的方法步骤
May 09 Python
基于python实现的百度音乐下载器python pyqt改进版(附代码)
Aug 05 Python
python库matplotlib绘制坐标图
Oct 18 Python
Python三元运算与lambda表达式实例解析
Nov 30 Python
Django ValuesQuerySet转json方式
Mar 16 Python
python实现贪吃蛇游戏源码
Mar 21 Python
解决IDEA 的 plugins 搜不到任何的插件问题
May 04 Python
用Python简陋模拟n阶魔方
Apr 17 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自定义的格式化时间示例代码
2013/12/05 PHP
php实现在服务器上创建目录的方法
2015/03/16 PHP
discuz图片顺序混乱解决方案
2015/07/29 PHP
在IE模态窗口中自由查看HTML源码的方法
2007/03/08 Javascript
让人印象深刻的10个jQuery手风琴效果应用
2012/05/08 Javascript
Jquery 选中表格一列并对表格排序实现原理
2012/12/15 Javascript
js全屏显示显示代码的三种方法
2013/11/11 Javascript
jquery序列化表单以及回调函数的使用示例
2014/07/02 Javascript
使用mouse事件实现简单的鼠标经过特效
2015/01/30 Javascript
JavaScript计时器示例分析
2015/02/05 Javascript
Javascript节点关系实例分析
2015/05/15 Javascript
JavaScript中输出信息的方法(信息确认框-提示输入框-文档流输出)
2016/06/12 Javascript
HTML中setCapture、releaseCapture 使用方法浅析
2016/09/25 Javascript
简单的React SSR服务器渲染实现
2018/12/11 Javascript
爬虫利器Puppeteer实战
2019/01/09 Javascript
javascript实现动态时钟的启动和停止
2020/07/29 Javascript
[06:25]DOTA2英雄梦之声_第17期_大地之灵
2014/06/20 DOTA
python处理文本文件实现生成指定格式文件的方法
2014/07/31 Python
Django框架中处理URLconf中特定的URL的方法
2015/07/20 Python
Python彩色化Linux的命令行终端界面的代码实例分享
2016/07/02 Python
Python中eval带来的潜在风险代码分析
2017/12/11 Python
python+matplotlib绘制3D条形图实例代码
2018/01/17 Python
python实现淘宝秒杀聚划算抢购自动提醒源码
2020/06/23 Python
详解Python3 中hasattr()、getattr()、setattr()、delattr()函数及示例代码数
2018/04/18 Python
Django框架自定义session处理操作示例
2019/05/27 Python
如何在Django项目中引入静态文件
2019/07/26 Python
使用 Python 遍历目录树的方法
2020/02/29 Python
Python爬虫Scrapy框架CrawlSpider原理及使用案例
2020/11/20 Python
We Fashion荷兰:一家国际时装公司
2018/04/18 全球购物
怎样在 Applet 中建立自己的菜单(MenuBar/Menu)?
2012/06/20 面试题
校园活动策划书范文
2014/01/10 职场文书
销售员岗位职责范本
2014/02/03 职场文书
办公室打字员岗位职责
2014/04/16 职场文书
租房协议书范例
2014/10/14 职场文书
搞笑Gif:这么白这么长的腿像极了一楼的女朋友
2022/03/21 杂记
MySQL实现配置主从复制项目实践
2022/03/31 MySQL