当前位置: 首页 > 面试题库 >

使用Python剥离和替换高Unicode字符文档的最快方法是什么?

金昌胤
2023-03-14
问题内容

我希望从大型文档中将所有高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,所以我希望有人觉得权威来插话。