2016-07-13 31 views
0

So versuche ich ein Python-Skript erstellen, die *.styles und *.layout Dateien durchsuchen und bestimmte Zeichenfolgen in diesen Dateien ersetzen wird. Ich habe eine Reihe von Dingen ausprobiert, aber ich kann nicht herausfinden, was ich tun sollte, und sogar andere Code-Beispiele online zu betrachten, macht es noch verwirrender zu verstehen.Batch Ersetzen Zeichenfolgen in Dateien mit Python

Hier ist, was ich derzeit in meinem Code habe;

#!/usr/bin/python3 
# coding: utf-8 

import os 
import sys 
import fileinput 

f1 = open ('*.styles', 'r') # read *.styles 
f2 = open ('*.styles', 'w') # write *.styles 
f3 = open ('*.layout', 'r') # read *.layout 
f4 = open ('*.layout', 'w') # write *.layout 
for line in f1: 
    f2.write(line.replace('font-size=15','font-size=12')) # replace string for 
    f2.write(line.replace('font-size=14','font-size=12')) # files in *.styles 
    f2.write(line.replace('font-size=18','font-size=14')) 
    f2.write(line.replace('font-size=30','font-size=18')) 
    f2.write(line.replace('font-size=36','font-size=18')) 
    f2.write(line.replace('font-size=16','font-size=12')) 
    f2.write(line.replace('font-size=26','font-size=16')) 
    f2.write(line.replace('font-size=48','font-size=20')) 
    f2.write(line.replace('font-size=28','font-size=16')) 
    f2.write(line.replace('font-size=17','font-size=14')) 
    f2.write(line.replace('font-size=21','font-size=14')) 
f1.close() 
f2.close() 

for line in f3: 
    f4.write(line.replace('font-size=15','font-size=12')) # replace string for 
    f4.write(line.replace('font-size=14','font-size=12')) # files in *.layout 
    f4.write(line.replace('font-size=18','font-size=14')) 
    f4.write(line.replace('font-size=30','font-size=18')) 
    f4.write(line.replace('font-size=36','font-size=18')) 
    f4.write(line.replace('font-size=16','font-size=12')) 
    f4.write(line.replace('font-size=26','font-size=16')) 
    f4.write(line.replace('font-size=48','font-size=20')) 
    f4.write(line.replace('font-size=28','font-size=16')) 
    f4.write(line.replace('font-size=17','font-size=14')) 
    f4.write(line.replace('font-size=21','font-size=14')) 
f3.close() 
f4.close() 

print ("\n\n ## Done!\n\n") 
sys.exit(0) 

Ich wollte schließen ein „Möchten Sie Änderungen zu übernehmen mögen? [Y/n]“ mit einer einfachen Ja/Nein-Antwort von Benutzereingaben, aber das bekam ein wenig zu kompliziert mit, um herauszufinden, While True: und While False: Aussagen.

Wenn dieser Code Test für die Dateien ausgeführt wird, die ich testen möchte, wird nur ein Fehler angezeigt;

line 8, in <module> 
    f1 = open ('*.styles', 'r') # read *.styles 
FileNotFoundError: [Errno 2] No such file or directory: '*.styles' 

Ich möchte nur in der Lage sein, von der Befehlszeile aus so zu laufen;

$ string_search.py . 

so ändert er alle Dateien im aktuellen Verzeichnis, das *.styles und *.layout Dateien in diesem Verzeichnis enthält, so dass Sie nicht über ein aktuelles Verzeichnis, gerade in der aktuellen Verzeichnissen und Ordnern angeben.

+0

kopiert. Mögliches Duplikat von [Get a filtered files in a directory] (http: // stackoverflow.com/questions/2225564/get-a-filtered-list-of-files-in-directory) –

+2

Ich weiß nicht, warum Sie all diese Informationen über String-Suche und While-Schleifen und alles andere, wenn Ihre Frage kocht unten enthalten zu einer Codezeile, die ein Problem verursacht. Bitte versuchen Sie, sich pro Post an eine Frage zu halten und verwenden Sie ein * minimales * überprüfbares Beispiel. –

+0

@ Two-BitAlchemist - Sie vermissen den Punkt, und das ist eine Frage. Die Hauptfrage lautet: Wie kann ich Python dazu bringen, jede angegebene Datei zu durchsuchen und die angegebenen Zeichenfolgen in diesen bestimmten Dateien durch die neue Zeichenfolge zu ersetzen, mit der ich sie ersetzen möchte? Es geht um eine schnelle, einfache Lösung, die für viele Dateien mit einem schnellen Commit-Wechsel durchgeführt werden kann, wodurch die Zeit gespart wird, die jede Datei einzeln durchlaufen muss. –

Antwort

0

open öffnet eine einzelne Datei; Sie scheinen zu versuchen, eine Sammlung von Dateien zu öffnen, die mit einem Muster übereinstimmen. Vielleicht möchten Sie os.walk betrachten, um ein Verzeichnis von Dateien zu durchlaufen, so dass Sie jedes einzeln verarbeiten können.

1

Wie Scott Hunter schrieb, öffnet open eine einzelne Datei. Sie müssen eine Liste der übereinstimmenden Dateien abrufen und in einer Schleife einzeln für jedes von ihnen open aufrufen. Hier ist, wie es geht.

Erstellen Sie eine Funktion, die eine einzelne Datei verarbeitet:

def process_file(filename): 
    print(filename) 
    # ... open(filename) ... 
    # ... open(filename, 'w') ... 

dann wie folgt die Funktion aufrufen:

import glob 
for filename in glob.glob('*.styles'): 
    process_file(filename) 

Oder wie diese, für rekursive Aufzählung von Verzeichnissen und Dateien:

import os 
for dirpath, dirnames, filenames in os.walk('.'): 
    for filename in filenames: 
    # Instead of .endswith, you can use the fnmatch module to match on '*.styles'. 
    if filename.endswith('.styles'): 
     process_file(os.path.join(dirpath, filename)) 
-1

Es tut mir leid, ich kann noch nicht kommentieren, aber ich musste etwas tun. ich es geschafft, mit fileinput.input so etwas wie: Zuerst habe ich auf die Dateien iterieren würde und sie dann ändern:

for current_path, dirs, files in os.walk(Your_Path_With_Files)): 
      for file in files: 
       if file.endswith('.styles'): 
        #here you store the file path somewhere 
        #I'm not 100% the exact way to have the full path, 
        # but it's with os.path.join() to have a clean path 
        #list_path_styles_files 

dann, wenn Sie alle Pfade von den Dateien haben Sie ändern müssen:

for the_path in list_path_styles_files: 
     for line in fileinput.input(the_path, inplace=1): 
       line = line.replace('font-size=15','font-size=12') 
       line = ... 
       ... 
       print line 

Dadurch werden die Zeilen nacheinander gelesen und anschließend die Zeile so geändert, wie Sie möchten. Anschließend wird sie in die Datei