当前位置: 首页 > 面试题库 >

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

殳自怡
2023-03-14
问题内容

这段代码:

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

给我这个错误:

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

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


问题答案:

在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'.'):

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



 类似资料:
  • 此代码: 给我这个错误: 如何在文件树中穿行而不产生这样的有毒字符串?

  • 问题内容: 当上传具有非ASCII字符的文件时,出现UnicodeEncodeError: 我使用MySQL,nginx和FastCGI运行Django 1.2。 根据Django Trac数据库,这是已解决的问题,但是我仍然有问题。欢迎提供有关如何修复的任何建议。 编辑:这是我的图像字段: 问题答案: 在对此进行更多调查之后,我发现我尚未在我的主要Nginx配置文件中设置字符集: 通过添加以上内

  • 问题内容: 我正在尝试抓取一个网站,但这给我一个错误。 我正在使用以下代码: 我收到以下错误: 我该怎么做才能解决此问题? 问题答案: 我通过添加将其修复。 那意味着变成。

  • 问题内容: 当我尝试在数据库中插入外来字符时,可能是什么导致此错误? 而我该如何解决呢? 谢谢! 问题答案: 字符U + 201C左双引号在Latin-1(ISO-8859-1)编码中不存在。 这 是 目前在代码页1252(西欧)。这是Windows特定的编码,基于ISO-8859-1,但会将多余的字符放入0x80-0x9F范围内。代码页1252通常与ISO-8859-1混淆,这是一种令人烦恼但现

  • 我正试图抓取一个网站,但它给了我一个错误。 我正在使用以下代码: 我得到了以下错误: 我能做些什么来解决这个问题?

  • 问题内容: 我正在编写一个Python(Python 3.3)程序,以使用POST方法将一些数据发送到网页。通常在调试过程中,我会获取页面结果并使用print()功能将其显示在屏幕上。 代码是这样的: 该方法返回一个bytes编码页面的元素(格式正确的UTF-8文档),直到我停止使用Windows的IDLE GUI并改为使用Windows控制台时,这似乎还可以。返回的页面具有字符(破折号),打印功