python - Python 2.7:打印出解码的字符串
问题描述
我有一个名为:Abrázame.txt 的文件
我想对此进行解码,以便 python 了解这个 'á' 字符是什么,以便它打印我 Abrázame.txt
这是我在 Scratch 文件中的以下代码:
import os
s = os.path.join(r'C:\Test\AutoTest', os.listdir(r'C:\\Test\\AutoTest')[0])
print(unicode(s.decode(encoding='utf-16', errors='strict')))
我从上面得到的错误是:
Traceback (most recent call last):
File "C:/Users/naythan_onfri/.PyCharmCE2017.2/config/scratches/scratch_3.py", line 12, in <module>
print(unicode(s.decode(encoding='utf-16', errors='strict')))
File "C:\Python27\lib\encodings\utf_16.py", line 16, in decode
return codecs.utf_16_decode(input, errors, True)
UnicodeDecodeError: 'utf16' codec can't decode byte 0x74 in position 28: truncated data
我查找了 utf-16 字符集,其中确实有 'á' 字符。那么为什么这个字符串不能用 Utf-16 解码。
我也知道'latin-1'可以工作并产生我正在寻找的字符串,但是因为这是一个自动化项目,我想确保任何具有任何注册字符的文件名都可以被解码并用于项目中的其他事情例子:
“在已选择文件的文件目录中打开文件资源管理器。”
是否遍历每个编解码器(请注意,我相信有 93 个编解码器)以找到可以解码字符串的任何一个,这是获得我正在寻找的结果的最佳方式?我认为有比那个解决方案更好的东西。
解决方案
当您第一次读取字符串时,您希望在边缘进行解码,这样您以后的代码中就不会出现意外。在边缘,您有一些合理的机会猜测该编码是什么。对于此代码,边缘是
os.listdir(r'C:\\Test\\AutoTest')[0]
并且可以获取当前文件系统目录编码。所以,
import sys
fs_encoding = sys.getfilesystemencoding()
s = os.path.join(r'C:\Test\AutoTest',
os.listdir(r'C:\\Test\\AutoTest')[0].decode(encoding=fs_encodig, errors='strict')
print(s)
请注意,一旦您解码,您就有了一个 unicode 字符串,并且您不需要从中构建一个新unicode()
对象。
latin-1
如果那是您当前的代码页,则有效。有趣的是,尽管 Windows 多年来一直使用“W”版本的 API 支持“宽”字符,但 python 2 是基于单字节字符的并且不使用它们。
蟒蛇3万岁。
推荐阅读
- python - caffe如何将非图像数据转换为lmdb格式
- java - 在我的情况下,为什么协议缓冲区的性能比 JSON 差?
- c# - 基类和继承类的 XML 序列化信息
- javascript - 是否可以从 expo vector-icons 导入特定图标?
- amazon-web-services - AWS API Gateway 部署的 API 无法解析请求正文
- c# - 敌人生命条和受到伤害
- docker - docker simple index.html下运行vue/cli app打开
- scheme - 用牛顿法求根
- javascript - Leaflet.PolylineMeasure 在新环境中不起作用
- java - 带有嵌套帐户的 Spring Security