import unicodedata, re, io
all_chars = (unichr(i) for i in xrange(0x110000))
control_chars = ''.join(c for c in all_chars if unicodedata.category(c)[0] == 'C')
cc_re = re.compile('[%s]' % re.escape(control_chars))
def rm_control_chars(s): # see http://www.unicode.org/reports/tr44/#General_Category_Values
return cc_re.sub('', s)
cleanfile = []
with io.open('filename.txt', 'r', encoding='utf8') as fin:
for line in fin:
line =rm_control_chars(line)
cleanfile.append(line)
我希望保留文件中的换行符。
下面记录了使用 cc_re.sub('', s)
替换前几行所花费的时间(第一列是时间,第二列是 len(s)
):
0.275146961212 251
0.672796010971 614
0.178567171097 163
0.200030088425 180
0.236430883408 215
0.343492984772 313
0.317672967911 290
0.160616159439 142
0.0732028484344 65
0.533437013626 468
0.260229110718 236
0.231380939484 204
0.197766065598 181
0.283867120743 258
0.229172945023 208
如@ashwinichaudhary所建议的,使用s.translate(dict.fromkeys(control_chars))
,同时记录所花费的时间,输出结果如下:
0.464188098907 252
0.366552114487 615
0.407374858856 164
0.322507858276 181
0.35142993927 216
0.319973945618 314
0.324357032776 291
0.371646165848 143
0.354818105698 66
0.351796150208 469
0.388131856918 237
0.374715805054 205
0.363368988037 182
0.425950050354 259
0.382766962051 209
但是我的1GB文本代码运行得非常慢。是否有其他方法来清除可控制的字符?
re.sub
是瓶颈。 - alvasreplace
吗?正则表达式适用于复杂的模式,但我怀疑对于这个问题来说,replace 更有效率。另外,我建议你找到一种方法将原始的 1GB 文本分成几个部分——这应该会大大改善算法。 - jcoppensstr.translate
函数。 - Ashwini Chaudharyunicode.translate
,可以这样做:s.translate(dict.fromkeys(control_chars))
- Ashwini Chaudhary