GVKun编程网logo

执行os.walk时出现UnicodeDecodeError(执行cl.exe时出错,什么意思)

13

在这里,我们将给大家分享关于执行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时出错,什么意思)

执行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-1252utf8
编码。有两种处理这种混合的方法。首先,最好是运行:

$ 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/

我极力推荐给任何遇到u​​nicode问题的人。

(转) UnicodeDecodeError: ''ascii'' codec can''t decode byte 0xe5 in position 4: ordinal n...

(转) 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解决方法

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 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?

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右双引号;注意1C1D部分。似乎他们的编码器似乎采用了UTF-16并去除了所有高字节,而不是正确地编码为UTF-8!

没有与Python中没有编解码器出货将编码''\u201C\u201D''b''\x1C\x1D'',使这一切更可能的是,美国证券交易委员会已经把事情弄糟了编码过程中的某个地方。实际上,还有0x13和0x14字符(可能是
enem 破折号)(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_recordfields列表与其中的值组合在一起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?的相关信息,请在本站查询。

本文标签: