我在Windows机器上使用Python 3.6版。我正在使用open()
和readlines()
阅读文本文件。在读入文本文件行后,我想将某些行写入新文本文件,但不包括某些行范围。我不知道要排除的行的行号。文本文件很大,要排除的行的范围因我正在阅读的文本文件而异。我可以搜索已知的关键字来查找要从我要写入的文本文件中排除的范围的开头和结尾。
我在网上到处搜索,但我似乎无法找到一个优雅的解决方案。以下是我正在努力实现的一个例子。
a
b
BEGIN
c
d
e
END
f
g
h
i
j
BEGIN
k
l
m
n
o
p
q
END
r
s
t
u
v
BEGIN
w
x
y
END
z
总之,我想将上述内容读入Python。然后,写入新文件,但排除从BEGIN开始并在END关键字处停止的所有行。
新文件应包含以下内容:
a
b
f
g
h
i
j
r
s
t
u
v
z
答案 0 :(得分:1)
您可以使用以下正则表达式来实现此目的:
regex = r"(\bBEGIN\b([\w\n]*?)\bEND\b\n)"
现场演示here
您可以使用上述正则表达式匹配,然后用空字符串(''
)
Here's Python中的一个工作示例。
<强> CODE 强>
result = re.sub(regex, '', test_str, 0) # test_str is your file's content
>>> print(result)
>>>
a
b
f
g
h
i
j
r
s
t
u
v
z
答案 1 :(得分:1)
如果文本文件很大,正如您所说,您将要避免使用readlines()
,因为这会将整个内容加载到内存中。相反,逐行读取并使用状态变量来控制是否在应该抑制输出的块中。有点像,
import re
begin_re = re.compile("^BEGIN.*$")
end_re = re.compile("^END.*$")
should_write = True
with open("input.txt") as input_fh:
with open("output.txt", "w", encoding="UTF-8") as output_fh:
for line in input_fh:
# Strip off whitespace: we'll add our own newline
# in the print statement
line = line.strip()
if begin_re.match(line):
should_write = False
if should_write:
print(line, file=output_fh)
if end_re.match(line):
should_write = True
答案 2 :(得分:0)
你有没有试过这样的事情:
with open("<readfile>") as read_file:
with open("<savefile>", "w") as write_file:
currently_skipping = False
for line in read_file:
if line == "BEGIN":
currently_skipping = True
else if line == "END":
currently_skipping = False
if currently_skipping:
continue
write_file.write(line)
基本上应该做你需要做的事情。 基本上不要通过'readlines'将所有内容读入内存,而是采用更多的逐行方法 - 这也应该更精简内存。