Python 2.5.2:删除包含两个具体字符串的两行之间的内容

时间:2010-04-05 16:49:20

标签: python lines

有没有办法删除包含两个具体字符串的两行之间的内容?

我的意思是:我想删除文本文件中“天堂”和“地狱”之间发现的任何内容:

I'm in heaven
foobar
I'm in hell

执行脚本/函数后,我要求文本文件为空。

5 个答案:

答案 0 :(得分:3)

使用标记来表明您是否正在写作。

from __future__ import with_statement

writing = True

with open('myfile.txt') as f:
    with open('output.txt') as out:
        for line in f:
            if writing:
                if "heaven" in line:
                    writing = False
                else:
                    out.write(line)
            elif "hell" in line:
                writing = True    
os.remove('myfile.txt')
os.rename('output.txt', 'myfile.txt')

修改

在评论中指出extraneon,要求是删除两个具体字符串之间的界限。这意味着如果永远找不到第二个(结束)字符串,则不应删除任何内容。这可以通过保持线缓冲来实现。如果找到结束字符串"I'm in hell",缓冲区将被丢弃,但如果在未找到文件末尾的情况下到达文件末尾,则必须将整个内容写入文件。

示例:

I'm in heaven
foo
bar

应该保留整个内容,因为没有结束标记,问题是两行之间的

以下是完成此操作的示例:

from __future__ import with_statement

writing = True
with open('myfile.txt') as f:
    with open('output.txt') as out:
        for line in f:
            if writing:
                if "heaven" in line:
                    writing = False
                    buffer = [line]
                else:
                    out.write(line)
            elif "hell" in line:
                writing = True
            else:
                buffer.append(line)
        else:
            if not writing:
                #There wasn't a closing "I'm in hell", so write buffer contents
                out.writelines(buffer)

os.remove('myfile.txt')
os.rename('output.txt', 'myfile.txt')

答案 1 :(得分:1)

看起来像“删除”你的意思是“就地重写输入文件”(或让它看起来像你这样做;-),在这种情况下fileinput.input会有所帮助:

import fileinput
writing = True
for line in fileinput.input(['thefile.txt'], inplace=True):
    if writing:
        if 'heaven' in line: writing = False
        else: print line,
    else:
        if 'hell' in line: writing = True

答案 2 :(得分:0)

我道歉但这听起来像是一个家庭作业问题。我们有以下政策:https://meta.stackexchange.com/questions/10811/homework-on-stackoverflow

但是,我可以说的是@nosklo在任何Python 2.5.x(或更新版本)中都提到的功能,但是你需要学习足够的Python才能启用它。 : - )

我的解决方案将涉及使用str.find()str.index()(或其中某些亲属)创建一个新的字符串,其中包含不需要的内容。

祝你好运!

答案 3 :(得分:0)

您可以使用正则表达式执行以下操作。可能有更有效的方法来实现它,因为我还在学习很多python,但这应该有效。

import re

f = open('hh_remove.txt')
lines = f.readlines()

pattern1 = re.compile("heaven",re.I)
pattern2 = re.compile("hell",re.I)

mark1 = False
mark2 = False

for i, line in enumerate(lines):
    if pattern1.search(line) != None:
        mark1 = True
        set1 = i
    if pattern2.search(line) != None:
        mark2 = True
        set2 = i+1
    if ((mark1 == True) and (mark2 == True)):
        del lines[set1:set2]
        mark1 = False
        mark2 = False

f.close()
out = open('hh_remove.txt','w')
out.write("".join(lines))
out.close()

答案 4 :(得分:-1)

见下文。我不知道它是否可以,但似乎工作正常。

import re,fileinput,os


for path, dirs, files in os.walk(path):
    for filename in files:
        fullpath = os.path.join(path, filename)


        f = open(fullpath,'r')


        data = f.read()

        patter = re.compile('Im in heaven.*?Im in hell', re.I | re.S)
        data = patter.sub("", data)

        f.close()

        f = open(fullpath, 'w')

        f.write(data)
        f.close()

无论如何,当我执行它时,它会留下一个空白行。我的意思是,如果有这个功能:

public function preFetchAll(Doctrine_Event $event){ 
//Im in heaven
$a = sfContext::getInstance()->getUser()->getAttribute("passw.formulario");
var_dump($a);
//Im in hell
foreach ($this->_listeners as $listener) {
    $listener->preFetchAll($event);
}
}

我执行我的脚本,我明白了:

public function preFetchAll(Doctrine_Event $event){ 

foreach ($this->_listeners as $listener) {
    $listener->preFetchAll($event);
}
}

正如你所看到的,“公共...”和“foreach ......”之间有一条空行。

为什么?

哈维