2010-04-05 5 views

Répondre

3

Utilisez un indicateur pour indiquer si vous écrivez ou non.

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') 

EDIT

Comme extraneon souligné dans les commentaires, l'exigence est de supprimer les lignes entre deux cordes en béton. Cela signifie que si la seconde chaîne (de fermeture) n'est jamais trouvée, rien ne doit être supprimé. Cela peut être réalisé en conservant un tampon de lignes. Le tampon est rejeté si la chaîne de fermeture "I'm in hell" est trouvée, mais si la fin du fichier est atteinte sans le trouver, tout le contenu doit être écrit dans le fichier.

Exemple:

I'm in heaven 
foo 
bar 

devrait garder tout le contenu car il n'y a pas de balise de fermeture et la question dit entre deux lignes.

Voici un exemple pour le faire, pour l'achèvement:

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') 
+0

Merci, mais je dois utiliser 2.5.2. – ziiweb

+0

@ user249959: édité pour autoriser python 2.5.2 – nosklo

+0

@noskio C'est probablement ce qui est prévu, mais pas ce qui est demandé. S'il n'y a pas de fermeture «Je suis en enfer», il n'y a pas de _between_ et le contenu devrait donc être dans la sortie. Ouais, je suis un nitpicker quand il s'agit d'exigences :) – extraneon

0

Je présente mes excuses, mais cela ressemble à un problème de travail. Nous avons une politique sur ces: https://meta.stackexchange.com/questions/10811/homework-on-stackoverflow

Cependant, ce que je peux dire est que le @nosklo métrage écrit sur est disponible dans tout 2.5.x Python (ou plus récent), mais vous devez apprendre suffisamment Python pour permettre il. :-)

Ma solution impliquerait l'utilisation de la création d'une nouvelle chaîne avec les éléments non désirés retirés en utilisant str.find() ou str.index() (ou un parent de ces 2).

Bonne chance!

0

Vous pourriez faire quelque chose comme ce qui suit avec des expressions régulières. Il y a probablement des manières plus efficaces de le faire puisque j'apprends toujours beaucoup de python, mais ceci devrait fonctionner.

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() 
1

On dirait par « enlever » vous voulez dire « réécrire le fichier d'entrée en place » (ou la faire ressembler à vous ;-) Ce faisant, auquel cas fileinput.input aide:

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 
+0

@nosklo: Je comprends la question comme Alex et croyez que votre compréhension est fausse (c.-à-d. que «Je ne suis PAS en enfer devrait correspondre», si je comprends bien le libellé de l'affiche originale). Ne vois pas de problème avec les espaces ici ... votant en arrière. – kriss

+0

@kriss: Vous avez raison. Mais je ne me suis pas rétrogradé moi-même. – nosklo

-1

voir ci-dessous. Je ne sais pas si c'est ok mais ça a l'air de bien marcher.

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() 

De toute façon, lorsque je l'exécute, il laisse une ligne vide.Je veux dire, si cette fonction:

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); 
} 
} 

et j'exercerai mon script, je reçois ceci:

public function preFetchAll(Doctrine_Event $event){ 

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

Comme vous pouvez le voir, il y a une ligne vide entre « public ... » et " pour chaque...".

Pourquoi?

Javi

+0

Peut-être que sub() quitte la nouvelle ligne après 'Im in hell'? – Jacinda

+0

C'est une autre question, il devrait être demandé à nouveau dans une question distincte. – nosklo