gpt4 book ai didi

python - 加入文件名时出现 UnicodeEncodeError

转载 作者:太空狗 更新时间:2023-10-29 20:43:02 25 4
gpt4 key购买 nike

它在执行以下代码时抛出“UnicodeDecodeError:‘ascii’编解码器无法解码位置 2 中的字节 0xc2:序号不在范围内(128)”:

filename = 'Spywaj.ttf'
print repr(filename)
>> 'Sp\xc2\x88ywaj.ttf'
filepath = os.path.join('/dirname', filename)

但是文件是有效的并且存在于磁盘上。文件名是从“unzip -l”命令中提取的。如何加入这样的文件名?

操作系统和文件系统

Filesystem: ext3    relatime,errors=remount-ro 0       0
Locale: en_US.UTF-8

Alex 的建议 os.path.join 现在有效,但我仍然无法使用它加入的文件名访问磁盘上的文件。

filename = filename.decode('utf-8')
filepath = os.path.join('/dirname', filename)
print filepath
>> /dirname/u'Sp\xc2\x88ywaj.ttf'
print os.path.isfile(filepath)
>> False

new_filepath = filepath.encode('Latin-1').encode('utf-8')
print new_filepath
>> /dirname/u'Sp\xc2\x88ywaj.ttf'
print type(filepath)
>> <type 'unicode'>
print os.path.isfile(new_filepath)
>> False

valid_filepath = glob.glob('/dirname/*.ttf')[0]
print valid_filepath
>> /dirname/Spywaj.ttf (SO cannot display the chars in filename)
print type(valid_filepath)
>> <type 'str'>
print os.path.isfile(valid_filepath)
>> True

最佳答案

在 Latin-1 (ISO-8859-1) 和 Windows-1252 中,0xc2 都是带有抑扬音符的大写字母 A……您显示的代码中似乎没有任何位置!你能加一个吗

print repr(filename)

os.path.join 调用之前(并将 '/dirname' 放入变量中并打印其 repr 以确保完整性?)。我在想,也许那个杂散的角色存在,但由于某种原因您没有看到它——repr 会揭示它。

如果您的文件名中确实有 Latin-1(或 Win-1252)非 Ascii 字符,则必须使用 Unicode——和/或根据您的操作系统和文件系统,使用一些特定的编码。

编辑:感谢 repr,OP 确认实际上有 两个 字节不可能是 ASCII -- 0xc2然后是 0x88,对应于 OP 认为的是一个小写的 L。好吧,该序列将是一个 Unicode 大写字母 A 和插入符号(代码点 0x88),采用非常流行的 UTF-8 编码 - 对于 OP 乞丐解释,这看起来像一个小写字母 L,但我想 < em>一些字体可能在图形上疯狂到足以承受这样的困惑。

所以我会首先尝试 filename = filename.decode('utf-8') - 这应该允许 os.path.join 工作。如果 open 然后对生成的 Unicode 字符串犹豫不决(它可能有效,具体取决于文件系统和操作系统),下一次尝试是尝试使用该 Unicode 对象的 .encode('Latin-1') .encode('utf-8')。如果所有编码都不起作用,关于正在使用的操作系统和文件系统的信息(我相信 OP 尚未提供)将变得至关重要。

关于python - 加入文件名时出现 UnicodeEncodeError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2004137/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com