Python删除csv中的非拉丁文本行

Python删除csv中的非拉丁文本行,python,csv,unicode,Python,Csv,Unicode,我有一个csv文件,其中包含字符串形式的文本。 例如,某些文本行是中文或俄文 我想做的是使用Python计算文本行中unicode和ASCII字符的数量。 如果ASCII与Unicode字符的比率超过90%,我希望保留该行,如果不保留,则将其从csv中删除 这背后的想法是删除所有非拉丁语言,但保留例如德语Umlauts,为此我想使用具有比率的解决方案 有人有办法解决这个问题吗 多谢各位 以下是我的csv数据的一些示例: She wants to ride my BMW the go for a

我有一个csv文件,其中包含字符串形式的文本。 例如,某些文本行是中文或俄文

我想做的是使用Python计算文本行中unicode和ASCII字符的数量。 如果ASCII与Unicode字符的比率超过90%,我希望保留该行,如果不保留,则将其从csv中删除

这背后的想法是删除所有非拉丁语言,但保留例如德语Umlauts,为此我想使用具有比率的解决方案

有人有办法解决这个问题吗

多谢各位

以下是我的csv数据的一些示例:

She wants to ride my BMW the go for a ride in my BMW lol http://t.co/FeoNg48AQZ
RT @YuaElena: Бабушка лаÑково говорит 5-летнему Тёмочке: - Смотри, Темик, вон едет "би-би". - Бог Ñ Ñ‚Ð¾Ð±Ð¾Ð¹, бабка, Ñто-ж BMW 335xi 4x4.

因此,您应该知道我的数据是什么样子的。

拉丁语范围以
\u00ff
结尾,因此您所要做的就是使用regexp删除范围
\u0100-\uffff
中的字符,然后将新行长度与原始行长度进行比较


也就是说,使用
re.sub(r'[\u0100-\uffff]',“?”,line)
保留该行并用
替换所有不需要的字符可能更有用。您最好的选择可能是使用该模块。该解决方案有点资源密集,因为它将检查字符串中每个字符的unicode名称

import unicodedata
def compute_ratio(input_str):
    '''
    This function will return the ratio between the number of latin letter and other letters.
    '''
    num_latin = 0
    input_str = "".join(input_str.split()) # Remove whitespaces.
    for char in input_str:
        try:
            if unicodedata.name(unicode(char))[:5] == "LATIN":
                num_latin += 1
            #end if
        except UnicodeDecodeError:
            pass
        #end try
    #end for
    return (num_latin*1.0)/len(input_str)
下面是一个输入数据的使用示例。保存的_输出是包含所有有效行的数组

>>> lines = '''She wants to ride my BMW the go for a ride in my BMW lol http://t.co/FeoNg48AQZ
RT @YuaElena: Бабушка лаÑково говорит 5-летнему Тёмочке: - Смотри, Темик, вон едет "би-би". - Бог Ñ Ñ‚Ð¾Ð±Ð¾Ð¹, бабка, Ñто-ж BMW 335xi 4x4.'''
>>> saved_Output = []
>>> for line in lines.split('\n'):
        if compute_ratio(line) > 0.95:
            saved_Output.append(line)
        #end if
#end for

>>> "\n".join(saved_Output)
''
>>> compute_ratio('She wants to ride my BMW the go for a ride in my BMW lol http://t.co/FeoNg48AQZ')
0.890625
>>> # A ratio of 0.95 seems too high even for your first line.
>>> compute_ratio('this is a long string')
0.8095238095238095
>>> compute_ratio(u"c'est une longue cha\xeene")
0.8260869565217391

据我所知,整个文件是以某种方式编码的,它不是用ascii或unicode编码的单个字符,您必须定义要接受的字符/字符范围并对其进行计数。您有CSV文件的示例吗?@ameer,我认为他想区分字符串中的哪些字符也是ASCII表的一部分,哪些不是。严格地说,你是对的。嘿,你的例子很有效,但是当我尝试我发布的第二个例子时,我得到了以下错误“ValueError:没有这样的名字”。我如何读取csv,让你的代码工作,如果超过95%,删除一行?我根据你的最新更新定制了我的答案。该函数现在还删除了空格。请注意,您的第一个输入字符串包含五个非拉丁字符(:/。/),但该字符串只有79个字符长,这解释了为什么95%的比率太高。