我的脚本是从csv文件中读取数据,csv文件可以有多个字符串的英文或非英语单词。
当文本文件有垃圾字符串时,我想识别这些字符串,跳过这些字符串并处理其他字符串。
doc = codecs.open(input_text_file, "rb",'utf_8_sig')
fob = csv.DictReader(doc)
for row, entry in enumerate(f):
if is_valid_unicode_str(row['Name']):
process_futher
def is_valid_unicode_str(value):
try:
function
return True
except UnicodeEncodeError:
return falsecsv投入:
"Name"
"袋è¢âdcx€¹Ã¤Â¸Å½Ã¦Å“‹å‹们çâ€ÂµÃ¥ÂÂå•â€"
"元大寶來證券"
"John Dove"我想要破坏函数is_valid_unicode_str(),它将标识垃圾字符串并只处理有效的字符串。
我试着使用decode is,但是在解码垃圾字符串时它没有失败。
value.decode('utf8')预期输出为字符串,将处理中文和英文字符串。
请您指导我如何实现过滤有效Unicode文件的功能?
发布于 2015-03-16 09:51:46
您有Mojibake弦;文本编码为一个(正确)编解码器,然后解码为另一个。
在本例中,您的文本被Windows 1252代码页解码;文本中的U+20AC欧元符号是典型的CP1252 Mojibake。最初的编码可以是中国编码家族之一,也可以是UTF-8 - CP1252 Mojibake的多次往返.哪一个我无法确定,我不能读中文,也没有你的完整数据;CP1252 Mojibake包含一些不可打印的字符,比如0x81和0x8D字节,当你在这里发布问题时可能会丢失这些字符。
我会安装项目;它不会修复GB*编码(I 请求项目增加支持),但它包含一个名为sloppy-windows-1252的新编解码器,它将允许您用该编解码器逆转错误解码:
>>> import ftfy # registers extra codecs on import
>>> text = u'袋è¢âdcx€¹Ã¤Â¸Å½Ã¦Å“‹å‹们çâ€ÂµÃ¥ÂÂå•â€'
>>> print text.encode('sloppy-windows-1252').decode('gb2312', 'replace')
猫垄�姑�⑩dcx�盲赂沤忙��姑ヂ�姑ぢ宦�р�得ヂ�氓�⑩�
>>> print text.encode('sloppy-windows-1252').decode('gbk', 'replace')
猫垄鈥姑�⑩dcx�盲赂沤忙艙鈥姑ヂ鈥姑ぢ宦�р�得ヂ�氓鈥⑩�
>>> print text.encode('sloppy-windows-1252').decode('gb18030', 'replace')
猫垄鈥姑⑩dcx�盲赂沤忙艙鈥姑ヂ鈥姑ぢ宦р�得ヂ氓鈥⑩�
>>> print text.encode('sloppy-windows-1252').decode('utf8', 'ignore').encode('sloppy-windows-1252').decode('utf8', 'replace')
袋�dcx与朋�们���U+FFFD替换字符显示解码并不完全成功,但这可能是因为您在这里复制的字符串丢失了任何不可打印的内容,或者使用了0x81或0x8D字节。
您可以尝试以这种方式修复您的数据;从文件数据中,在编码到sloppy-windows-1252之后,尝试解码到一个GB*编解码器,或者从UTF-8往返两次,看看哪些最适合。
如果这还不够好(不能修复数据),可以使用函数来检测问题:
>>> from ftfy.badness import sequence_weirdness
>>> sequence_weirdness(text)
9
>>> sequence_weirdness(u'元大寶來證券')
0
>>> sequence_weirdness(u'John Dove')
0莫吉贝克在序列怪异度上得分较高。您可以尝试为您的数据找到一个合适的阈值,在此之前,您将调用最有可能被损坏的数据。
然而,我认为我们可以使用一个非零的返回值作为另一个测试的起点。英语文本在这个尺度上应该是0,中文文本也应该是0。与英语混在一起的中文仍然可以得分超过0,但您不能将该中文文本编码到CP-1252编解码器中,而您可以使用破译的文本:
from ftfy.badness import sequence_weirdness
def is_valid_unicode_str(text):
if not sequence_weirdness(text):
# nothing weird, should be okay
return True
try:
text.encode('sloppy-windows-1252')
except UnicodeEncodeError:
# Not CP-1252 encodable, probably fine
return True
else:
# Encodable as CP-1252, Mojibake alert level high
return False发布于 2015-03-16 20:53:35
(ftfy developer这里)
我发现这篇文章很可能是“袋袋与朋友们电子商”。我不得不猜测字符友,子和商,因为一些不可打印的字符是您问题中字符串中缺少的字符。在猜测的时候,我从少数可能性中选出了最常见的角色。我不知道"dcx“到哪里去了,也不知道它为什么会在那里。
谷歌翻译在这里不是很有帮助,但它似乎意味着一些关于电子商务。
下面是你短信中发生的所有事情:
如果只发生了第一个问题,ftfy.fix_text_encoding就能够解决它。当您试图将字符串放到堆栈溢出时,可能会发生剩余的问题。
下面是我的建议:
ftfy.fix_text_encoding。https://stackoverflow.com/questions/29071995
复制相似问题