Byt namn på filer och ge Python -skriptkörningstillstånd

Innehållsförteckning

I denna Python -handledning låt oss se ett manus som kommer ändra utseendet på .txt till .sh i filer, och det kommer också att ge körningstillstånd för användaren. För den här uppgif.webpten kommer vi att använda moduler som vi redan har i Python, skriptet är giltigt för både version 2.X och 3.X, även om utmatningen är något annorlunda ändras inte beteendet, som vi kommer att se senare.

NoteraSkriptet som ska implementeras är för användning på UNIX -operativsystem.

I exemplet har jag skapat en mapp med flera filer, vissa har ett .txt -tillägg och andra inte, och det finns också en fil som heter test1.txt som har ett litet kommando: ls -l. Det är att verifiera att det faktiskt körs, eftersom resten är "klibbiga" eftersom de inte innehåller data. Innehållet i mappen kan ses i följande bild:

Om vi ​​gör en ls -l vi ser att ingen har körningstillstånd:

Nu ska vi se hela koden och den kommer att förklaras nedan.

 importera os, sys, stat från delprocessimport Popen, PIPE if (len (sys.argv) <2): print ("Sökvägen att leta efter krävs") sys.exit (0) elif (inte os.path.exists (sys.argv [1])): print ("Hittades inte:" + str (sys.argv [1])) sys.exit (0) process = Popen (["hitta", sys.argv [1]] , stdout = PIPE, stderr = PIPE) om inte process.stderr.read (): num = 0 för rad i process.stdout.readlines (): lineNew = line.decode ("UTF-8"). strip () if (".txt" i lineNew och 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 utskrift ("Arbetet utfört, ändrat", num, "filer") annars: print ("Fel")
Vi ska börja med förklaringen av koden steg för steg, det första vi gör är att importera de moduler som vi kommer att behöva.
 importera os, sys, stat från delprocessimport Popen, PIPE
Sedan kommer vi att kontrollera om vi har passerat ett argument och det är en rutt, för att se om vi fortsätter med skriptet eller inte.
 if (len (sys.argv) <2): print ("Sökvägen att söka efter krävs") sys.exit (0) elif (inte os.path.exists (sys.argv [1])): print ( "Hittades inte:"+ str (sys.argv [1])) sys.exit (0)
För att fortsätta använder vi Popen av modulen delprocess, vi fångar standardutmatningen och felutmatningen, vi gör detta med hjälp av RÖR, Ett rör. Nu kan vi läsa från pipelinen som om det vore en fil.
 process = Popen (["hitta", sys.argv [1]], stdout = PIPE, stderr = PIPE)
För att veta om vi ska fortsätta kontrollerar vi om det finns ett fel (lagrat i process.stderr) med följande om:
 om inte process.stderr.read ():
Om det finns ett fel visas det på felskärmen (detta är för den andra grenen, som inte har någon ytterligare förklaring) och programmet avslutas. Om inte, är det vi ska göra att läsa från standardutgångsröret (stdout). Vi gör det rad för rad med en för, vi måste avkoda utmatningen, i det här fallet väljer jag UTF-8, eftersom det med ASCII skulle ge fel med accenter till exempel.

Om vi ​​fortsätter att titta på for -slingan ser vi att vi kontrollerar om den lästa raden innehåller .txt, i så fall är det också kontrollerat att det är en fil (vi är inte intresserade av att ändra en mapp som innehåller .txt). Om detta är sant använder vi funktionen byta ut av Python för att ändra .txt till .sh, och sedan med modulens chmod -funktion ger vi dig behörigheter, som kommer att vara körning, läsning och skrivning för användaren, läsning och körning för gruppen och ingenting för andra. Som du kan se använder vi stat -modulen.

Variabeln num som du kommer att ha sett i koden används helt enkelt för att hålla reda på antalet filer som vi ändrar och därmed i slutändan för att kunna visa information på skärmen.

 för rad i process.stdout.readlines (): lineNew = line.decode ("UTF-8"). strip () if (". txt" i lineNew och os.path.isfile (lineNew)): new = lineNew. Ersätt (". 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
I slutet av for loop, vad vi gör är att visa informationen vi pratar om, det är här vi hittar skillnaden mellan version 2.x och 3.x, eftersom kommatecken före och efter num i version 2 delar det i en lista och i 3 visar den dig normal (utan lista).
 print ("Arbetet utfört, ändrat", num, "filer")
Detta kan ändras för att tolkas på samma sätt med + och konvertera variabeln num till en sträng med funktionen str, eller genom %, nedan är de 2 koder:
 print ("Arbetet gjort, ändrat" + str (num) + "filer") print ("Arbetet utfört, ändrade% d filer"% num)
Det lämnades på det första sättet att visa att mellan versioner av Python finns det ändringar (de kan vara små som i det här fallet, men något som fungerar i version 3 kanske inte fungerar i version 2, och vice versa).

Nu och nästan för att avsluta handledningen ska vi köra koden och se hur den fungerar, nedan lämnar jag 2 bilder av körningen, med Python 3.x i den första och i den andra Python 2.x:

Här uppskattar vi de små skillnaderna. Nu ska vi se hur testmappen som vi såg tidigare ser ut:

De 4 filer som hade .txt har ändrats och har nu .sh, det verkar som att bara test1.sh -filen är körbar, det beror på att resten inte innehåller data. Vi kommer att köra filen test1.sh, som bara kommer att starta ls -l att vi sa att den innehöll, och så hjälper det oss att se behörigheterna.

Handledningen slutar här, om det är av intresse, en länk till en annan handledning om Python: sök efter filnamn.

Gillade du och hjälpte denna handledning?Du kan belöna författaren genom att trycka på den här knappen för att ge honom en positiv poäng
wave wave wave wave wave