gpt4 book ai didi

Python:比较带有重音字符的字符串不起作用

转载 作者:太空宇宙 更新时间:2023-11-04 08:09:30 24 4
gpt4 key购买 nike

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

我找到了关于如何在 unicode 中比较字符串和特殊字符的帖子: Python String Comparison--Problems With Special/Unicode Characters这与我的问题非常相似。我做了更多关于编码以及如何更改字符串编码的阅读。但是,我尝试了在编解码器文档中可以找到的所有编解码器: https://docs.python.org/2/library/codecs.html对于所有可能的编解码器对,两个字符串都不相等(请参阅下面的程序 - 尝试了解码和编码选项)。

当我一个一个地检查两个字符串中的字符时,带重音符号的 e 在一个文件中显示为带重音符号的 e(一个字符),在另一个文件中显示为两个字符(e 和 printable-as-space)。

如有任何想法,我们将不胜感激。

我将两个文本文件缩小为一行一个单词(显然带有重音)。我将文本文件上传到保管箱:testfilesindatatestmissingfiles (但还没有尝试从保管箱下载新副本)。

非常感谢!

附言。抱歉弄乱了链接。我没有声望 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

最佳答案

使用 unicodedata.normalize 将 to 字符串规范化为相同的范式:

import unicodedata

encoded1 = unicodedata.normalize('NFC', word1.decode('utf8'))
encoded2 = unicodedata.normalize('NFC', word2.decode('utf8'))

关于Python:比较带有重音字符的字符串不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25291474/

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