2017-11-16 2 views
0

Ich schreibe ein Skript in Python, das bestimmte Zeilen in Dateien Linux ersetzt. Sagen wir, ich habe eine Datei hallo im Verzeichnis/home genannt, die enthält:Python re spezifische Syntax

hi 873840 

Hier ist mein Skript:

#! /usr/bin/env python 

import re 

fp = open("/home/hi","w") 
re.sub(r"hi+", "hi 90", fp) 

Mein gewünschte Ergebnis ist:

hi 90 

jedoch, wenn i run it ich bekomme diesen Fehler und die Hi-Datei endet mit balnk:

Traceback (most recent call last): 
    File "./script.py", line 6, in <module> 
    re.sub(r"hi+", "hi 90", fp) 
    File "/usr/lib/python2.7/re.py", line 155, in sub 
    return _compile(pattern, flags).sub(repl, string, count) 
TypeError: expected string or buffer 

Stimmt etwas nicht mit meiner Syntax? Danke

+0

're.sub (Muster, repl, string, count = 0, flags = 0)': dritter Parameter ist eine Zeichenkette nicht ein Dateizeiger, weshalb Sie Fehler bekommen. – chakri

+0

Mögliches Duplikat von [Ersetze Zeichenkette in Datei mit regulären Ausdrücken] (https://stackoverflow.com/questions/35688126/replace-string-in-file-with-using-regular-expressions) –

Antwort

0

Sie sollten die Datei im Lesemodus öffnen. re.sub erwartet drei Argumente, pattern, repl, string. Das Problem ist das dritte Argument, das Sie übergeben, ist ein Dateizeiger.
ZB:

import re 
with open('/home/hi', 'r', encoding='utf-8') as infile: 
    for line in infile: 
     print(re.sub(r"hi+", "hi 90", line.strip())) 
1

Verwendung "r" mehr lesen Datei wird "w" Modus leere Datei zum Schreiben erstellen. .readline() wird erhalten und die Zeichenfolge an die re.sub() übergeben. r" .*" gibt eine Zeichenfolge zurück, die nach dem Zeichen 'space' ersetzt werden soll. Ich gehe davon aus 'hi 873840' der einzigen Text in der Datei ist und die gewünschte Ausgabe ist nur 'hi 90'

echo "hi 873840" > hi.txt 

python3.6 

import re 
fp = open("hi.txt", "r") 
print(re.sub(r" .*", " 90", fp.readline())) 
+1

Text, der die Lösung beschreibt haben sich ergeben, wäre nützlich für die Person, die die Frage gestellt hat. –

+1

danke für die Erinnerung und den Vorschlag. neu zu stackoverflow – Gio