删除奇怪的ANSI字符并使用Python

时间:2015-05-17 11:03:46

标签: python encoding utf-8 ansi

我使用Twitter API下载了一堆西班牙语推文,但其中一些推文中有一些我不想要的奇怪的ANSI字符。我有大约18000个文件,我想删除这些字符。我将所有文件编码为UTF-8。 例如:

b'Me quedo con una frase de nuestra reuni\xc3\xb3n de hoy.'

如果他们是重音字符(我们有很多西班牙语)我想删除重音字母并将其替换为非重音字母。那是因为在那之后我正在做一些文本挖掘分析,我想统一这些词,因为可能有人不使用重音。 我认为b意味着处于字节模式。

如果我在python中放入以下内容,那么

print(u'Me quedo con una frase de nuestra reuni\xc3\xb3n de hoy con @Colegas')

我在终端上得到了这个:

Me quedo con una frase de nuestra reunión de hoy con @Colegas

我不喜欢,因为它不是西班牙语中使用过的口音。应该有角色ó。我不明白为什么也不是正确的。 我也希望文件开头的b消失。 要对文件进行编码,我使用了以下内容:

f.write(str(FILE.encode('utf-8','strict')))

我从UTF-8中的一些json创建我的文件,其中包含每个推文的很多键。也许我应该改变它,或者我在那里做错了。

在某些情况下,尝试获取python终端中的字符时也存在问题。例如:

print(u'\uD83D\uDC1F')

我认为那是因为python不能代表那些字符(上例中的 )。是这样吗?我也想删除它们。

很抱歉,如果有一些英语错误,请随时询问是否有不明确的事情。

提前致谢。

编辑:我正在使用Python 3.4

3 个答案:

答案 0 :(得分:1)

你正在搅拌苹果和橘子。 b'reuni\xc3\xb3n'u'reuni\u00f3n'的UTF-8编码,当然是人类可读格式的reunión

>>> print b'reuni\xc3\xb3n'.decode('utf-8')
reunión
>>> repr(b'reuni\xc3\xb3n'.decode('utf-8'))
"u'reuni\\xf3n'"

这里没有“ANSI”(无论如何它都是用词不当;通常它用于指代Windows字符编码,但不一定是你期望的那种)。

至于如何从重音字符中删除重音,短版本是规范化为Unicode“NFD”表示,然后丢弃任何具有“变音符号”分类的代码点。这包括例如在What is the best way to remove accents in a Python unicode string?;为了使这个答案自成一体,这里是这个问题的一个答案的要点 - 但是要阅读所有这些答案,如果只是为了决定最适合你的用例。

import unicodedata
stripped = u"".join([c for c in unicodedata.normalize('NFKD', input_str)
    if not unicodedata.combining(c)])

答案 1 :(得分:1)

在Python 3中处理传入文本的模式之一(以bytes的形式)是在收到时立即解码它们。

所以你从twitter获得;

In [1]: tweetbytes = b'Me quedo con una frase de nuestra reuni\xc3\xb3n de hoy.'

你做;

In [2]: tweet = tweetbytes.decode('utf-8')

记住首字母缩略词BADTIE;字节被解码,文本被编码。

现在是文字;

In [3]: type(tweet)
Out[3]: str

你可以这样使用它;

In [4]: print(tweet)
Me quedo con una frase de nuestra reunión de hoy.

答案 2 :(得分:-2)

首先:您需要100%确定这些字符在twitter中编码的语言。如果您确定它是ANSI(通常是西班牙语编码语言将是Latin-1),那么您从twitter获得的所有内容都需要使用此功能

struct stekas *top = NULL;
<。> .encode('ANSI')将告诉python您从外部获取的所有内容都是用ANSI编写的,他应该用Unicode转换它。

然后,每当你想在你的程序的任何部分重新使用myStr时(特别是如果你想在某个地方写它),你必须使用decode函数。在你的情况下将是:

a = getStufFromTwitter() #you parse twitter 
myStr = a.encode('Latin-1') 

这应该有效。但是,如果我们能够看到很多代码,那么帮助您会更容易。你在Python中有一些非常恶劣的规范(你使用的是Python 2.7吗?如果是的话,请在每个脚本的开头添加以下内容:

with open('myfile.txt','w') as f:
    f.write(myStr.decode('UTF-8'))

再一次,它是python的一个非常棘手的部分。