首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python 3+,在文本文件中读取并写入除行范围之外的新文件

问Python 3+,在文本文件中读取并写入除行范围之外的新文件
EN

Stack Overflow用户
提问于 2017-10-28 17:58:13
回答 3查看 1.6K关注 0票数 2

我在Windows机器上使用Python版本3.6。我正在使用open()和readlines()读取文本文件。在读取文本文件行后,我希望将某些行写入新的文本文件,但排除某些行的范围。我不知道要排除的行号。文本文件是巨大的,排除的行范围在我正在读取的文本文件中有所不同。有已知的关键字,我可以搜索,以找到范围的开始和结束,以排除在文本文件中,我想写。

我在网上到处搜索,但似乎找不到一个很好的解决方案。下面是我想要达到的目标的一个例子。

代码语言:javascript
复制
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。然后,写入一个新文件,但排除从开始开始的所有行,并在结束关键字处停止。

新文件应包含以下内容:

代码语言:javascript
复制
a  
b  
f  
g  
h  
i  
j  
r  
s  
t  
u  
v  
z  
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-10-28 18:36:28

如果文本文件是巨大的,正如您所说的,您将避免使用readlines(),因为这样会将整个文件加载到内存中。相反,逐行读取,并使用一个状态变量来控制您是否处于一个应该抑制输出的块中。有点像,

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2017-10-28 18:16:39

您可以使用以下正则表达式来实现这一点:

代码语言:javascript
复制
regex = r"(\bBEGIN\b([\w\n]*?)\bEND\b\n)"

现场演示这里

可以使用上述regex进行匹配,然后用空字符串('')替换。

下面是是Python中的一个相同的工作示例。

码

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2017-10-28 18:24:00

你试过这样的方法吗?

代码语言:javascript
复制
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)

基本上应该能做你需要做的事。基本上,不要通过“读行”将所有内容读入内存中,而是逐行进行更多的操作--这对于内存来说也应该更精简。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46992799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档