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算法输出1-9数组形成的结果为100的所有运算式
Nov 03 Python
Python的SimpleHTTPServer模块用处及使用方法简介
Jan 22 Python
Python 3.7新功能之dataclass装饰器详解
Apr 21 Python
python Spyder界面无法打开的解决方法
Apr 27 Python
对numpy中的where方法嵌套使用详解
Oct 31 Python
python利用小波分析进行特征提取的实例
Jan 09 Python
Python 隐藏输入密码时屏幕回显的实例
Feb 19 Python
Python+OpenCV+pyQt5录制双目摄像头视频的实例
Jun 28 Python
浅谈Python_Openpyxl使用(最全总结)
Sep 05 Python
pycharm 关掉syntax检查操作
Jun 09 Python
Python实现灰色关联分析与结果可视化的详细代码
Mar 25 Python
pd.DataFrame中的几种索引变换的实现
Jun 16 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获得用户使用的代理服务器ip即真实ip
2006/12/31 PHP
php对数组排序代码分享
2014/02/24 PHP
PHP处理Json字符串解码返回NULL的解决方法
2014/09/01 PHP
基于thinkPHP实现的微信自定义分享功能示例
2016/09/23 PHP
Yii支持多域名cors原理的实现
2018/12/05 PHP
Laravel Validator自定义错误返回提示消息并在前端展示
2019/05/09 PHP
建议大家看下JavaScript重要知识更新
2007/07/08 Javascript
jquery中:input和input的区别分析
2011/07/13 Javascript
js opener的使用详解
2014/01/11 Javascript
javascript实现数字验证码的简单实例
2014/02/10 Javascript
jquery.Ajax()方法调用Asp.Net后台的方法解析
2014/02/13 Javascript
jquery Validation表单验证使用详解
2020/09/12 Javascript
Angular.js与Bootstrap相结合实现表格分页代码
2016/04/12 Javascript
JS随机打乱数组的方法小结
2016/06/22 Javascript
js轮播图无缝滚动效果
2017/06/17 Javascript
JS之if语句对接事件动作逻辑(详解)
2017/06/28 Javascript
jQuery列表检索功能实现代码
2017/07/17 jQuery
利用Vue实现移动端图片轮播组件的方法实例
2017/08/23 Javascript
解析vue路由异步组件和懒加载案例
2018/06/08 Javascript
JavaScript this绑定过程深入详解
2018/12/07 Javascript
python实现机械分词之逆向最大匹配算法代码示例
2017/12/13 Python
Python并发:多线程与多进程的详解
2019/01/24 Python
pandas把所有大于0的数设置为1的方法
2019/01/26 Python
Flask框架模板渲染操作简单示例
2019/07/31 Python
利用python计算时间差(返回天数)
2019/09/07 Python
Python模块 _winreg操作注册表
2020/02/05 Python
Python 实现PS滤镜的旋涡特效
2020/12/03 Python
雅诗兰黛美国官网:Estee Lauder美国
2016/07/21 全球购物
财务部岗位职责
2013/11/19 职场文书
高中生职业规划范文
2014/03/09 职场文书
政协委员个人总结
2015/03/03 职场文书
2015大学自主招生自荐信范文
2015/03/04 职场文书
python not运算符的实例用法
2021/06/30 Python
mapstruct的用法之qualifiedByName示例详解
2022/04/06 Java/Android
Nginx文件已经存在全局反向代理问题排查记录
2022/07/15 Servers
nginx sticky实现基于cookie负载均衡示例详解
2022/12/24 Servers