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 06 Python
Python之Web框架Django项目搭建全过程
May 02 Python
Python科学计算包numpy用法实例详解
Feb 08 Python
TensorFlow损失函数专题详解
Apr 26 Python
使用Numpy读取CSV文件,并进行行列删除的操作方法
Jul 04 Python
python numpy数组的索引和切片的操作方法
Oct 20 Python
python3通过selenium爬虫获取到dj商品的实例代码
Apr 25 Python
详解python路径拼接os.path.join()函数的用法
Oct 09 Python
Python selenium使用autoIT上传附件过程详解
May 26 Python
Keras loss函数剖析
Jul 06 Python
PyCharm 2020.2 安装详细教程
Sep 25 Python
全网最详细的PyCharm+Anaconda的安装过程图解
Jan 25 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引用效率问题分析
2012/03/23 PHP
采集邮箱的php代码(抓取网页中的邮箱地址)
2012/07/17 PHP
PHP处理大量表单字段的便捷方法
2015/02/07 PHP
递归实现php数组转xml的代码分享
2015/05/14 PHP
php curl批处理实现可控并发异步操作示例
2018/05/09 PHP
javascript 获取页面的高度及滚动条的位置的代码
2010/05/06 Javascript
jQuery的12招常用技巧分享
2011/08/08 Javascript
js 获取计算后的样式写法及注意事项
2013/02/25 Javascript
开发中可能会用到的jQuery小技巧
2014/03/07 Javascript
Javascript中prototype属性实现给内置对象添加新的方法
2015/05/14 Javascript
Jquery全屏相册插件zoomvisualizer具有调节放大与缩小功能
2015/11/02 Javascript
jQuery使用ajax跨域获取数据的简单实例
2016/05/18 Javascript
JS实现table表格数据排序功能(可支持动态数据+分页效果)
2016/05/26 Javascript
confirm确认对话框的实现方法总结
2016/06/17 Javascript
Vue概念及常见命令介绍(1)
2016/12/08 Javascript
js实现的xml对象转json功能示例
2016/12/24 Javascript
JS获取多维数组中相同键的值实现方法示例
2017/01/06 Javascript
使用vue.js2.0 + ElementUI开发后台管理系统详细教程(一)
2017/01/21 Javascript
如何对react hooks进行单元测试的方法
2019/08/14 Javascript
浅谈Vue 自动化部署打包上线
2020/06/14 Javascript
手把手教你如何编译打包video.js
2020/12/09 Javascript
Python functools模块学习总结
2015/05/09 Python
Django中处理出错页面的方法
2015/07/15 Python
使用相同的Apache实例来运行Django和Media文件
2015/07/22 Python
python中requests和https使用简单示例
2018/01/18 Python
Python3实现的判断回文链表算法示例
2019/03/08 Python
Python3实现二叉树的最大深度
2019/09/30 Python
keras 解决加载lstm+crf模型出错的问题
2020/06/10 Python
Html5游戏开发之乒乓Ping Pong游戏示例(一)
2013/01/21 HTML / CSS
美国知名户外用品畅销中心:Sierra Trading Post
2016/07/19 全球购物
什么是TCP/IP
2014/07/27 面试题
全陪导游欢迎词
2014/01/17 职场文书
保险公司年会主持词
2014/03/22 职场文书
保研推荐信
2014/05/09 职场文书
2014县委书记党的群众路线教育实践活动对照检查材料思想汇报
2014/09/22 职场文书
在Oracle表中进行关键词搜索的过程
2022/06/10 Oracle