无法读取 python 中包含非 ASCII 字符的字符串 3
Trouble reading string with non-ascii characters in python 3
我正在尝试从 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'
。输出为 False.
这里有什么问题?
两个字符串不一样。看:
> 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()
时,您甚至可以看到差异。在您的示例中,一个版本的长度为 53
,而另一个版本的长度为 52
您似乎可以使用 unicodedata.normalize()
和 NFC
、NFKC
、NFD
、NFKD
选项之一将一个名称转换为另一个名称。所以你必须测试哪一个适合你。
在一个方向上您可能需要 NFC
或 NFKC
,在另一个方向上您可能需要 NFD
或 NFKD
。
您也可以使用 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
我正在尝试从 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'
。输出为 False.
这里有什么问题?
两个字符串不一样。看:
> 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()
时,您甚至可以看到差异。在您的示例中,一个版本的长度为 53
,而另一个版本的长度为 52
您似乎可以使用 unicodedata.normalize()
和 NFC
、NFKC
、NFD
、NFKD
选项之一将一个名称转换为另一个名称。所以你必须测试哪一个适合你。
在一个方向上您可能需要 NFC
或 NFKC
,在另一个方向上您可能需要 NFD
或 NFKD
。
您也可以使用 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