Python:比较字符串与重音字符不起作用

2024-05-03

我对 python 很陌生。我正在尝试从另一个列表中删除一个列表中出现的文件。这些列表是通过在 mac 和 windows 上重定向 ll -R 生成的(但自从使用其他 python 脚本进行了一些处理 - 合并、排序等)。 某些文件名带有重音符号和特殊符号。这些字符串即使相同(打印相同并且在包含列表的文件中看起来相同),也被发现不相等。

我找到了关于如何比较字符串与 unicode 中特殊字符的线程:Python 字符串比较——特殊/Unicode 字符的问题 https://stackoverflow.com/questions/5228925/python-string-comparison-problems-with-special-unicode-characters这和我的问题非常相似。我对编码以及如何更改字符串的编码进行了更多阅读。 但是,我尝试了在编解码器文档中可以找到的所有编解码器:https://docs.python.org/2/library/codecs.html https://docs.python.org/2/library/codecs.html对于所有可能的编解码器对,两个字符串不相等(请参见下面的程序 - 尝试了解码和编码选项)。

当我逐一检查两个字符串中的字符时,重音 e 在一个文件中显示为重音 e(一个字符),在另一个文件中显示为两个字符(e 和可打印为空格)。

任何想法,将不胜感激。

我将两个文本文件缩小为一行,每行一个字(显然带有重音)。 我将文本文件上传到保管箱:数据中的测试文件 https://www.dropbox.com/s/94qlr93blkj15l6/testfilesindata and 测试缺失文件 https://www.dropbox.com/s/o37p5uibvexkesf/testmissingfiles(但尚未尝试从保管箱下载新副本)。

非常感谢!

附言。 抱歉弄乱了链接。我没有声誉10...

#!/usr/bin/python3

import sys

codecs = [ 'ascii', 'big5', 'big5hkscs', 'cp037', 'cp424', 'cp437', 'cp500', 'cp720      ', 'cp737   ', 'cp775', 'cp850', 'cp852', 'cp855', 'cp856   ', 'cp857', 'cp858', 'cp860', 'cp861', 'cp862', 'cp863', 'cp864', 'cp865', 'cp866', 'cp869', 'cp874     ', 'cp875   ', 'cp932', 'cp949', 'cp950', 'cp1006   ', 'cp1026', 'cp1140', 'cp1250', 'cp1251', 'cp1252', 'cp1253', 'cp1254', 'cp1255', 'cp1256', 'cp1257', 'cp1258', 'euc_jp', 'euc_jis_2004', 'euc_jisx0213', 'euc_kr', 'gb2312', 'gbk', 'gb18030', 'hz', 'iso2022_jp', 'iso2022_jp_1', 'iso2022_jp_2', 'iso2022_jp_2004', 'iso2022_jp_3', 'iso2022_jp_ext', 'iso2022_kr', 'latin_1', 'iso8859_2', 'iso8859_3', 'iso8859_4', 'iso8859_5', 'iso8859_6', 'iso8859_7', 'iso8859_8', 'iso8859_9', 'iso8859_10', 'iso8859_13', 'iso8859_14', 'iso8859_15', 'iso8859_16', 'johab', 'koi8_r   ', 'koi8_u      ', 'mac_cyrillic', 'mac_greek', 'mac_iceland', 'mac_latin2', 'mac_roman', 'mac_turkish', 'ptcp154', 'shift_jis', 'shift_jis_2004', 'shift_jisx0213', 'utf_32', 'utf_32_be', 'utf_32_le', 'utf_16', 'utf_16_be', 'utf_16_le', 'utf_7', 'utf_8', 'utf_8_sig' ]

file1 = open('testmissingfiles','r')
file2 = open('testfilesindata','r')

list1 = file1.readlines()
list2 = file2.readlines()

word1 = list1[0].rstrip('\n')
word2 = list2[0].rstrip('\n')

for i in range(0,len(codecs)-1):
    for j in range(0,len(codecs)-1):
        try:
            encoded1 = word1.decode(codecs[i])
            encoded2 = word2.decode(codecs[j])

            if encoded1 == encoded2:
                sys.stdout.write('Succeeded with ' + codecs[i] + ' & ' + codecs[j] + '\n')
        except:
            pass

Use unicodedata.normalize将 to 字符串标准化为相同的范式:

import unicodedata

encoded1 = unicodedata.normalize('NFC', word1.decode('utf8'))
encoded2 = unicodedata.normalize('NFC', word2.decode('utf8'))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python:比较字符串与重音字符不起作用 的相关文章

随机推荐