Dosyaları yeniden adlandırın ve Python komut dosyası yürütme izni verin

İçindekiler

Bunda Python eğitimi hadi bir komut dosyası görelim dosyalarda .txt görünümünü .sh olarak değiştirin, ve ayrıca kullanıcı için yürütme izinleri verir. Bu görev için Python'da zaten sahip olduğumuz modülleri kullanacağız, komut dosyası hem 2.X hem de 3.X sürümü için geçerlidir, çıktı biraz farklı olsa da, daha sonra göreceğimiz gibi davranış değişmez.

NotUygulanacak komut dosyası UNIX işletim sistemlerinde kullanım içindir.

Örnek için birkaç dosya içeren bir klasör oluşturdum, bazılarının .txt uzantısı var, bazılarının yok ve ayrıca test1.txt adında küçük bir komutu olan bir dosya var: ls -l. Geri kalanı veri içermediğinden "yapışkan" olduğundan, gerçekten yürütüldüğünü doğrulamak içindir. Klasörün içeriği aşağıdaki resimde görülebilir:

bir yaparsak ls -l hiçbirinin yürütme iznine sahip olmadığını görüyoruz:

Şimdi tam kodu göreceğiz ve aşağıda açıklanacaktır.

 os, sys, stat alt işlemden içe aktar Popen, PIPE if (len (sys.argv) <2): print ("Aranacak yol gereklidir") sys.exit (0) elif (os.path.exists değil) ( sys.argv [1])): print ("Bulunamadı:" + str (sys.argv [1])) sys.exit (0) process = Popen (["find", sys.argv [1]] , stdout = BORU, stderr = BORU) değilse process.stderr.read (): process.stdout.readlines içindeki satır için num = 0: lineNew = line.decode ("UTF-8"). (lineNew ve os.path.isfile (lineNew) içinde ".txt"): yeni = lineNew.replace (". txt", ". sh") os.rename (lineNew, yeni) os.chmod (yeni, stat. S_IXUSR + stat.S_IRUSR + stat.S_IWUSR + stat.S_IRGRP + stat.S_IXGRP) num + = 1 print ("İş yapıldı, değiştirildi", num, "dosyalar") başka: print ("Hata")
Adım adım kodun açıklamasıyla başlayacağız, yapacağımız ilk şey ihtiyaç duyacağımız modülleri içe aktarmak.
 os, sys, stat alt işlemden içe aktar Popen, PIPE
Ardından, komut dosyasına devam edip etmediğimizi görmek için bir argümanın geçip geçmediğini ve bunun bir rota olup olmadığını kontrol edeceğiz.
 if (len (sys.argv) <2): print ("Arayacak yol gereklidir") sys.exit (0) elif (os.path.exists değil (sys.argv [1])): print ( " Bulunamadı: "+ str (sys.argv [1])) sys.exit (0)
Devam etmek için kullanıyoruz popen modülün alt süreç, standart çıktıyı ve hata çıktısını yakalıyoruz, bunu yardımıyla yapıyoruz BORU, Bir boru. Artık boru hattından bir dosyaymış gibi okuyabiliriz.
 süreç = Popen (["find", sys.argv [1]], stdout = BORU, stderr = BORU)
Devam edip etmeyeceğimizi bilmek için bir hata olup olmadığını kontrol ederiz ( süreç.stderr) aşağıdaki durumlarda:
 process.stderr.read() değilse:
Bir hata varsa Hata ekranına gelir (bu, başka bir açıklaması olmayan else şubesi içindir) ve program sona erer. Değilse, yapacağımız şey standart çıkış borusundan okumaktır (standart). Bunu bir for ile satır satır yapıyoruz, çıktının kodunu çözmeliyiz, bu durumda UTF-8'i seçiyorum, çünkü ASCII ile örneğin aksanlarda hatalar verecektir.

For döngüsüne bakmaya devam edersek, okunan satırın .txt içerip içermediğini kontrol ettiğimizi görürüz, eğer öyleyse bir dosya olup olmadığı da kontrol edilir (.txt içeren bir klasörü değiştirmekle ilgilenmiyoruz). Bu doğruysa, işlevi kullanırız yer değiştirmek Python'un .txt'yi .sh olarak değiştirmesini ve ardından modülün chmod işleviyle size kullanıcı için yürütme, okuma ve yazma, grup için okuma ve yürütme ve diğerleri için hiçbir şey olmayan izinler veriyoruz. Gördüğünüz gibi stat modülünü kullanıyoruz.

Kodda göreceğiniz num değişkeni, değiştirdiğimiz dosya sayısını takip etmek ve böylece sonunda bilgileri ekranda gösterebilmek için kullanılır.

 process.stdout.readlines () içindeki satır için: lineNew = line.decode ("UTF-8").şerit () if (".txt" lineNew ve os.path.isfile (lineNew)): yeni = lineNew. (". txt", ". sh") os.rename (lineNew, yeni) os.chmod (yeni, stat.S_IXUSR + stat.S_IRUSR + stat.S_IWUSR + stat.S_IRGRP + stat.S_IXGRP) num + = 1
For döngüsünün sonunda, yaptığımız şey bahsettiğimiz bilgiyi göstermektir, bu, sürüm 2.x ve 3.x arasındaki farkı bulacağımız yerdir, çünkü sürüm 2'deki num'dan önceki ve sonraki virgüller, bir listede ve 3'te sizi normal (listesiz) gösterir.
 print ("İş yapıldı, değiştirildi", num, "dosyalar")
Bu, kullanılarak aynı şekilde yorumlanacak şekilde değiştirilebilir. + ve num değişkenini işlevle bir dizgeye dönüştürmek caddeveya aracılığıyla %, 2 kod aşağıdadır:
 print ("Yapılan iş, değişti" + str (sayı) + "dosyalar") print ("İş yapıldı, değişti % d dosya"% num)
Python sürümleri arasında değişiklikler olduğunu göstermek için ilk şekilde bırakıldı (bu durumda olduğu gibi küçük olabilirler, ancak sürüm 3'te çalışan bir şey sürüm 2'de çalışmayabilir veya tam tersi).

Şimdi ve öğreticiyi neredeyse bitirmek üzere, kodu çalıştıracağız ve nasıl çalıştığını göreceğiz, aşağıda ilkinde Python 3.x ve ikincisinde Python 2.x kullanarak yürütmenin 2 görüntüsünü bırakıyorum:

Burada küçük farklılıkları takdir ediyoruz. Şimdi daha önce gördüğümüz test klasörünün nasıl göründüğünü göreceğiz:

.txt'ye sahip 4 dosya değiştirildi ve şimdi .sh var, sadece test1.sh dosyasının yürütülebilir olduğu görülüyor, bunun nedeni geri kalanların veri içermemesidir. Test1.sh dosyasını çalıştıracağız, bu sadece ls -l içerdiğini söyledik ve bu yüzden izinleri görmemize yardımcı oluyor.

Öğretici, ilgi çekici olması durumunda burada sona eriyor, bir bağlantı Python'da başka bir eğitim: dosya adına göre arama yapın.

Bu Eğitimi beğendiniz ve yardım ettiniz mi?Yazara olumlu puan vermek için bu düğmeye basarak yazarı ödüllendirebilirsiniz.
wave wave wave wave wave