In deze Python-zelfstudie laten we eens kijken naar een script dat zal verander het uiterlijk van .txt in .sh in bestanden, en het geeft ook uitvoeringsmachtigingen voor de gebruiker. Voor deze taak gaan we modules gebruiken die we al in Python hebben, het script is geldig voor zowel versie 2.X als 3.X, hoewel de uitvoer iets anders is, verandert het gedrag niet, zoals we later zullen zien.
OpmerkingHet te implementeren script is bedoeld voor gebruik op UNIX-besturingssystemen.
Voor het voorbeeld heb ik een map gemaakt met verschillende bestanden, sommige hebben de extensie .txt en andere niet, en er is ook een bestand met de naam test1.txt met een klein commando: ls -l. Het is om te controleren of het daadwerkelijk wordt uitgevoerd, aangezien de rest "sticky" is omdat ze geen gegevens bevatten. De inhoud van de map is te zien in de volgende afbeelding:
Als we een ls -l we zien dat niemand uitvoeringsrechten heeft:
Nu gaan we de volledige code zien en deze zal hieronder worden uitgelegd.
import os, sys, stat uit subproces import Popen, PIPE if (len (sys.argv) <2): print ("Het pad om naar te zoeken is vereist") sys.exit (0) elif (niet os.path.exists ( sys.argv [1])): print ("Niet gevonden:" + str (sys.argv [1])) sys.exit (0) process = Popen (["find", sys.argv [1]] , stdout = PIPE, stderr = PIPE) indien niet process.stderr.read (): num = 0 voor regel in process.stdout.readlines (): lineNew = regel.decode ("UTF-8"). strip () indien (".txt" in lineNew en 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 ("Werk gedaan, gewijzigd", num, "bestanden") else: print ("Error")We beginnen met de stap voor stap uitleg van de code, het eerste wat we doen is de modules importeren die we nodig gaan hebben.
import os, sys, stat uit subproces import Popen, PIPEDan zullen we controleren of we een argument hebben gekregen en het is een route, om te zien of we doorgaan met het script of niet.
if (len (sys.argv) <2): print ("Het pad om naar te zoeken is vereist") sys.exit (0) elif (niet os.path.exists (sys.argv [1])): print ( " Niet gevonden: "+ str (sys.argv [1])) sys.exit (0)Om verder te gaan gebruiken we Popen van de module subproces, we leggen de standaarduitvoer en de foutuitvoer vast, dit doen we met behulp van PIJP, Een pijp. Nu kunnen we uit de pijplijn lezen alsof het een bestand is.
process = Popen (["find", sys.argv [1]], stdout = PIPE, stderr = PIPE)Om te weten of we door moeten gaan, controleren we of er een fout is (opgeslagen in process.stderr) met het volgende als:
zo niet process.stderr.read ():Als er een fout is, wordt deze weergegeven op het scherm Fout (dit is voor de else-tak, die geen verdere uitleg heeft) en eindigt het programma. Zo niet, dan lezen we uit de standaard uitvoerpijp (stout). We doen het regel voor regel met een for, we moeten de uitvoer decoderen, in dit geval kies ik voor UTF-8, omdat het met ASCII fouten zou geven met bijvoorbeeld de accenten.
Als we blijven kijken naar de for-lus, zien we dat we controleren of de gelezen regel .txt bevat, zo ja, dan wordt ook gecontroleerd of het een bestand is (we zijn niet geïnteresseerd in het wijzigen van een map die .txt bevat). Als dit waar is, gebruiken we de functie vervangen van Python om .txt te veranderen in .sh, en dan met de chmod-functie van de module geven we je permissies, die zullen zijn: uitvoeren, lezen en schrijven voor de gebruiker, lezen en uitvoeren voor de groep en niets voor anderen. Zoals je kunt zien gebruiken we de stat-module.
De variabele num die je in de code hebt gezien, wordt eenvoudigweg gebruikt om het aantal bestanden bij te houden dat we wijzigen en dus om uiteindelijk informatie op het scherm te kunnen weergeven.
voor regel in process.stdout.readlines (): lineNew = line.decode ("UTF-8"). strip () if (".txt" in lineNew en os.path.isfile (lineNew)): new = lineNew. vervang (". 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 + = 1Aan het einde van de for-lus laten we de informatie zien waar we het over hebben, hier zullen we het verschil tussen versie 2.x en 3.x vinden, aangezien de komma's voor en na num in versie 2 deel uitmaken van het in een lijst en in de 3 ziet u normaal (zonder lijst).
print ("Werk gedaan, gewijzigd", num, "bestanden")Dit kan worden gewijzigd om hetzelfde te worden geïnterpreteerd met behulp van de + en het converteren van de variabele num naar een string met de functie str, of door %, hieronder staan de 2 codes:
print ("Werk gedaan, gewijzigd" + str (num) + "bestanden") print ("Werk gedaan, gewijzigd% d bestanden"% num)Het werd op de eerste manier gelaten om aan te tonen dat er tussen versies van Python veranderingen zijn (ze kunnen klein zijn zoals in dit geval, maar iets dat in versie 3 werkt, werkt mogelijk niet in versie 2 en vice versa).
Nu en bijna om de tutorial af te ronden, gaan we de code uitvoeren en kijken hoe het werkt, hieronder laat ik 2 afbeeldingen van de uitvoering achter, met Python 3.x in de eerste en in de tweede Python 2.x:
Hier waarderen we de kleine verschillen. Nu gaan we kijken hoe de testmap die we eerder zagen eruit ziet:
De 4 bestanden die .txt hadden zijn veranderd en hebben nu .sh, het lijkt erop dat alleen het test1.sh bestand uitvoerbaar is, dit komt omdat de rest geen data bevat. We gaan het bestand test1.sh uitvoeren, dat alleen de . zal starten ls -l dat we zeiden dat het bevatte, en dus helpt het ons om de machtigingen te zien.
De tutorial eindigt hier, voor het geval het van belang is, een link naar nog een tutorial over Python: zoeken op bestandsnaam.
Vond je deze Tutorial leuk en heb je eraan geholpen?Je kunt de auteur belonen door op deze knop te drukken om hem een positief punt te geven