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之引用和类属性的初步理解
May 15 Python
用python实现面向对像的ASP程序实例
Nov 10 Python
Python采用socket模拟TCP通讯的实现方法
Nov 19 Python
在Python中使用base64模块处理字符编码的教程
Apr 28 Python
深入理解python中函数传递参数是值传递还是引用传递
Nov 07 Python
Python与R语言的简要对比
Nov 14 Python
Python基于jieba库进行简单分词及词云功能实现方法
Jun 16 Python
对Python中小整数对象池和大整数对象池的使用详解
Jul 09 Python
python实现控制台输出彩色字体
Apr 05 Python
Python Matplotlib简易教程(小白教程)
Jul 28 Python
Pycharm调试程序技巧小结
Aug 08 Python
python实现网络五子棋
Apr 11 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/07/05 PHP
php查询whois信息的方法
2015/06/08 PHP
jQuery移动和复制dom节点实用DOM操作案例
2012/12/17 Javascript
jquery实现带复选框的表格行选中删除时高亮显示
2013/08/01 Javascript
Jquery性能优化详解
2014/05/15 Javascript
javascript写的异步加载js文件函数(支持数组传参)
2014/06/07 Javascript
Javascript获取图片原始宽度和高度的方法详解
2016/09/20 Javascript
jQuery实现表格元素动态创建功能
2017/01/09 Javascript
浅谈微信页面入口文件被缓存解决方案
2018/09/29 Javascript
策略模式实现 Vue 动态表单验证的方法
2019/09/16 Javascript
JS 设计模式之:单例模式定义与实现方法浅析
2020/05/06 Javascript
利用一个简单的例子窥探CPython内核的运行机制
2015/03/30 Python
Python基础中所出现的异常报错总结
2016/11/19 Python
pycham查看程序执行的时间方法
2018/11/29 Python
Python3.6实现带有简单界面的有道翻译小程序
2019/04/16 Python
Python生成rsa密钥对操作示例
2019/04/26 Python
django框架模板中定义变量(set variable in django template)的方法分析
2019/06/24 Python
Pytorch 实现数据集自定义读取
2020/01/18 Python
探秘TensorFlow 和 NumPy 的 Broadcasting 机制
2020/03/13 Python
jupyter notebook 添加kernel permission denied的操作
2020/04/21 Python
Python如何读写CSV文件
2020/08/13 Python
用python写一个带有gui界面的密码生成器
2020/11/06 Python
CSS3转换功能transform主要属性值分析及实现分享
2012/05/06 HTML / CSS
美国老牌主机服务商:iPage
2016/07/22 全球购物
Conforama西班牙:您的家具、装饰和电器商店
2020/02/21 全球购物
一个C/C++编程面试题
2013/11/10 面试题
幼师自荐信
2013/10/26 职场文书
商场端午节活动方案
2014/01/29 职场文书
家长会欢迎标语
2014/06/24 职场文书
我们的节日元宵活动方案
2014/08/23 职场文书
2014年业务工作总结
2014/11/17 职场文书
2014年化验员工作总结
2014/11/18 职场文书
前台接待员岗位职责
2015/04/15 职场文书
办公用品管理制度
2015/08/04 职场文书
清明节随笔
2015/08/15 职场文书
Mysql中mvcc各场景理解应用
2022/08/05 MySQL