В това Урок по Python нека видим скрипт, който ще променете външния вид на .txt на .sh във файловете, и също така ще даде разрешения за изпълнение на потребителя. За тази задача ще използваме модули, които вече имаме в Python, скриптът е валиден както за версии 2.X, така и за 3.X, въпреки че изходът е малко по -различен, поведението не се променя, както ще видим по -късно.
ЗабележкаСкриптът, който трябва да се внедри, е за използване в операционни системи UNIX.
За пример създадох папка с няколко файла, някои имат разширение .txt, а други не, а има и файл, наречен test1.txt, който има малка команда: ls -l. Той трябва да провери дали действително е изпълнен, тъй като останалите са "лепкави", тъй като не съдържат данни. Съдържанието на папката може да се види на следното изображение:
Ако направим а ls -l виждаме, че никой няма разрешения за изпълнение:
Сега ще видим пълния код и той ще бъде обяснен по -долу.
import os, sys, stat от подпроцеса import Popen, PIPE if (len (sys.argv) <2): print ("Изисква се пътят за търсене") sys.exit (0) elif (не os.path.exists (sys.argv [1])): print ("Не е намерено:" + str (sys.argv [1])) sys.exit (0) process = Popen (["find", sys.argv [1]] , stdout = PIPE, stderr = PIPE), ако не process.stderr.read (): num = 0 за ред в process.stdout.readlines (): lineNew = line.decode ("UTF-8"). strip () if (".txt" в lineNew и os.path.isfile (lineNew)): new = lineNew.replace (". txt", ". sh") os.rename (lineNew, new) os.chmod (new, stat. S_IXUSR + stat.Ще започнем с обяснението на кода стъпка по стъпка, първото нещо, което правим, е да импортираме модулите, от които ще се нуждаем.
импортиране на os, sys, stat от подпроцеса импортиране Popen, PIPEСлед това ще проверим дали сме получили аргумент и дали е маршрут, за да видим дали продължаваме със скрипта или не.
if (len (sys.argv) <2): print ("Пътят за търсене е задължителен") sys.exit (0) elif (не os.path.exists (sys.argv [1])): print ( "Не е намерено:"+ str (sys.argv [1])) sys.exit (0)За да продължим, използваме Попен на модула подпроцес, улавяме стандартния изход и изхода за грешка, правим това с помощта на ТРЪБА, Тръба. Сега можем да четем от тръбопровода, сякаш е файл.
process = Popen (["find", sys.argv [1]], stdout = PIPE, stderr = PIPE)За да знаем дали да продължим, проверяваме дали има грешка (съхранена в process.stderr) със следното, ако:
ако не process.stderr.read ():Ако има грешка, тя ще се покаже на екрана Error (това е за клона else, който няма допълнително обяснение) и програмата приключва. Ако не, това, което ще направим, се чете от стандартната изходна тръба (stdout). Правим го ред по ред с for, трябва да декодираме изхода, в този случай аз избирам UTF-8, тъй като с ASCII той би дал грешки с акцентите например.
Ако продължаваме да разглеждаме цикъла for, виждаме, че проверяваме дали четеният ред съдържа .txt, ако е така също се проверява дали е файл (не се интересуваме от промяна на папка, която съдържа .txt). Ако това е вярно, използваме функцията замени на Python, за да промените .txt на .sh, а след това с функцията chmod на модула ви даваме разрешения, които ще бъдат изпълнение, четене и писане за потребителя, четене и изпълнение за групата и нищо за други. Както можете да видите, ние използваме модула stat.
Променливата num, която ще видите в кода, просто се използва за проследяване на броя на файловете, които променяме и по този начин в крайна сметка за да можем да показваме информация на екрана.
за ред в process.stdout.readlines (): lineNew = line.decode ("UTF-8"). strip () if (". txt" в lineNew и 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В края на цикъла for това, което правим, е да покажем информацията, за която говорим, тук ще открием разликата между версия 2.x и 3.x, тъй като запетаите преди и след num във версия 2 го разделят в списък и в 3 показва нормално (без списък).
print ("Работата е извършена, променена", num, "files")Това може да се промени, за да се тълкува по същия начин с помощта на + и преобразуване на променливата num в низ с функцията ул, или чрез %, по -долу са 2 кода:
print ("Работата е извършена, променена" + str (num) + "files") print ("Работата е извършена, променени% d файлове"% num)Първият начин беше оставен да покаже, че между версиите на Python има промени (те могат да бъдат малки, както в този случай, но нещо, което работи във версия 3, може да не работи във версия 2 и обратно).
Сега и почти да завършим урока, ще изпълним кода и ще видим как работи, по -долу оставям 2 изображения на изпълнението, използвайки Python 3.x в първия, а във втория Python 2.x:
Тук оценяваме малките разлики. Сега ще видим как изглежда папката за тестване, която видяхме преди:
Четирите файла, които имат .txt, са променени и сега имат .sh, изглежда, че само файлът test1.sh е изпълним, това е така, защото останалите не съдържат данни. Ще изпълним файла test1.sh, който ще стартира само ls -l казахме, че съдържа, и така ни помага да видим разрешенията.
Урокът завършва тук, в случай че представлява интерес, връзка към друг урок за Python: търсене по име на файл.
Хареса ли ви и помогнахте на този урок?Можете да възнаградите автора, като натиснете този бутон, за да му дадете положителна точка