- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我收到错误:
'ascii' codec can't decode byte 0x8b in position 14: ordinal not in range(128)
当试图做 os.walk 时。发生错误是因为目录中的某些文件中包含 0x8b(非 utf8)字符。这些文件来自 Windows 系统(因此是 utf-16 文件名),但我已将文件复制到 Linux 系统并使用 python 2.7(在 Linux 中运行)来遍历目录。
我尝试将 unicode 起始路径传递给 os.walk,它生成的所有文件和目录都是 unicode 名称,直到它变成非 utf8 名称,然后由于某种原因,它不会转换这些名称到 unicode,然后代码阻塞在 utf-16 名称上。除了手动查找和更改所有令人反感的名称之外,还有什么方法可以解决这个问题?
如果在python2.7中没有解决方案,是否可以在python3中编写一个脚本来遍历文件树并通过将它们转换为utf-8(通过删除非utf8字符)来修复错误的文件名?注:除了 0x8b 之外,名称中还有许多非 utf8 字符,因此它需要以一般方式工作。
更新:0x8b 仍然只是一个 btye char(只是无效的 ascii)这一事实使它更加令人费解。我已验证将此类字符串转换为 unicode 存在问题,但可以直接创建 unicode 版本。也就是说:
>>> test = 'a string \x8b with non-ascii'
>>> test
'a string \x8b with non-ascii'
>>> unicode(test)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0x8b in position 9: ordinal not in range(128)
>>>
>>> test2 = u'a string \x8b with non-ascii'
>>> test2
u'a string \x8b with non-ascii'
这是我得到的错误的回溯:
80. for root, dirs, files in os.walk(unicode(startpath)):
File "/usr/lib/python2.7/os.py" in walk
294. for x in walk(new_path, topdown, onerror, followlinks):
File "/usr/lib/python2.7/os.py" in walk
294. for x in walk(new_path, topdown, onerror, followlinks):
File "/usr/lib/python2.7/os.py" in walk
284. if isdir(join(top, name)):
File "/usr/lib/python2.7/posixpath.py" in join
71. path += '/' + b
Exception Type: UnicodeDecodeError at /admin/casebuilder/company/883/
Exception Value: 'ascii' codec can't decode byte 0x8b in position 14: ordinal not in range(128)
问题的根源出现在从listdir返回的文件列表中(在os.walk的第276行):
names = listdir(top)
字符数 > 128 的名称将作为非 unicode 字符串返回。
最佳答案
是的,我只是花了一些时间来整理这个错误,这里更冗长的答案并没有解决根本问题:
问题是,如果你将一个 unicode 字符串 传入 os.walk(),那么 os.walk 开始从 os.listdir() 获取 unicode 并尝试将其保留为 ASCII(因此'ascii' 解码错误)。当它遇到 str() 无法翻译的仅 unicode 特殊字符时,它会抛出异常。
解决方案是强制传递给 os.walk 的起始路径为常规字符串 - 即 os.walk(str(somepath))。这意味着 os.listdir 返回常规的类似字节的字符串,并且一切正常。
你可以像这样简单地重现这个问题(并展示它的解决方案):
进入某个目录中的 bash 并运行 touch $(echo -e "\x8b\x8bThis is a bad filename")
这将生成一些测试文件。
现在在同一目录中运行以下 Python 代码(iPython Qt 很方便):
l = []
for root,dir,filenames in os.walk(unicode('.')):
l.extend([ os.path.join(root, f) for f in filenames ])
print l
你会得到一个 UnicodeDecodeError。
现在尝试运行:
l = []
for root,dir,filenames in os.walk('.'):
l.extend([ os.path.join(root, f) for f in filenames ])
print l
没有错误,你会得到一个打印出来的!
因此,Python 2.x 中的安全方法是确保只将原始文本传递给 os.walk()。您绝对不应该将 unicode 或可能是 unicode 的东西传递给它,因为 os.walk 会在内部 ascii 转换失败时阻塞。
关于python - 执行 os.walk 时出现 UnicodeDecodeError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21772271/
我有一个文本文件,发布者(美国证券交易委员会)声称该文件以 UTF-8 编码(https://www.sec.gov/files/aqfs.pdf,第 4 节)。我正在使用以下代码处理这些行: def
在 django 界面中添加元素时遇到问题。我有两个定义: # -*- coding: utf-8 -*- class VisitType(models.Model): name=models
我尝试制作一个脚本来使用 Mechanize 发布表单 剧本: # Browser br = mechanize.Browser() cj = cookielib.LWPCookieJar() br.
我收到此错误: UnicodeDecodeError: 'ascii' codec can't decode byte 0xe0 in position 4: ordinal not in range
我正在尝试使用 Google 语音 API 在 Python 中制作语音识别器。我一直在使用和改编 here 中的代码(转换为Python3)。我在计算机上使用一个音频文件,该文件已使用在线转换器从
打开一个docker实例(例如docker run -ti ubuntu:16.04),创建Python文件a.py # -*- coding: utf-8 -*- a = 'ö' 和r.py wit
当我将应用程序与Buildozer for Android打包在一起时,我会收到UnicodeDecodeError。 Log2与Buildozer一起附加 build.py 。 作业系统:UBUNT
我在 Ubuntu 终端(编码设置为 utf-8)中运行此代码段两次,一次使用 ./test.py然后用 ./test.py >out.txt : uni = u"\u001A\u0BC3\u1451
我正在尝试使用 Python 中的以下命令序列替换 Word 文件中的子字符串。代码本身工作得很好 - 即使使用完全相同的 Word 文件,但当将其嵌入到更大规模的项目结构中时,它会在确切的位置抛出错
我在 tox 中有以下配置: [tox] envlist = py37 [testenv] passenv = TRAVIS TRAVIS_* setenv = DEFAULT_FROM =
我正在获取 UnicodeDecodeError: 'ascii' codec can't decode byte 0xb0 in position 104: ordinal not in range
在执行子字符串匹配时,我收到 UnicodeDecodeError: 'ascii' codec can't Decode byte 0xc3 inposition 8: ordinal not in
我正在使用 Python 和 lxml,但遇到错误 我的代码 >>>import urllib >>>from lxml import html >>>response = urllib.urlope
我是 python 的新手,我正在尝试处理一小部分 Yelp!数据集是 JSON,但我使用 pandas 库和 NLTK 转换为 CSV。 在对数据进行预处理时,我首先尝试删除所有标点符号以及最常见的
我想不出如何一劳永逸地解决这些问题。当我尝试写“è”(我是意大利人)时,我第一次遇到这些问题。经过一些研究,我发现在最开始添加“#coding: utf-8”似乎可以解决问题....直到现在。 我编辑
我的数据存储包含值,我希望我的表单能够更新这些值。我在 jinja2 中使用 wtforms 和谷歌应用引擎。我收到一条我无法理解的错误消息: 'ascii' codec can't decode b
我们遇到了一个问题(描述为 http://wiki.python.org/moin/UnicodeDecodeError)——请阅读第二段“...自相矛盾...”。 具体来说,我们正在尝试将字符串向上
我正在尝试标记一些文档,但我遇到了这个错误 UnicodeDecodeError: 'ascii' codec can't decode byte 0xef in position 6: ordina
我想在一个文件中存储一个包含多个 numpy 数组的 Python 对象。我找到了 pickle,但在加载存储的对象时总是遇到 UnicodeDecodeError: Traceback (mos
我正在尝试制作一个 python 脚本来查找 USB 闪存驱动器中的重复文件。 我遵循的过程是创建一个文件名列表,散列每个文件,然后创建一个逆向字典。然而,在过程中的某个地方,我得到了一个 Unico
我是一名优秀的程序员,十分优秀!