有没有办法删除包含两个具体字符串的两行之间的内容?
我的意思是:我想删除文本文件中“天堂”和“地狱”之间发现的任何内容:
I'm in heaven
foobar
I'm in hell
执行脚本/函数后,我要求文本文件为空。
答案 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 ......”之间有一条空行。
为什么?
哈维