我希望从大型文档中将所有高unicode字符(例如重音E,左和右引号等)替换为低范围内的“普通”对等字符,例如常规的“
E”和直引号。我需要经常在非常大的文档上执行此操作。我在以下地方可能看到了perl的示例:http
:
//www.designmeme.com/mtplugins/lowdown.txt
在Python中有没有使用s.replace(…)。replace(…)。replace(…)…的快速方法?我已经尝试过用几个字符替换它,并且文档剥离变得非常缓慢。
编辑,我的unutbu代码版本似乎无效:
# -*- coding: iso-8859-15 -*-
import unidecode
def ascii_map():
data={}
for num in range(256):
h=num
filename='x{num:02x}'.format(num=num)
try:
mod = __import__('unidecode.'+filename,
fromlist=True)
except ImportError:
pass
else:
for l,val in enumerate(mod.data):
i=h<<8
i+=l
if i >= 0x80:
data[i]=unicode(val)
return data
if __name__=='__main__':
s = u'“fancy“fancy2'
print(s.translate(ascii_map()))
import unicodedata
def shoehorn_unicode_into_ascii(s):
return unicodedata.normalize('NFKD', s).encode('ascii','ignore')
if __name__=='__main__':
s = u"éèêàùçÇ"
print(shoehorn_unicode_into_ascii(s))
# eeeaucC
请注意,正如@Mark
Tolonen所指出的那样,上述方法删除了一些字符,例如ß’‘”。如果上面的代码截断了您希望翻译的字符,那么您可能必须使用字符串的translate
方法来手动解决这些问题。另一种选择是使用unidecode。
当您有一个较大的unicode字符串时,使用其translate
方法将比使用该replace
方法快得多。
编辑: unidecode
Unicode代码点到ASCII有更完整的映射。但是,unidecode.unidecode
循环遍历字符串(在Python循环中),这比使用该translate
方法要慢。
以下辅助函数使用unidecode
的数据文件和translate
方法来提高速度,尤其是对于长字符串。
在我对1-6 MB文本文件的测试中,使用ascii_map
速度大约是的4-6倍unidecode.unidecode
。
# -*- coding: utf-8 -*-
import unidecode
def ascii_map():
data={}
for num in range(256):
h=num
filename='x{num:02x}'.format(num=num)
try:
mod = __import__('unidecode.'+filename,
fromlist=True)
except ImportError:
pass
else:
for l,val in enumerate(mod.data):
i=h<<8
i+=l
if i >= 0x80:
data[i]=unicode(val)
return data
if __name__=='__main__':
s = u"éèêàùçÇ"
print(s.translate(ascii_map()))
# eeeaucC
Edit2:大黄,如果# -*- encoding: utf-8 -*-
引起SyntaxError,请尝试 # -*- encoding: cp1252 -*-
。声明哪种编码取决于文本编辑器用于保存文件的编码。Linux倾向于使用utf-8,而Windows倾向于使用cp1252。
问题内容: 我目前正在根据Python Cookbook的12.5章运行以下代码: 我正在使用大小约为1 GB的XML文档。有谁知道解析这些的更快方法? 问题答案: 我看起来好像您不需要程序中的任何DOM功能。我将第二次使用(c)ElementTree库。如果使用cElementTree模块的iterparse函数,则可以遍历xml并在事件发生时对其进行处理。 但是请注意,Fredriks关于使用
我有一个作为字符串传入的句子,我正在对单词“and”进行替换,我想用“”替换它。它并没有用空白代替“和”。下面是我的逻辑示例。当我调试这个的时候,逻辑就落在句子里了。代替 这里有我遗漏的东西吗。
问题内容: 我需要替换一些字符,如下所示:,… 我编码如下,但是我想应该有一些更好的方法。有什么提示吗? 问题答案: 替换两个字符 我给当前答案中的所有方法加上了一个额外的时间。 使用输入字符串并替换和,最快的方法是将替换链接在一起,如下所示:。 每个功能的时间: a)1000000次循环,每个循环最好为3:1.47 s b)1000000个循环,每个循环的最佳时间为3:1.51μs c)1000
问题内容: 这是我从文本文件中读取的一行: 我使用readline()以字符串形式读取它。现在,将其转换回数组的最快方法是什么? 谢谢! 问题答案: 我不确定这是最快的,但绝对是最安全/最简单的: 常规也可以工作: 我的机器的一些基本计时: 因此,根据我的计算机,速度比快50%。但是,这绝对是不安全的,除非您完全信任它,否则切勿在任何字符串上使用它。除非这是一个真正的演示瓶颈,并且您100%相信输
问题内容: 我在Python中有一个Unicode字符串,我想删除所有的重音符号(变音符号)。 我在网上发现了一种用Java实现此目的的优雅方法: 将Unicode字符串转换为长规范化格式(带有单独的字母和变音符号) 删除所有Unicode类型为“变音符号”的字符。 我是否需要安装pyICU之类的库,还是仅使用python标准库就可以?那python 3呢? 重要说明:我想避免使用带有重音符号到非
由于是16位,我猜这里的“Unicode”是指UTF-16,但我一点也不确定。 更新:我注意到UTF-16的维基页面上说“Unicode”是我们现在所知道的UCS-2的旧术语。然而,它也说Java现在使用UTF-16。因此,我仍然怀疑JNI文档中的“Unicode”是指标准的UTF-16,但我通常不使用JNI甚至Java,所以我希望有人觉得权威来插话。