【发布时间】:2017-11-01 15:56:16
【问题描述】:
我有很大的UTF8 文本文件,其中包含不需要的换行符:并非所有换行符都是坏的,只有其中一些,即那些打破句子的换行符。我想一一浏览文件,加入行并写入新的输出文件。我想使用Python 3(教育原因!)。
我在小文件上测试了下面的代码。它几乎可以工作。但我有三个问题。
我在替换项附近的输出文件中看到垃圾字符。
对于较大的文件(大约 100Mb)是否有更好的做法?我大概不能使用this之类的逐行解决方案。我认为使用
MMAP有助于阅读部分,但写作部分呢?- 有没有比我用过的更方便的处理 UTF8 的方法。附加
.encode()和.decode()很烦人,我似乎是随机添加它们的。我不能以某种方式告诉代码:“一切都在 UTF8 中”
(我正在通过一个天真的正则表达式找到不需要的换行符。我知道这可能会更好,但这不是我目前关心的问题。)
#!/opt/local/bin/python3.6
from mmap import mmap, ACCESS_READ
from re import compile,MULTILINE
q=compile('([a-z])\n+([a-z])'.encode(),MULTILINE)
with open("infile", 'rb', 0) as file, open("outfile", "wb") as outfile, \
mmap(file.fileno(), 0, access=ACCESS_READ) as s:
outfile.write(q.sub("\1 \2".encode(),s))
【问题讨论】:
-
为什么不能使用逐行解决方案?教育、绩效原因?
-
我不能使用逐行解决方案,因为正则表达式跨越多行。
-
如何判断换行符打断了句子?您是否只想在连续有 2 个或更多的地方保留换行符?其他空格呢?如果句子之间的空行上有几个空格,你想保留它们,并将其视为应该保留的中断吗?
-
在这个问题中,我说我正在使用一个不完美的天真正则表达式。这不是我现在关心的问题。我要解决的问题是列出的三个。假设正则表达式是完美的,并专注于三个主要问题。
标签: python regex python-3.x utf-8 large-files