【发布时间】:2015-07-22 01:43:54
【问题描述】:
Previously,我一直在使用下面的code snippet 清理数据
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是一个瓶颈 -
您是否尝试过不使用正则表达式,而只是使用标准的
replace? REs 适用于复杂的模式,但我怀疑 replace 对此更有效。此外,我会尝试找到一种方法将您的原始 1GB 文本分成多个部分 - 这也应该会改进算法 很多。 -
你应该试试
str.translate。 -
@alvas 对于
unicode.translate,应该这样做:s.translate(dict.fromkeys(control_chars))
标签: python regex unicode io control-characters