Python 3+;,读入文本文件并写入新文件,不包括行范围

Python 3+;,读入文本文件并写入新文件,不包括行范围,python,text,readfile,writefile,Python,Text,Readfile,Writefile,我正在Windows机器上使用Python 3.6版。我正在使用withopen()和readlines()读取文本文件。读入文本文件行后,我想将某些行写入新文本文件,但排除某些行范围。我不知道要排除的行的行号。文本文件很大,要排除的行的范围因我正在阅读的文本文件而异。我可以搜索一些已知的关键字,以查找要从要写入的文本文件中排除的范围的开始和结束 我在网上到处搜索,但似乎找不到一个有效的优雅解决方案。下面是我试图实现的一个例子 a b BEGIN c d e END

我正在Windows机器上使用Python 3.6版。我正在使用with
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。然后,写入一个新文件,但排除从开始到结束的所有行关键字

新文件应包含以下内容:

a  
b  
f  
g  
h  
i  
j  
r  
s  
t  
u  
v  
z  

您可以使用以下正则表达式来实现此目的:

regex = r"(\bBEGIN\b([\w\n]*?)\bEND\b\n)"
现场演示

您可以使用上面的正则表达式进行匹配,然后替换为空字符串(
'

Python中的一个工作示例

代码

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

你有没有试过这样的方法:

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)
打开(“”)作为读取文件:
以open(“,“w”)作为写入文件:
当前跳过=错误
对于read_文件中的行:
如果行==“开始”:
当前跳过=真
否则,如果行==“结束”:
当前跳过=错误
如果当前正在跳过:
持续
写入文件。写入(行)
这基本上就是你需要做的。
基本上,不要通过“readlines”将所有内容读取到内存中,而是采用更多的逐行方法-这也应该更节省内存。

如果文本文件很大,正如您所说,您应该避免使用
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

如果它遇到像“BEGIN123”这样的字符串呢?我最终使用了这个。在我的特殊情况下,我不需要使用正则表达式,所以我不打算使用re模块。此外,我还将“print(line,file=outputfh)”更改为outputfh.write(line),因为print语句引发了以下警告:预期类型为“Optional[IO[str]]”,改为“TextIOWrapper[str]”。谢谢大家的支持!