2013-06-20 8 views
10

Próbuję usunąć wszystkie wiersze, w których znajduje się moje wyrażenie regularne (regex szuka po prostu jakiejkolwiek linii, która ma w sobie yahoo). Każdy mecz jest na własnej linii, więc nie ma potrzeby korzystania z opcji multilinii.Używanie Pythona do usuwania wszystkich linii pasujących do Regex

To, co mam tak daleko ...

import re 
inputfile = open('C:\\temp\\Scripts\\remove.txt','w',encoding="utf8") 

inputfile.write(re.sub("\[(.*?)yahoo(.*?)\n","",inputfile)) 

inputfile.close() 

Otrzymuję następujący błąd:

Traceback (najnowsza rozmowę ostatnia): linii 170 w sub _compile powrotnej (wzór, flagi) .sub (repl, łańcuch, liczą) TypeError: oczekuje ciąg lub bufor

+3

Więc w czym problem? – arshajii

+0

Nie czytasz pliku. Potrzebujesz czegoś podobnego do 'inputfile.readlines()' – karthikr

+0

Próbujesz zamknąć 2 pliki, które nigdy nie zostały otwarte, a nazwanie pliku otwartego do zapisu 'inputfile' jest w najlepszym wypadku mylące. – geoffspear

Odpowiedz

10

Zastosowanie fileinput moduł jeśli chcesz zmodyfikować oryginalny plik:

import re 
import fileinput 
for line in fileinput.input(r'C:\temp\Scripts\remove.txt', inplace = True): 
    if not re.search(r'\byahoo\b',line): 
     print line, 
+0

To wystarczy! Dziękuję Ci!!! – MrMr

+0

Dodaje nowe linie między tekstem, który wciąż istnieje. Wszelkie wskazówki, jak tego uniknąć? – MrMr

+0

Próbowałem linii drukowania i drukowania (linia,) i drukowania (linia), żaden nie wydaje się działać. – MrMr

3

trzeba odczytać pliku spróbować czegoś takiego:

import re 
inputfile = open('C:\\temp\\Scripts\\remove.txt','w',encoding="utf8") 

inputfile.write(re.sub("\[(.*?)yahoo(.*?)\n","",inputfile.read())) 

file.close() 
outputfile.close() 
4

Oto Python 3 wariant @Ashwini Chaudhary's answer:

#!/usr/bin/env python3 
import fileinput 
import re 
import sys 

def main(): 
    pattern, filename = sys.argv[1:] # get pattern, filename from command-line 
    matched = re.compile(pattern).search 
    with fileinput.FileInput(filename, inplace=1, backup='.bak') as file: 
     for line in file: 
      if not matched(line): # save lines that do not match 
       print(line, end='') # this goes to filename due to inplace=1 

main() 

Zakłada locale.getpreferredencoding(False) == 'utf-8' inaczej może złamać na znaki spoza ASCII .

Aby działać niezależnie jaki prąd jest albo locale dla plików wejściowych, które mają inne kodowanie:

#!/usr/bin/env python3 
import os 
import re 
import sys 
from tempfile import NamedTemporaryFile 

def main(): 
    encoding = 'utf-8' 
    pattern, filename = sys.argv[1:] 
    matched = re.compile(pattern).search 
    with open(filename, encoding=encoding) as input_file: 
     with NamedTemporaryFile(mode='w', encoding=encoding, 
           dir=os.path.dirname(filename)) as outfile: 
      for line in input_file: 
       if not matched(line): 
        print(line, end='', file=outfile) 
      outfile.delete = False # don't delete it on closing 
    os.replace(outfile.name, input_file.name) 

main() 
Powiązane problemy