Python 3:os.walk()文件路径UnicodeEncodeError:'utf-8'编解码器无法编码:不允许代理

发布于 2021-01-29 17:47:08

这段代码:

for root, dirs, files in os.walk('.'):
    print(root)

给我这个错误:

UnicodeEncodeError: 'utf-8' codec can't encode character '\udcc3' in position 27: surrogates not allowed

如何遍历文件树而不会得到像这样的有害字符串?

关注者
0
被浏览
237
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    在Linux上,文件名只是“一堆字节”,不一定以特定的编码进行编码。Python
    3尝试将所有内容转换为Unicode字符串。通过这样做,开发人员想出了一种方案,可以将字节字符串转换为Unicode字符串,然后又将其转换回去而不会丢失,也不会知道原始编码。他们使用部分替代来编码“坏”字节,但是普通的UTF8编码器在打印到终端时无法处理它们。

    例如,这是一个非UTF8字节的字符串:

    >>> b'C\xc3N'.decode('utf8','surrogateescape')
    'C\udcc3N'
    

    它可以与Unicode相互转换而不会丢失:

    >>> b'C\xc3N'.decode('utf8','surrogateescape').encode('utf8','surrogateescape')
    b'C\xc3N'
    

    但是无法打印:

    >>> print(b'C\xc3N'.decode('utf8','surrogateescape'))
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    UnicodeEncodeError: 'utf-8' codec can't encode character '\udcc3' in position 1: surrogates not allowed
    

    您必须弄清楚要使用非默认编码的文件名要做什么。也许只是将它们编码回原始字节,然后用未知替换将其解码。使用它进行显示,但保留原始名称以访问文件。

    >>> b'C\xc3N'.decode('utf8','replace')
    C�N
    

    os.walk 也可以采用字节字符串,并返回字节字符串而不是Unicode字符串:

    for p,d,f in os.walk(b'.'):
    

    然后,您可以根据需要进行解码。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看