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发送form-data请求及拼接form-data内容的方法
Mar 05 Python
全面了解Nginx, WSGI, Flask之间的关系
Jan 09 Python
Pandas 按索引合并数据集的方法
Nov 15 Python
python删除列表元素的三种方法(remove,pop,del)
Jul 22 Python
python中调试或排错的五种方法示例
Sep 12 Python
python3 写一个WAV音频文件播放器的代码
Sep 27 Python
python函数enumerate,operator和Counter使用技巧实例小结
Feb 22 Python
Python使用type动态创建类操作示例
Feb 29 Python
python 检测nginx服务邮件报警的脚本
Dec 31 Python
如何使用flask将模型部署为服务
May 13 Python
用Python实现屏幕截图详解
Jan 22 Python
一起来学习Python的元组和列表
Mar 13 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 cron中的批处理
2008/09/16 PHP
跟我学Laravel之路由
2014/10/15 PHP
smarty简单应用实例
2015/11/03 PHP
thinkphp5.0自定义验证规则使用方法
2017/11/16 PHP
Jquery判断IE6等浏览器的代码
2011/04/05 Javascript
Knockoutjs快速入门(经典)
2012/12/24 Javascript
jQuery使用ajaxSubmit()提交表单示例
2014/04/04 Javascript
jquery动态调整div大小使其宽度始终为浏览器宽度
2014/06/06 Javascript
ECMAScript6新增值比较函数Object.is
2015/06/12 Javascript
JavaScript 七大技巧(一)
2015/12/13 Javascript
JS实现控制文本框的内容
2016/07/10 Javascript
使用BootStrap实现标签切换原理解析
2017/03/14 Javascript
详解node如何让一个端口同时支持https与http
2017/07/04 Javascript
js微信分享实现代码
2020/10/11 Javascript
vue-rx的初步使用教程
2018/09/21 Javascript
AngularJs中$cookies简单用法分析
2019/05/30 Javascript
基于jquery ajax的多文件上传进度条过程解析
2019/09/11 jQuery
微信小程序scroll-view点击项自动居中效果的实现
2020/03/25 Javascript
JS async 函数的含义和用法实例总结
2020/04/08 Javascript
vue iview实现动态新增和删除
2020/06/17 Javascript
[01:41]DOTA2 2015国际邀请赛中国区预选赛第三日战报
2015/05/28 DOTA
python直接访问私有属性的简单方法
2016/07/25 Python
python 统计数组中元素出现次数并进行排序的实例
2018/07/02 Python
python中的插值 scipy-interp的实现代码
2018/07/23 Python
如何使用Python实现自动化水军评论
2019/06/26 Python
Python爬虫爬取新闻资讯案例详解
2020/07/14 Python
Python 连接 MySQL 的几种方法
2020/09/09 Python
Pycharm中如何关掉python console
2020/10/27 Python
HTML5页面音视频在微信和app下自动播放的实现方法
2016/10/20 HTML / CSS
设计专业自荐信
2014/06/19 职场文书
2015年医院药剂科工作总结
2015/05/04 职场文书
湘江北去观后感
2015/06/15 职场文书
六一儿童节新闻稿
2015/07/17 职场文书
导游词之安徽巢湖
2019/12/26 职场文书
python爬不同图片分别保存在不同文件夹中的实现
2021/04/02 Python
详解Spring Security中的HttpBasic登录验证模式
2022/03/17 Java/Android