当前位置: 首页 > 知识库问答 >
问题:

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

如何在文件树中穿行而不产生这样的有毒字符串?

共有3个答案

东门晟
2023-03-14

尝试使用这行代码

"bad string".encode('utf-8', 'replace').decode()
白彦
2023-03-14

我最终传递了一个字节串到os.walk(),它显然会返回字节串,而不是不正确的Unicode字符串

for root, dirs, files in os.walk(b'.'):
    print(root)
郑星辰
2023-03-14

在Linux上,文件名“只是一堆字节”,不一定以特定的编码方式进行编码。Python3尝试将所有内容转换为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'.'):

然后你可以随心所欲地解码。

 类似资料:
  • 问题内容: 这段代码: 给我这个错误: 如何遍历文件树而不会得到像这样的有害字符串? 问题答案: 在Linux上,文件名只是“一堆字节”,不一定以特定的编码进行编码。Python 3尝试将所有内容转换为Unicode字符串。通过这样做,开发人员想出了一种方案,可以将字节字符串转换为Unicode字符串,然后又将其转换回去而不会丢失,也不会知道原始编码。他们使用部分替代来编码“坏”字节,但是普通的U

  • 请查看Servlet类中的注释。如果将更改为,则无法访问应用程序。 为什么会出现这个问题?

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

  • 我在将文本从UTF-8编码转换为UTF-8编码时遇到问题。这里有字节数组, 我正在将其转换为UTF-8字符串并返回字节数组, 据我所知,这是一个3字节的数组。正当但这是我得到的。 这是什么原因?据我所知,在UTF-8 Specials中,2391189组合被称为替换字符。 这也是一个更大问题的一部分。

  • 问题内容: 我想从请求中获取参数(带有重音符的字符),但是它不起作用。我尝试使用,但也没有用。 我知道返回正确的字符,但不起作用! 有人有主意吗? 问题答案: Paul的建议似乎是最好的做法,但如果要解决此问题,则根本不需要URLEncoder或URLDecoder: 更新: 由于获得了很多选票,我想强调BalusC的观点,即这绝对不是解决方案。充其量是一种解决方法。人们不应该这样做。 我不知道是

  • 问题内容: 我正在用python做一些脚本。我创建一个保存在文件中的字符串。这个字符串有很多数据,来自目录的树状结构和文件名。根据convmv的介绍,我所有的树状结构都是UTF-8。 我想将所有内容都保留在UTF-8中,因为之后我将其保存在MySQL中。现在,在UTF-8的MySQL中,我遇到了一些字符问题(例如é或è-我是法语)。 我希望python始终将字符串用作UTF-8。我在互联网上阅读了