Usare Python per eseguire un comando su ogni file in una cartella
Domanda
Sto cercando di creare uno script Python che sarebbe:
- Cercare nella cartella "/ ingresso"
- Per ogni video in quella cartella, eseguire un comando mencoder (per convertirli in qualcosa di giocabile sul mio cellulare)
- Una volta mencoder ha terminato la sua corsa, eliminare il video originale.
Non mi sembra troppo difficile, ma faccio schifo a python:)
Tutte le idee su ciò che lo script dovrebbe essere simile?
Domanda bonus: Dovrei usare
os.system
o
subprocess.call
Subprocess.call sembra per consentire uno script più leggibile, dal momento che posso scrivere il comando come questo:
cmdLine = [ 'mencoder', sourceVideo, '-Ovc', 'copia', '-Oac', 'copia', '-Ss', '00: 02: 54' , '-Endpos', '00: 00: 54' , '-O', destinationVideo]
EDIT: Ok, che funziona:
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')
Ho rimosso il comando mencoder, per chiarezza e perché mi sto ancora lavorando su di esso.
Grazie a tutti per il vostro input.
Soluzione
Per trovare tutti i nomi di file utilizzano os.listdir()
.
Poi si esegue un ciclo sopra i nomi dei file. In questo modo:
import os
for filename in os.listdir('dirname'):
callthecommandhere(blablahbla, filename, foo)
Se si preferisce sottoprocesso, utilizzare sottoprocesso. : -)
Altri suggerimenti
os.walk per scorrere in modo ricorsivo sul contenuto di directory:
import os
root_dir = '.'
for directory, subdirectories, files in os.walk(root_dir):
for file in files:
print os.path.join(directory, file)
Nessun vera differenza tra os.system e subprocess.call qui - se non si ha a che fare con i file stranamente nome (i nomi dei file inclusi gli spazi, le virgolette e così via). Se questo è il caso, subprocess.call è sicuramente meglio, perché non c'è bisogno di fare qualsiasi shell-on citando i nomi dei file. os.system è migliore quando si ha bisogno di accettare qualsiasi comando shell valida, ad esempio, ricevuta dall'utente nel file di configurazione.
Python potrebbe essere eccessivo per questo.
for file in *; do mencoder -some options $file; rm -f $file ; done
AVI
a MPG
(pick le estensioni):
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
In alternativa è possibile utilizzare la funzione di os.path.walk, che fa più lavoro per voi che solo os.walk:
Un esempio stupido:
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)
Ho avuto un problema simile, con un sacco di aiuto dal web e questo post ho fatto una piccola applicazione, il mio obiettivo è VCD e SVCD e non eliminare l'origine, ma mi sa che sarà abbastanza facile da adattare alle proprie esigenze.
E 'possibile convertire il video 1 e tagliarlo o può convertire tutti i video in una cartella, rinominarli e metterli in una sottocartella / VCD
Ho anche aggiungere una piccola interfaccia, spero che qualcun altro sia utile!
ho messo il codice e file in qui btw: http://tequilaphp.wordpress.com/2010/08/27/learning-python-making-a-svcd-gui/