在这里,我们将给大家分享关于执行os.walk时出现UnicodeDecodeError的知识,让您更了解执行cl.exe时出错,什么意思的本质,同时也会涉及到如何更有效地(转)UnicodeDeco
在这里,我们将给大家分享关于执行os.walk时出现UnicodeDecodeError的知识,让您更了解执行cl.exe时出错,什么意思的本质,同时也会涉及到如何更有效地(转) UnicodeDecodeError: ''ascii'' codec can''t decode byte 0xe5 in position 4: ordinal n...、Django 运行Admin 页面时出现 UnicodeDecodeError: ''gbk'' codec can''t decode byte XXXX解决方法、json.load UnicodeDecodeError: 'gbk' codec can't decode byte 0xac、Python 3 UnicodeDecodeError-如何调试UnicodeDecodeError?的内容。
本文目录一览:- 执行os.walk时出现UnicodeDecodeError(执行cl.exe时出错,什么意思)
- (转) UnicodeDecodeError: ''ascii'' codec can''t decode byte 0xe5 in position 4: ordinal n...
- Django 运行Admin 页面时出现 UnicodeDecodeError: ''gbk'' codec can''t decode byte XXXX解决方法
- json.load UnicodeDecodeError: 'gbk' codec can't decode byte 0xac
- Python 3 UnicodeDecodeError-如何调试UnicodeDecodeError?
执行os.walk时出现UnicodeDecodeError(执行cl.exe时出错,什么意思)
我收到错误消息:
''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字符(只是无效的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''>>> test2u''a string \x8b with non-ascii''
这是我得到的错误的追溯:
80. for root, dirs, files in os.walk(unicode(startpath)):File "/usr/lib/python2.7/os.py" in walk294. for x in walk(new_path, topdown, onerror, followlinks):File "/usr/lib/python2.7/os.py" in walk294. for x in walk(new_path, topdown, onerror, followlinks):File "/usr/lib/python2.7/os.py" in walk284. if isdir(join(top, name)):File "/usr/lib/python2.7/posixpath.py" in join71. path += ''/'' + bException 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字符串返回。
答案1
小编典典这个问题源于两个基本问题。第一个事实是Python 2.x的默认编码为’ascii’,而Linux的默认编码为’utf8’。您可以通过以下方式验证这些编码:
sys.getdefaultencoding() #pythonsys.getfilesystemencoding() #OS
当os模块函数返回目录内容(即os.walk和os.listdir)返回仅包含ascii文件名和非ascii文件名的文件列表时,ascii编码文件名将自动转换为unicode。其他不是。因此,结果是一个包含unicode和str对象混合的列表。正是str对象可能会导致问题。由于它们不是ascii,因此python无法知道要使用哪种编码,因此无法将它们自动解码为unicode。
因此,当执行诸如os.path(dir,file)之类的常用操作时,其中 dir 是unicode,而 file
是已编码的str,如果文件未进行ascii编码(默认设置),则此调用将失败。解决方案是在检索到每个文件名后立即检查它们,并使用适当的编码将str(已编码的)对象解码为unicode。
那是第一个问题及其解决方案。第二个有点棘手。由于文件最初来自Windows系统,因此它们的文件名可能使用称为 Windows-1252
的编码。一种简单的检查方法是致电:
filename.decode(''windows-1252'')
如果结果是有效的unicode版本,则您可能具有正确的编码。您也可以通过在unicode版本上调用 print 进一步进行验证,并查看正确的文件名。
最后的皱纹。在具有Windows起源文件的Linux系统中,可能甚至可能混合使用 Windows-1252 和 utf8
编码。有两种处理这种混合的方法。首先,最好是运行:
$ convmv -f windows-1252 -t utf8 -r DIRECTORY --notest
其中DIRECTORY是包含需要转换的文件的目录。此命令会将所有Windows-1252编码的文件名转换为utf8。它进行了智能转换,如果文件名已经是utf8(或ascii),它将什么都不做。
另一种方法(如果由于某种原因而无法执行此转换)是在python中即时执行类似的操作。以机智:
def decodeName(name): if type(name) == str: # leave unicode ones alone try: name = name.decode(''utf8'') except: name = name.decode(''windows-1252'') return name
该函数首先尝试utf8解码。如果失败,则回退到Windows-1252版本。在os调用返回文件列表之后使用此功能:
root, dirs, files = os.walk(path): files = [decodeName(f) for f in files] # do something with the unicode filenames now
我个人发现unicode和编码的整个主题都非常混乱,直到我阅读了这个精彩而简单的教程:
http://farmdev.com/talks/unicode/
我极力推荐给任何遇到unicode问题的人。
(转) UnicodeDecodeError: ''ascii'' codec can''t decode byte 0xe5 in position 4: ordinal n...
更新
更新以后,每次启动终端会提示,import sitecustomize failed,原因是 setdefaultencoding 在Python2.5以后删掉了,因此我们将 sitecustomize.py的文件内容改为:
import sys
reload(sys) #重新载入
sys.setdefaultencoding(''utf-8'')
启动终端不会再有错误提示,但是在启动 jupyter notebook的时候,有错误,于是又将这个文件的内容更新为:
import sys
reload(sys) # Python2.5 初始化后会删除 sys.setdefaultencoding 这个方法,我们需要重新载入
sys.setdefaultencoding(''utf-8'')
str = ''中文''
str.encode(''gb18030'')
在启动终端时会显示错误,但是启动jupyter notebook 则可以显示当前目录下的中文.最后我将两个export 语句写入了.bashrc文件.使用notebook时,保证当前目录下无中文.
我用的方法:
UnicodeDecodeError: ''ascii'' codec can''t decode byte 0xe5 in position 4: ordinal not in range(128)
如果出现编码问题:类似错误如下UnicodeDecodeError: ''ascii'' codec can''t decode byte 0xe5 in position 4: ordinal not in range(128),这是由于python2中的编码bug,需要在python目录/lib/python2.7/site-packages/中新建一个文件:
sitecustomize.py,其中包含下列代码。
import sys
sys.setdefaultencoding(‘utf-8’)
随后再修改系统默认编码:
export LANG=en_US:UTF-8
export LANGUAGE=en_US:en
cd your work_folder,启动`jupyter notebook``即可解决
————————————————
版权声明:本文为CSDN博主「aenjon」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/farphone/article/details/85801266
其它方法:
[1] https://www.jianshu.com/p/516eb2a57ee6
[2] https://www.cnblogs.com/lcngu/p/7077137.html
Django 运行Admin 页面时出现 UnicodeDecodeError: ''gbk'' codec can''t decode byte XXXX解决方法
具体报错信息
Traceback (most recent call last):
File "D:\Anaconda3\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
response = get_response(request)
File "D:\Anaconda3\lib\site-packages\django\utils\deprecation.py", line 94, in __call__
response = response or self.get_response(request)
File "D:\Anaconda3\lib\site-packages\django\core\handlers\exception.py", line 36, in inner
response = response_for_exception(request, exc)
File "D:\Anaconda3\lib\site-packages\django\core\handlers\exception.py", line 90, in response_for_exception
response = handle_uncaught_exception(request, get_resolver(get_urlconf()), sys.exc_info())
File "D:\Anaconda3\lib\site-packages\django\core\handlers\exception.py", line 125, in handle_uncaught_exception
return debug.technical_500_response(request, *exc_info)
File "D:\Anaconda3\lib\site-packages\django\views\debug.py", line 94, in technical_500_response
html = reporter.get_traceback_html()
File "D:\Anaconda3\lib\site-packages\django\views\debug.py", line 332, in get_traceback_html
t = DEBUG_ENGINE.from_string(fh.read())
UnicodeDecodeError: ''gbk'' codec can''t decode byte 0xa6 in position 9737: illegal multibyte sequence
一般都是中文问题导致的,可以修改settings.py修改成以下设置
LANGUAGE_CODE = ''zh-hans''
TIME_ZONE = ''Asia/Shanghai''
USE_I18N = True
USE_L10N = True
USE_TZ = False
json.load UnicodeDecodeError: 'gbk' codec can't decode byte 0xac
问题:
使用 json.load()函数或者fp.read() 函数或者open()函数读取中文的时候,发现报错:
UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0xac
UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0x9d in position 1270: illegal multibyte sequence
这是是字符流的问题。python无法把一些字符Decode成utf8
,
解决办法:
在Decode之前先encoding成UTF8,比如:
with open(‘labels.json’,‘r’,encoding=’UTF-8’) as f:
fp.read(‘labels.json’,encoding=’UTF-8’)
等等,总之就是读取的时候就手动encoding成UTF8,这样python自动Decode的时候就不会报错。
Python 3 UnicodeDecodeError-如何调试UnicodeDecodeError?
我有一个文本文件,发布者(美国证券交易委员会)断言该文本文件以UTF-8编码(https://www.sec.gov/files/aqfs.pdf,第4节)。我正在使用以下代码处理代码行:
def tags(filename): """Yield Tag instances from tag.txt.""" with codecs.open(filename, ''r'', encoding=''utf-8'', errors=''strict'') as f: fields = f.readline().strip().split(''\t'') for line in f.readlines(): yield process_tag_record(fields, line)
我收到以下错误:
Traceback (most recent call last): File "/home/randm/Projects/finance/secxbrl.py", line 151, in <module> main() File "/home/randm/Projects/finance/secxbrl.py", line 143, in main all_tags = list(tags("tag.txt")) File "/home/randm/Projects/finance/secxbrl.py", line 109, in tags content = f.read() File "/home/randm/Libraries/anaconda3/lib/python3.6/codecs.py", line 698, in read return self.reader.read(size) File "/home/randm/Libraries/anaconda3/lib/python3.6/codecs.py", line 501, in read newchars, decodedbytes = self.decode(data, self.errors)UnicodeDecodeError: ''utf-8'' codec can''t decode byte 0xad in position 3583587: invalid start byte
鉴于我可能无法回到SEC并告诉他们它们包含的文件似乎未采用UTF-8编码,我应该如何调试和捕获此错误?
我尝试了什么
我对文件进行了十六进制转储,发现有问题的文本是文本``非现金投资的补充披露’‘。如果我将有问题的字节解码为十六进制代码点(即“ U +
00AD”),则在上下文中是有意义的,因为它是软连字符。但是以下似乎无效:
Python 3.5.2 (default, Nov 17 2016, 17:05:23) [GCC 5.4.0 20160609] on linuxType "help", "copyright", "credits" or "license" for more information.>>> b"\x41".decode("utf-8")''A''>>> b"\xad".decode("utf-8")Traceback (most recent call last): File "<stdin>", line 1, in <module>UnicodeDecodeError: ''utf-8'' codec cant decode byte 0xad in position 0: invalid start byte>>> b"\xc2ad".decode("utf-8")Traceback (most recent call last): File "<stdin>", line 1, in <module>UnicodeDecodeError: ''utf-8'' codec cant decode byte 0xc2 in position 0: invalid continuation byte
我用过了errors=''replace''
,这似乎过去了。但我想了解一下,如果我尝试将其插入数据库中会发生什么。
编辑添加十六进制转储:
0036ae40 31 09 09 09 09 53 55 50 50 4c 45 4d 45 4e 54 41 |1....SUPPLEMENTA|0036ae50 4c 20 44 49 53 43 4c 4f 53 55 52 45 20 4f 46 20 |L DISCLOSURE OF |0036ae60 4e 4f 4e ad 43 41 53 48 20 49 4e 56 45 53 54 49 |NON.CASH INVESTI|0036ae70 4e 47 20 41 4e 44 20 46 49 4e 41 4e 43 49 4e 47 |NG AND FINANCING|0036ae80 20 41 43 54 49 56 49 54 49 45 53 3a 09 0a 50 72 | ACTIVITIES:..Pr|
答案1
小编典典您的数据文件已损坏。如果该字符确实是U + 00AD SOFT
HYPHEN,那么您缺少一个0xC2字节:
>>> ''\u00ad''.encode(''utf8'')b''\xc2\xad''
在以0xAD结尾的所有可能的UTF-8编码中,软连字符确实最有意义。但是,它指示 可能 缺少其他字节的数据集。您碰巧碰到了一个重要事件。
我将返回此数据集的源,并验证下载时文件未损坏。否则,error=''replace''
如果没有分隔符(制表符,换行符等)缺失,则使用是可行的解决方法。
另一种可能性是SEC实际上对文件使用了 不同的
编码。例如,在Windows代码页1252和Latin-1中,0xAD
是软连字符的正确编码。确实,当我直接下载相同的数据集(警告,链接了大的ZIP文件)并打开时tags.txt
,我无法将数据解码为UTF-8:
>>> open(''/tmp/2017q1/tag.txt'', encoding=''utf8'').read()Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/.../lib/python3.6/codecs.py", line 321, in decode (result, consumed) = self._buffer_decode(data, self.errors, final)UnicodeDecodeError: ''utf-8'' codec can''t decode byte 0xad in position 3583587: invalid start byte>>> from pprint import pprint>>> f = open(''/tmp/2017q1/tag.txt'', ''rb'')>>> f.seek(3583550)3583550>>> pprint(f.read(100))(b''1\t1\t\t\t\tSUPPLEMENTAL DISCLOSURE OF NON\xadCASH INVESTING AND FINANCING A'' b''CTIVITIES:\t\nProceedsFromSaleOfIn'')
文件中有两个这样的非ASCII字符:
>>> f.seek(0)0>>> pprint([l for l in f if any(b > 127 for b in l)])[b''SupplementalDisclosureOfNoncashInvestingAndFinancingActivitiesAbstract\t0'' b''001654954-17-000551\t1\t1\t\t\t\tSUPPLEMENTAL DISCLOSURE OF NON\xadCASH I'' b''NVESTING AND FINANCING ACTIVITIES:\t\n'', b''HotelKranichhheMember\t0001558370-17-001446\t1\t0\tmember\tD\t\tHotel Krani'' b''chhhe [Member]\tRepresents information pertaining to Hotel Kranichh\xf6h'' b''e.\n'']
Hotel Kranichh\xf6he
HotelKranichhöhe 被解码为Latin-1 。
文件中还有几对0xC1 / 0xD1对:
>>> f.seek(0)0>>> quotes = [l for l in f if any(b in {0x1C, 0x1D} for b in l)]>>> quotes[0].split(b''\t'')[-1][50:130]b''Temporary Payroll Tax Cut Continuation Act of 2011 (\x1cTCCA\x1d) recognized during th''>>> quotes[1].split(b''\t'')[-1][50:130]b''ributory defined benefit pension plan (the \x1cAetna Pension Plan\x1d) to allow certai''
我敢打赌那些实际上是U + 201C左双引号和U +
201D右双引号;注意1C
和1D
部分。似乎他们的编码器似乎采用了UTF-16并去除了所有高字节,而不是正确地编码为UTF-8!
没有与Python中没有编解码器出货将编码''\u201C\u201D''
来b''\x1C\x1D''
,使这一切更可能的是,美国证券交易委员会已经把事情弄糟了编码过程中的某个地方。实际上,还有0x13和0x14字符(可能是
en 和 em 破折号)(U + 2013和U +
2014),以及几乎可以肯定是单引号的0x19字节(U +
2019)。完整图片所缺少的只是一个0x18字节来表示U +
2018。
如果我们假设编码已损坏,则可以尝试修复。以下代码将读取文件并解决引号问题,并假设其余数据不使用除引号之外的Latin-1之外的字符:
_map = { # dashes 0x13: ''\u2013'', 0x14: ''\u2014'', # single quotes 0x18: ''\u2018'', 0x19: ''\u2019'', # double quotes 0x1c: ''\u201c'', 0x1d: ''\u201d'',}def repair(line, _map=_map): """Repair mis-encoded SEC data. Assumes line was decoded as Latin-1""" return line.translate(_map)
然后将其应用于您阅读的行:
with open(filename, ''r'', encoding=''latin-1'') as f: repaired = map(repair, f) fields = next(repaired).strip().split(''\t'') for line in repaired: yield process_tag_record(fields, line)
另外,解决您的已发布代码,使Python变得比预期更难工作。不要用codecs.open()
; 那是已知问题的旧代码,并且比新的Python 3 I /
O层慢。只需使用open()
。不要使用f.readlines()
; 您无需在此处将整个文件读入列表。只需直接遍历文件即可:
def tags(filename): """Yield Tag instances from tag.txt.""" with open(filename, ''r'', encoding=''utf-8'', errors=''strict'') as f: fields = next(f).strip().split(''\t'') for line in f: yield process_tag_record(fields, line)
如果process_tag_record
还在选项卡上拆分,请使用一个csv.reader()
对象,并避免手动拆分每一行:
import csvdef tags(filename): """Yield Tag instances from tag.txt.""" with open(filename, ''r'', encoding=''utf-8'', errors=''strict'') as f: reader = csv.reader(f, delimiter=''\t'') fields = next(reader) for row in reader: yield process_tag_record(fields, row)
如果process_tag_record
将fields
列表与其中的值组合在一起row
以形成字典,请csv.DictReader()
改用:
def tags(filename): """Yield Tag instances from tag.txt.""" with open(filename, ''r'', encoding=''utf-8'', errors=''strict'') as f: reader = csv.DictReader(f, delimiter=''\t'') # first row is used as keys for the dictionary, no need to read fields manually. yield from reader
我们今天的关于执行os.walk时出现UnicodeDecodeError和执行cl.exe时出错,什么意思的分享已经告一段落,感谢您的关注,如果您想了解更多关于(转) UnicodeDecodeError: ''ascii'' codec can''t decode byte 0xe5 in position 4: ordinal n...、Django 运行Admin 页面时出现 UnicodeDecodeError: ''gbk'' codec can''t decode byte XXXX解决方法、json.load UnicodeDecodeError: 'gbk' codec can't decode byte 0xac、Python 3 UnicodeDecodeError-如何调试UnicodeDecodeError?的相关信息,请在本站查询。
本文标签: