在python 3中读取带有非ASCI字符的字符串时出现问题

2024-10-02 02:30:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试从WikiArt数据集中读取图像。但是,我无法加载某些包含非ascii字符的图像: 例如: fã©lix-del-marle_nu-agenouill-sur-fond-bleu-1937.jpg' 尽管该文件存在于目录中。 我还比较了os.listdir()FileNotFoundError: No such file: '/wiki_art_paintings/rescaled_600px_max_side/Expressionism/fã©lix-del-marle_nu-agenouill-sur-fond-bleu-1937.jpg'的输出字符串名称 通过做 'fã©lix-del-marle_nu-agenouill-sur-fond-bleu-1937.jpg' == 'fã©lix-del-marle_nu-agenouill-sur-fond-bleu-1937.jpg'。输出为假

这里有什么问题


Tags: 文件数据图像ascii字符nujpgdel
2条回答

这两个字符串不一样。看:

> ciao='fã©lix-del-marle_nu-agenouill-sur-fond-bleu-1937.jpg'.encode('utf-8')       
> bye='fã©lix-del-marle_nu-agenouill-sur-fond-bleu-1937.jpg'.encode('utf-8')        
> ciao.hex() 
 '6661cc83c2a96c69782d64656c2d6d61726c655f6e752d6167656e6f75696c6c2d7375722d666f6e642d626c65752d313933372e6a7067'
> bye.hex()  
 '66c3a3c2a96c69782d64656c2d6d61726c655f6e752d6167656e6f75696c6c2d7375722d666f6e642d626c65752d313933372e6a7067'
> ciao2='fa'.encode('utf-8')
> bye2='f'.encode('utf-8')
> ciao2.hex()
 '6661'
> bye2.hex() 
 '66'

似乎在“f”的周围有一个隐藏的字符。这似乎是个“a”

问题是因为在Unicode中,您可以使用单个字符或创建一些字符作为其他两个字符的组合,并且这两种情况在两个不同的位置。在一个位置,您将一些字符作为单个字符(使用单个代码),在另一个位置,您将字符作为其他两个字符(使用两个代码)的组合。当对两个字符串使用len()时,您甚至可以看到差异。在您的示例中,一个版本有lenght53,另一个版本有52

似乎您可以使用带有选项NFCNFKCNFDNFKD之一的unicodedata.normalize()将一个名称转换为另一个名称。所以你必须测试哪一个适合你

在一个方向上,您可能需要NFCNFKC,在另一个方向上,您可能需要NFDNFKD

您还可以使用unidecode创建没有本机字符的文本:fa(c)lix-del-marle_nu-agenouill-sur-fond-bleu-1937.jpg,但这可能对您没有多大用处

import unicodedata
from unidecode import unidecode

a = 'fã©lix-del-marle_nu-agenouill-sur-fond-bleu-1937.jpg'
b = 'fã©lix-del-marle_nu-agenouill-sur-fond-bleu-1937.jpg'

print('a:', a)
print('b:', b)

print(' - len  -')
print('len(a):', len(a))
print('len(b):', len(b))

print(' - encode  -')
print('a.encode:', a.encode('utf-8'))
print('b.encode:', b.encode('utf-8'))

print(' - a == normalize(b)  -')
print('NFC: ', a == unicodedata.normalize('NFC', b) )
print('NFKC:', a == unicodedata.normalize('NFKC', b) )
print('NFD: ', a == unicodedata.normalize('NFD', b) )
print('NFKD:', a == unicodedata.normalize('NFKD', b) )

print(' - b == normalize(a)  -')
print('NFC: ', b == unicodedata.normalize('NFC', a) )
print('NFKC:', b == unicodedata.normalize('NFKC', a) )
print('NFD: ', b == unicodedata.normalize('NFD', a) )
print('NFKD:', b == unicodedata.normalize('NFKD', a) )

print(' - unidecode  -')
print('a:', unidecode(a))
print('b:', unidecode(b))

结果:

a: fã©lix-del-marle_nu-agenouill-sur-fond-bleu-1937.jpg
b: fã©lix-del-marle_nu-agenouill-sur-fond-bleu-1937.jpg
 - len  -
len(a): 53
len(b): 52
 - encode  -
a.encode: b'fa\xcc\x83\xc2\xa9lix-del-marle_nu-agenouill-sur-fond-bleu-1937.jpg'
b.encode: b'f\xc3\xa3\xc2\xa9lix-del-marle_nu-agenouill-sur-fond-bleu-1937.jpg'
 - a == normalize(b)  -
NFC:  False
NFKC: False
NFD:  True
NFKD: True
 - b == normalize(a)  -
NFC:  True
NFKC: True
NFD:  False
NFKD: False
 - unidecode  -
a: fa(c)lix-del-marle_nu-agenouill-sur-fond-bleu-1937.jpg
b: fa(c)lix-del-marle_nu-agenouill-sur-fond-bleu-1937.jpg

只有当我必须将MacOS文件传输到其他系统时,我才会遇到其他两个字符的组合


文件:unicodedata

Python街:Unicode

堆栈溢出:Normalizing Unicode

相关问题 更多 >

    热门问题