Al utilizar Python para ejecutar un comando en cada archivo en una carpeta
Pregunta
Estoy intentando crear un script en Python que haría:
- Mira en la carpeta "/ entrada"
- Para cada vídeo de dicha carpeta, ejecute un comando mencoder (transcodificarlos a algo reproducir en mi teléfono)
- Una vez mencoder ha terminado su carrera, elimine el vídeo original.
Eso no parece demasiado duro, pero soy muy malo en Python:)
¿Alguna idea sobre lo que el guión debe ser similar?
Bono pregunta: ¿Debo usar
os.system
o
subprocess.call
Subprocess.call parece permitir una escritura más legible, ya que puedo escribir el comando como el siguiente:
cmdLine = [ 'mencoder', sourceVideo, '-Ovc', 'Copiar', '-Oac', 'Copiar', 'SS', '00: 02: 54' , '-Endpos', '00: 00: 54' , '-O', destinationVideo]
EDIT: Ok, que funciona:
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')
He quitado el comando mencoder, para mayor claridad y porque todavía estoy trabajando en ello.
Gracias a todos por su entrada.
Solución
Para encontrar todos los nombres de archivo utilizan os.listdir()
.
A continuación, un bucle sobre los nombres de archivo. De esta manera:
import os
for filename in os.listdir('dirname'):
callthecommandhere(blablahbla, filename, foo)
Si prefiere subproceso, utilice subproceso. : -)
Otros consejos
os.walk para recorrer de forma recursiva sobre el contenido del directorio:
import os
root_dir = '.'
for directory, subdirectories, files in os.walk(root_dir):
for file in files:
print os.path.join(directory, file)
No hay diferencia real entre os.system y subprocess.call aquí - a menos que usted tiene que tratar con archivos de nombre extraño (nombres de archivo, incluidos los espacios, comillas, etc.). Si este es el caso, subprocess.call es definitivamente mejor, ya que no es necesario hacer ninguna concha cotización en los nombres de archivo. os.system es mejor cuando se necesita para aceptar cualquier comando válido cáscara, por ejemplo, recibido de usuario en el archivo de configuración.
Python podría ser excesiva para esto.
for file in *; do mencoder -some options $file; rm -f $file ; done
AVI
a MPG
(escoger sus extensiones):
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
O puede utilizar la función os.path.walk, lo que hace más trabajo para usted que sólo os.walk:
Un ejemplo estúpida:
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)
He tenido un problema similar, con un montón de ayuda de la web y este post que hice una pequeña aplicación, mi objetivo es VCD y SVCD y no eliminar la fuente, pero calculo que será bastante fácil de adaptar a sus propias necesidades.
Puede convertir vídeo 1 y cortarlo o puede convertir todos los vídeos en una carpeta, cambiar el nombre de ellos y ponerlos en una subcarpeta / VCD
También añado una pequeña interfaz, espero que otra persona ha resultado útil!
pongo el código y archivo en cierto aquí: http://tequilaphp.wordpress.com/2010/08/27/learning-python-making-a-svcd-gui/