In acest Tutorial Python hai să vedem un script care va fi schimbați aspectul .txt la .sh în fișiere, și va oferi, de asemenea, permisiuni de execuție pentru utilizator. Pentru această sarcină vom folosi module pe care le avem deja în Python, scriptul este valabil atât pentru versiunea 2.X, cât și pentru 3.X, deși ieșirea este ușor diferită, comportamentul nu se modifică, așa cum vom vedea mai târziu.
NotăScriptul care trebuie implementat este destinat utilizării pe sistemele de operare UNIX.
Pentru exemplu, am creat un folder cu mai multe fișiere, unele au o extensie .txt, iar altele nu, și există și un fișier numit test1.txt care are o comandă mică: ls -l. Este pentru a verifica dacă este efectiv executat, deoarece restul sunt „lipicioase”, deoarece nu conțin date. Conținutul folderului poate fi văzut în următoarea imagine:
Dacă facem un ls -l vedem că niciunul nu are permisiuni de execuție:
Acum vom vedea codul complet și acesta va fi explicat mai jos.
import os, sys, stat from subprocess import Popen, PIPE if (len (sys.argv) <2): print ("Calea de căutat este obligatorie") sys.exit (0) elif (nu os.path.exists (sys.argv [1])): print ("Not found:" + str (sys.argv [1])) sys.exit (0) process = Popen (["find", sys.argv [1]] , stdout = PIPE, stderr = PIPE) dacă nu process.stderr.read (): num = 0 pentru linie în process.stdout.readlines (): lineNew = line.decode ("UTF-8"). strip () dacă (".txt" în lineNew și 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 ("Work done, modified", num, "files") else: print ("Error")Vom începe cu explicația codului pas cu pas, primul lucru pe care îl facem este să importăm modulele de care vom avea nevoie.
import os, sys, stat from subprocess import Popen, PIPEApoi vom verifica dacă am primit un argument și este un traseu, pentru a vedea dacă continuăm cu scriptul sau nu.
if (len (sys.argv) <2): print ("Calea de căutat este necesară") sys.exit (0) elif (nu os.path.exists (sys.argv [1])): print ( „Nu s-a găsit:” + str (sys.argv [1])) sys.exit (0)Pentru a continua, folosim Popen a modulului subproces, captăm ieșirea standard și ieșirea de eroare, facem acest lucru cu ajutorul TUB, O țeavă. Acum putem citi din conductă ca și cum ar fi un fișier.
process = Popen (["găsi", sys.argv [1]], stdout = PIPE, stderr = PIPE)Pentru a afla dacă să continuăm, verificăm dacă există o eroare (stocată în proces.stderr) cu următoarele dacă:
dacă nu process.stderr.read ():Dacă există o eroare, aceasta va fi afișată pe ecranul Eroare (aceasta este pentru ramura else, care nu are alte explicații) și programul se încheie. Dacă nu, ceea ce vom face este să citim din conducta de ieșire standard (stdout). O facem linie cu linie cu a for, trebuie să decodăm ieșirea, în acest caz optez pentru UTF-8, deoarece cu ASCII ar da erori cu accentele de exemplu.
Dacă ne uităm la bucla for, vedem că verificăm dacă linia citită conține .txt, dacă da, se verifică și dacă este un fișier (nu suntem interesați să schimbăm un folder care conține .txt). Dacă acest lucru este adevărat, folosim funcția a inlocui din Python pentru a schimba .txt în .sh și apoi cu funcția chmod a modulului vă oferim permisiuni, care vor fi execuție, citire și scriere pentru utilizator, citire și execuție pentru grup și nimic pentru alții. După cum puteți vedea, folosim modulul stat.
Variabila num pe care o veți vedea în cod este utilizată pur și simplu pentru a ține evidența numărului de fișiere pe care le schimbăm și astfel, în final, pentru a putea afișa informații pe ecran.
pentru linia în proces.stdout.readlines (): lineNew = line.decode ("UTF-8"). strip () if (". txt" în lineNew și 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 + = 1La sfârșitul buclei for, ceea ce facem este să arătăm informațiile despre care vorbim, aici vom găsi diferența dintre versiunea 2.x și 3.x, deoarece virgulele dinainte și după num în versiunea 2 o fac parte intr-o lista si in cele 3 iti arata normal (fara lista).
print („Lucrare finalizată, schimbare”, num, „fișiere”)Acest lucru poate fi modificat pentru a fi interpretat la fel folosind + și convertirea variabilei num într-un șir cu funcția str, sau prin %, mai jos sunt cele 2 coduri:
print ("Lucrare terminată, schimbare" + str (num) + "fișiere") print ("Lucrare terminată, schimbare% d fișiere"% num)A fost lăsat în primul mod de a arăta că între versiunile Python există modificări (pot fi mici ca în acest caz, dar ceva care funcționează în versiunea 3 poate să nu funcționeze în versiunea 2 și invers).
Acum și aproape să terminăm tutorialul, vom executa codul și vom vedea cum funcționează, mai jos las 2 imagini ale execuției, folosind Python 3.x în prima și în a doua Python 2.x:
Aici apreciem diferențele ușoare. Acum vom vedea cum arată folderul de testare pe care l-am văzut înainte:
Cele 4 fișiere care aveau .txt au fost modificate și au acum .sh, se pare că numai fișierul test1.sh este executabil, asta pentru că restul nu conțin date. Vom executa fișierul test1.sh, care va lansa doar fișierul ls -l că am spus că conține și, astfel, ne ajută să vedem permisiunile.
Tutorialul se încheie aici, în cazul în care este de interes, un link către un alt tutorial pe Python: căutare după numele fișierului.
V-a plăcut și ați ajutat acest tutorial?Puteți recompensa autorul apăsând acest buton pentru a-i oferi un punct pozitiv