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的迭代器、生成器以及相关的itertools包
Apr 02 Python
python的random模块及加权随机算法的python实现方法
Jan 04 Python
python requests 使用快速入门
Aug 31 Python
python中requests使用代理proxies方法介绍
Oct 25 Python
Python 实现网页自动截图的示例讲解
May 17 Python
Django如何自定义分页
Sep 25 Python
Python判断是否json是否包含一个key的方法
Dec 31 Python
Django上线部署之IIS的配置方法
Aug 22 Python
Pytorch在NLP中的简单应用详解
Jan 08 Python
TFRecord格式存储数据与队列读取实例
Jan 21 Python
通过cmd进入python的步骤
Jun 16 Python
C++和python实现阿姆斯特朗数字查找实例代码
Dec 07 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 常用字符串函数总结
2008/03/15 PHP
PHP COOKIE及时生效的方法介绍
2014/02/14 PHP
PhpStorm terminal无法输入命令的解决方法
2016/10/09 PHP
一文掌握PHP Xdebug 本地与远程调试(小结)
2019/04/23 PHP
JavaScript DOM学习第一章 W3C DOM简介
2010/02/19 Javascript
js读取本地excel文档数据的代码
2010/11/11 Javascript
初识JQuery 实例一(first)
2011/03/16 Javascript
javascript动态加载二
2012/08/22 Javascript
JQuery写动态树示例代码
2013/07/31 Javascript
jquery中event对象属性与方法小结
2013/12/18 Javascript
jquery操作下拉列表、文本框、复选框、单选框集合(收藏)
2014/01/08 Javascript
js跳转页面方法实现汇总
2014/02/11 Javascript
jquery-syntax动态语法着色示例代码
2014/05/14 Javascript
Javascript Object 对象学习笔记
2014/12/17 Javascript
DIV随滚动条滚动而滚动的实现代码【推荐】
2016/04/12 Javascript
详解webpack自动生成html页面
2017/06/29 Javascript
javaScript日期工具类DateUtils详解
2017/12/08 Javascript
vue-cli下的vuex的简单Demo图解(实现加1减1操作)
2018/02/26 Javascript
如何获取TypeScript的声明文件.d.ts
2018/05/01 Javascript
node中的session的具体使用
2018/09/14 Javascript
js实现黑白div块画空心的图形
2018/12/13 Javascript
JS学习笔记之闭包小案例分析
2019/05/29 Javascript
开源一个微信小程序仪表盘组件过程解析
2019/07/30 Javascript
在layer弹层layer.prompt中,修改placeholder的实现方法
2019/09/27 Javascript
axios解决高并发的方法:axios.all()与axios.spread()的操作
2020/11/09 Javascript
详解vue3中组件的非兼容变更
2021/03/03 Vue.js
python基于隐马尔可夫模型实现中文拼音输入
2016/04/01 Python
Python多维/嵌套字典数据无限遍历的实现
2016/11/04 Python
Django自定义认证方式用法示例
2017/06/23 Python
Python2和Python3中urllib库中urlencode的使用注意事项
2018/11/26 Python
django rest framework使用django-filter用法
2020/07/15 Python
女士时装鞋:Chinese Laundry
2018/08/29 全球购物
出国留学介绍信
2014/01/13 职场文书
喜之郎果冻广告词
2014/03/20 职场文书
创卫工作总结2015
2015/04/22 职场文书
如何让你的Nginx支持分布式追踪详解
2022/07/07 Servers