[英]How to simulate python 2 str.lower() in python 3
python 2.7.15和3.7.2如何執行小寫操作之間似乎有區別。
我有一個大字典和一個大型列表,使用python 2編寫,但我想在python 3中使用(使用pickle從文件導入)。 對於字符串列表中的每個項目,在python2 lower()
情況的dict中有一個鍵。 不幸的是,它們與python3 lower()
案例不同。
在python 3中運行時,如何得到python 2返回unicode.lower()
的答案?
python 3列表中的一個字符串示例是'İle'
,其小寫字母是'i̇le'
(順便'i̇le'
,它不是'i̇le'
'ile'
)。 這不在字典中。 從泡菜,什么巨蟒-3作為讀"İle"
作為被讀入蟒2 u'\İle'
,小寫其中是"ile"
(在ASCII字符串),這是在字典。 這就是我需要回歸的東西。
為了澄清,我正在添加一個例子(后者是ascii字符串)。
python 2.7:
>>> u"\u0130le".lower() == "ile"
>>> True
python 3.7:
>>> u"\u0130le".lower() == "ile"
>>> False
您可以使用Unidecode庫。
這個庫將unicode轉換為它最接近的ASCII等價物,這似乎是你想要的。
>>> from unidecode import unidecode
>>> unidecode(u'\u0130le'.lower()) == 'ile'
True
編輯:正如user2357112所指出的,這與Python 2.7的unicode.lower()不匹配。 Python 2.7使用C庫函數towlower
,因此為了與該函數完全匹配,您需要使用一些C接口(例如Python 2.7本身,如mkiever的答案)。 但是,如果您不需要保留任何非ascii符號,則應該可以使用。
蠻力解決方案。
在Python2中創建一個較低的映射,然后在Python3中使用它。
Python2程序創建地圖:
f = open('py2_lower_map', 'w')
for i in range(256):
for j in range(256):
b = chr(j) + chr(i)
try:
low = b.decode('utf16').lower()
except:
low = str('?')
f.write(low.encode('utf-8'))
f.close()
演示如何在Python3中使用地圖:
f = open('py2_lower_map', 'r', encoding='utf-8')
_py2_lower_map = f.read()
f.close()
def py2_lower(u):
return ''.join(_py2_lower_map[ord(c)] for c in u)
low = py2_lower('İle')
print(low)
print([ord(c) for c in low])
說實話,這可能有粗糙的角落,快速而骯臟,但主要做正確的事情。 它適用於一個例子;-)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.