我的脚本是从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 false
csv输入:
"Name"
"袋è¢âdcx€¹Ã¤Â¸Å½Ã¦Å“‹å‹们çâ€ÂµÃ¥ÂÂå•â€"
"元大寶來證券"
"John Dove"
我想玷污函数is_valid_unicode_str(),它将识别垃圾字符串并仅处理有效字符串.
我尝试使用解码但是在解码垃圾字符串时它并没有失败
value.decode('utf8')
The expected output are string with Chinese and English string to be process
你能指导我如何实现过滤有效的Unicode文件的功能?
最佳答案 你有
Mojibake strings;文本编码为一个(正确的)编解码器,然后解码为另一个.
在这种情况下,您的文本使用Windows 1252 codepage解码;文中的U+20AC EURO SIGN是典型的CP1252 Mojibakes.原始编码可以是GB* family of Chinese encodings之一,也可以是多次往返UTF-8-CP1252 Mojibake.哪一个我无法确定,我看不懂中文,也没有你的全部数据; CP1252 Mojibakes包含不可打印的字符,如0x81和0x8D字节,当您在此处发布问题时可能已丢失.
我安装了ftfy
project;它不会修复GB *编码(I requested the project add support),但它包含一个名为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 REPLACEMENT CHARACTER显示解码并不完全成功,但这可能是由于您复制的字符串丢失了任何不可打印或使用0x81或0x8D字节的事实.
您可以尝试以这种方式修复数据;从文件数据中,尝试在编码到sloppy-windows-1252之后解码为GB *编解码器之一,或者从UTF-8往返两次,看看哪种最适合.
如果这还不够好(您无法修复数据),可以使用ftfy.badness.sequence_weirdness()
function尝试检测问题:
>>> from ftfy.badness import sequence_weirdness
>>> sequence_weirdness(text)
9
>>> sequence_weirdness(u'元大寶來證券')
0
>>> sequence_weirdness(u'John Dove')
0
Mojibakes在序列怪异程度上得分很高.您可以尝试为数据找到合适的阈值,以便在您调用最可能已损坏的数据时.
但是,我认为我们可以使用非零返回值作为另一个测试的起点.英文文本应该按该等级评分为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