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