In diesem Python-Tutorial Sehen wir uns ein Skript an, das wird Ändern Sie das Erscheinungsbild von .txt in .sh in Dateien, und es werden auch Ausführungsberechtigungen für den Benutzer erteilt. Für diese Aufgabe werden wir Module verwenden, die wir bereits in Python haben, das Skript ist sowohl für Version 2.X als auch für Version 3.X gültig, obwohl die Ausgabe etwas anders ist, ändert sich das Verhalten nicht, wie wir später sehen werden.
NotizDas zu implementierende Skript ist für die Verwendung auf UNIX-Betriebssystemen vorgesehen.
Für das Beispiel habe ich einen Ordner mit mehreren Dateien erstellt, einige haben eine .txt-Erweiterung und andere nicht, und es gibt auch eine Datei namens test1.txt mit einem kleinen Befehl: ls -l. Es ist zu überprüfen, ob es tatsächlich ausgeführt wird, da der Rest "klebrig" ist, da sie keine Daten enthalten. Der Inhalt des Ordners ist in der folgenden Abbildung zu sehen:
Wenn wir es tun ls -l Wir sehen, dass keiner über Ausführungsberechtigungen verfügt:
Jetzt werden wir den vollständigen Code sehen und er wird unten erklärt.
import os, sys, stat aus Unterprozess import Popen, PIPE if (len (sys.argv) <2): print ("Der zu suchende Pfad ist erforderlich") sys.exit (0) elif (nicht os.path.exists ( sys.argv [1])): print ("Nicht gefunden:" + str (sys.argv [1])) sys.exit (0) process = Popen ("["find", sys.argv [1]] , stdout = PIPE, stderr = PIPE) if not process.stderr.read (): num = 0 für Zeile in process.stdout.readlines (): lineNew = line.decode ("UTF-8"). strip () if (".txt" in lineNew und os.path.isfile (lineNew)): new = lineNew.replace (".txt", ".sh") os.rename (lineNew, new) os.chmod (new, stat. S_IXUSR + stat.S_IRUSR + stat.S_IWUSR + stat.S_IRGRP + stat.S_IXGRP) num + = 1 print ("Arbeit erledigt, geändert", num, "files") sonst: print ("Fehler")Wir beginnen mit der Erklärung des Codes Schritt für Schritt, zuerst importieren wir die Module, die wir benötigen.
import os, sys, stat aus Unterprozess import Popen, PIPEDann prüfen wir, ob uns ein Argument übergeben wurde und es eine Route ist, um zu sehen, ob wir mit dem Skript fortfahren oder nicht.
if (len (sys.argv) <2): print ("Der zu suchende Pfad ist erforderlich") sys.exit (0) elif (nicht os.path.exists (sys.argv [1])): print ( " Nicht gefunden: "+ str (sys.argv [1])) sys.exit (0)Um fortzufahren verwenden wir Popen des Moduls Teilprozess, erfassen wir die Standardausgabe und die Fehlerausgabe, wir tun dies mit Hilfe von ROHR, Ein Rohr. Jetzt können wir aus der Pipeline lesen, als ob es eine Datei wäre.
process = Popen (["find", sys.argv [1]], stdout = PIPE, stderr = PIPE)Um zu wissen, ob wir fortfahren sollen, prüfen wir, ob ein Fehler vorliegt (gespeichert in process.stderr) mit folgendem wenn:
wenn nicht process.stderr.read ():Wenn ein Fehler auftritt, wird dieser auf dem Fehlerbildschirm angezeigt (dies ist für den else-Zweig, der keine weitere Erklärung hat) und das Programm wird beendet. Wenn nicht, lesen wir aus der Standardausgabepipe (stdout). Wir machen das zeilenweise mit einem for, wir müssen die Ausgabe dekodieren, in diesem Fall entscheide ich mich für UTF-8, da es bei ASCII zB Fehler bei den Akzenten geben würde.
Wenn wir die for-Schleife weiter betrachten, sehen wir, dass wir überprüfen, ob die gelesene Zeile .txt enthält, wenn ja, wird auch überprüft, ob es sich um eine Datei handelt (wir sind nicht daran interessiert, einen Ordner zu ändern, der .txt enthält). Wenn dies wahr ist, verwenden wir die Funktion ersetzen von Python, um .txt in .sh zu ändern, und dann geben wir Ihnen mit der chmod-Funktion des Moduls Berechtigungen, die für den Benutzer Ausführung, Lesen und Schreiben, für die Gruppe Lesen und Ausführen und für andere nichts sind. Wie Sie sehen, verwenden wir das Statistikmodul.
Die Variable num, die Sie im Code sehen werden, dient lediglich dazu, die Anzahl der von uns geänderten Dateien zu verfolgen und somit letztendlich Informationen auf dem Bildschirm anzeigen zu können.
for line in process.stdout.readlines (): lineNew = line.decode ("UTF-8"). strip () if (".txt" in lineNew und os.path.isfile (lineNew)): new = lineNew. ersetzen (".txt", ".sh") os.rename (lineNew, new) os.chmod (new, stat.S_IXUSR + stat.S_IRUSR + stat.S_IWUSR + stat.S_IRGRP + stat.S_IXGRP) num + = 1Am Ende der for-Schleife zeigen wir die Informationen an, über die wir sprechen. Hier finden wir den Unterschied zwischen Version 2.x und 3.x, da die Kommas vor und nach num in Version 2 Teil davon sind in einer Liste und in der 3 zeigt es dir normal (ohne Liste).
print ("Arbeit erledigt, geändert", num, "Dateien")Dies kann geändert werden, um gleich interpretiert zu werden + und die Variable num mit der Funktion in einen String umwandeln str, oder durch %, unten sind die 2 Codes:
print ("Arbeit erledigt, geändert" + str (num) + "files") print ("Arbeit erledigt, geändert% d Dateien"% num)Es wurde in erster Linie belassen, um zu zeigen, dass es zwischen den Versionen von Python Änderungen gibt (sie können wie in diesem Fall klein sein, aber etwas, das in Version 3 funktioniert, funktioniert möglicherweise nicht in Version 2 und umgekehrt).
Jetzt und fast zum Abschluss des Tutorials werden wir den Code ausführen und sehen, wie er funktioniert. Unten lasse ich 2 Bilder der Ausführung, wobei ich Python 3.x im ersten und im zweiten Python 2.x verwende:
Hier schätzen wir die kleinen Unterschiede. Jetzt werden wir sehen, wie der Testordner, den wir zuvor gesehen haben, aussieht:
Die 4 Dateien, die .txt hatten, wurden geändert und haben jetzt .sh, es scheint, dass nur die Datei test1.sh ausführbar ist, weil der Rest keine Daten enthält. Wir werden die Datei test1.sh ausführen, die nur die ls -l dass wir sagten, dass es enthalten ist, und so hilft es uns, die Berechtigungen zu sehen.
Das Tutorial endet hier, falls es von Interesse ist, ein Link zu ein weiteres Tutorial zu Python: Suche nach Dateinamen.
Hat dir dieses Tutorial gefallen und geholfen?Sie können den Autor belohnen, indem Sie diesen Knopf drücken, um ihm einen positiven Punkt zu geben