Python3'ascii'编解码器无法编码字符

Posted

技术标签:

【中文标题】Python3\'ascii\'编解码器无法编码字符【英文标题】:Python3 'ascii' codec can't encode characterPython3'ascii'编解码器无法编码字符 【发布时间】:2017-03-29 09:51:05 【问题描述】:

我正在尝试重命名名称中包含非 unicode 字符的文件。

import os

dir = b'/tr2'

for file_name in os.listdir(dir):
    file_name = file_name.decode('utf8','replace')
    print(file_name)
    os.rename(file_name,'11.txt')

只能打印这个名字,但是当我尝试重命名时,我得到了错误:

UnicodeEncodeError: 'ascii' codec can't encode character '\xf1' in position 11: ordinal not in range(128)

【问题讨论】:

这发生在哪一行?在print(file_name) 上(尝试将unicode 数据打印到无法处理unicode 的终端)或os.rename(file_name, '11.txt')?请始终包含 full 堆栈跟踪。此外,您实际上不需要解码二进制文件名,如果您将其传递给os.rename,它应该可以工作,正如os.listdir返回的那样 os.rename(file_name,'11.txt') UnicodeEncodeError: 'ascii' codec can't encode character '\xf1' in position 11:序数不在范围内(128)。当我删除 file_name = file_name.decode('utf8','replace') 时,出现错误 - FileNotFoundError: [Errno 2] No such file or directory: b'01 Contrase\xc3\xb1as.txt' -> '11 .txt' os.rename() 相对于当前目录起作用,os.listdir() 返回的文件是相对于给定路径(dir = b'/tr2')的,这就是你得到 FileNotFoundError 的原因。尝试 os.rename(os.path.join(dir, file_name), os.path.join(dir, b'11.txt')) 而不解码 file_name。 【参考方案1】:

问题在于我需要显示 file_name 的值并稍后在程序中使用它。所以感谢 Martin Evans 在接下来的决定:

import os

dir = b'/tr2'

for file_name in os.listdir(dir):

print(file_name.decode('utf8','replace'))

os.rename(os.path.join(dir, file_name), os.path.join(dir, b'11.txt'))

【讨论】:

以上是关于Python3'ascii'编解码器无法编码字符的主要内容,如果未能解决你的问题,请参考以下文章

“UnicodeEncodeError:‘ascii’编解码器无法编码字符”

编码给出“'ascii'编解码器无法编码字符......序数不在范围内(128)”

UnicodeEncodeError:“ascii”编解码器无法编码字符

UnicodeEncodeError: 'ascii' 编解码器无法编码字符 u'\u2026'

UnicodeEncodeError: 'ascii' 编解码器无法编码字符 u'\u2013'

UnicodeEncodeError:'ascii'编解码器无法对特殊名称的字符进行编码[重复]