Python in einem Ordner einen Befehl für jede Datei ausführen
Frage
Ich versuche, einen Python-Skript zu erstellen, das würde:
- Schauen Sie in den Ordner "/ Eingabe"
- Für jedes Video in diesem Ordner ein mencoder Befehl ausführen (sie etwas spielbar auf meinem Handy umcodieren)
- Sobald mencoder seinen Lauf beendet hat, das Original-Video löschen.
Das scheint nicht zu hart, aber ich sauge an Python:)
Alle Ideen, was das Skript aussehen sollte?
Bonus Frage: Soll ich
os.system
oder
subprocess.call
Subprocess.call scheint für ein lesbares Script zu ermöglichen, da ich den Befehl wie folgt schreiben kann:
cmdLine = [ 'mencoder', sourceVideo, '-Ovc', 'Kopieren', '-Oac', 'Kopieren', ‚Ss‘, '00: 02: 54' , '-Endpos', '00: 00: 54' , '-O', destinationVideo]
EDIT: Ok, das funktioniert:
import os, subprocess
bitrate = '100'
mencoder = 'C:\\Program Files\\_utilitaires\\MPlayer-1.0rc2\\mencoder.exe'
inputdir = 'C:\\Documents and Settings\\Administrator\\Desktop\\input'
outputdir = 'C:\\Documents and Settings\\Administrator\\Desktop\\output'
for fichier in os.listdir(inputdir):
print 'fichier :' + fichier
sourceVideo = inputdir + '\\' + fichier
destinationVideo = outputdir + '\\' + fichier[:-4] + ".mp4"
commande = [mencoder,
'-of',
'lavf',
[...]
'-mc',
'0',
sourceVideo,
'-o',
destinationVideo]
subprocess.call(commande)
os.remove(sourceVideo)
raw_input('Press Enter to exit')
Ich habe den mencoder Befehl, der Klarheit halber entfernt und weil ich immer noch daran zu arbeiten.
Vielen Dank an alle für Ihre Eingabe.
Lösung
Um alle Dateinamen verwenden os.listdir()
zu finden.
Dann sind Sie Schleife über die Dateinamen. Wie so:
import os
for filename in os.listdir('dirname'):
callthecommandhere(blablahbla, filename, foo)
Wenn Sie subprocess bevorzugen, verwenden subprocess. : -)
Andere Tipps
Verwenden Sie os.walk rekursiv über den Inhalt von iterieren:
import os
root_dir = '.'
for directory, subdirectories, files in os.walk(root_dir):
for file in files:
print os.path.join(directory, file)
Kein wirklicher Unterschied zwischen os.system und subprocess.call hier - es sei denn, Sie mit seltsam benannten Dateien (Dateinamen mit Leerzeichen, Anführungszeichen usw.) zu tun haben. Wenn dies der Fall ist, subprocess.call ist auf jeden Fall besser, weil Sie nicht tun müssen, um jeden Shell-Angabe auf Dateinamen. os.system ist besser, wenn Sie einen gültigen Shell-Befehl akzeptieren müssen, z.B. erhielt vom Benutzer in der Konfigurationsdatei.
Python könnte für diese zu viel des Guten.
for file in *; do mencoder -some options $file; rm -f $file ; done
AVI
zu MPG
(wählen Sie Ihre Erweiterungen):
files = os.listdir('/input')
for sourceVideo in files:
if sourceVideo[-4:] != ".avi"
continue
destinationVideo = sourceVideo[:-4] + ".mpg"
cmdLine = ['mencoder', sourceVideo, '-ovc', 'copy', '-oac', 'copy', '-ss',
'00:02:54', '-endpos', '00:00:54', '-o', destinationVideo]
output1 = Popen(cmdLine, stdout=PIPE).communicate()[0]
print output1
output2 = Popen(['del', sourceVideo], stdout=PIPE).communicate()[0]
print output2
Oder Sie könnten die os.path.walk Funktion verwenden, die für Sie mehr Arbeit macht als nur os.walk:
Ein dummes Beispiel:
def walk_func(blah_args, dirname,names):
print ' '.join(('In ',dirname,', called with ',blah_args))
for name in names:
print 'Walked on ' + name
if __name__ == '__main__':
import os.path
directory = './'
arguments = '[args go here]'
os.path.walk(directory,walk_func,arguments)
Ich hatte ein ähnliches Problem, mit viel Hilfe von der Bahn und diesem Beitrag habe ich eine kleine Anwendung gemacht, mein Ziel ist VCD und SVCD und ich lösche die Quelle nicht, aber ich denke, wird es ziemlich einfach sein, sich anzupassen Ihre eigenen Bedürfnisse.
Es kann ein Video konvertieren und schneiden oder alle Videos in einem Ordner umwandeln kann, sie umbenennen und sie in einem Unterordner / VCD
Ich füge auch eine kleine Schnittstelle, hoffen, dass jemand anderes es nützlich finden!
habe ich den Code und die Datei in hier btw: http://tequilaphp.wordpress.com/2010/08/27/learning-python-making-a-svcd-gui/