En utilisant Python pour exécuter une commande sur chaque fichier dans un dossier
Question
Je suis en train de créer un script Python qui:
- Regardez dans le dossier "/ entrée"
- Pour chaque vidéo dans ce dossier, exécutez une commande mencoder (pour les transcoder à quelque chose jouable sur mon téléphone)
- Une fois mencoder a terminé sa course, supprimer la vidéo originale.
Cela ne semble pas trop difficile, mais je sucent python:)
Toutes les idées sur ce que devrait ressembler le script?
Question bonus: Dois-je utiliser
os.system
ou
subprocess.call
Subprocess.call semble permettre un script plus lisible, puisque je peux écrire la commande comme ceci:
cmdLine = [ 'mencoder', sourceVideo, '-Ovc', 'copie', '-Oac', 'copie', '-Ss', '00: 02: 54' , '-Endpos', '00: 00: 54' , -O, destinationVideo]
EDIT: Ok, qui fonctionne:
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')
Je l'ai enlevé la commande mencoder, pour plus de clarté et parce que je travaille encore.
Merci à tous pour vos commentaires.
La solution
Pour tous les noms de fichiers utilisent os.listdir()
.
Ensuite, on boucle sur les noms de fichiers. Comme ceci:
import os
for filename in os.listdir('dirname'):
callthecommandhere(blablahbla, filename, foo)
Si vous préférez le sous-processus, utilisez le sous-processus. : -)
Autres conseils
Utilisez os.walk pour itérer récursivement sur le contenu du répertoire:
import os
root_dir = '.'
for directory, subdirectories, files in os.walk(root_dir):
for file in files:
print os.path.join(directory, file)
Pas de différence réelle entre os.system et subprocess.call ici - à moins que vous avez à traiter avec des fichiers étrangement nommées (noms de fichiers, y compris des espaces, des guillemets et ainsi de suite). Si tel est le cas, subprocess.call est certainement mieux, parce que vous n'avez pas besoin de faire une coquille citant les noms de fichiers. os.system est mieux quand vous devez accepter toute commande shell valide, par exemple reçus de l'utilisateur dans le fichier de configuration.
Python pourrait être surpuissant pour cela.
for file in *; do mencoder -some options $file; rm -f $file ; done
AVI
à MPG
(choisir vos extensions):
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
Ou vous pouvez utiliser la fonction os.path.walk, qui fait plus de travail pour vous que juste os.walk:
Un exemple stupide:
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)
J'ai eu un problème similaire, avec beaucoup d'aide sur le web et ce post, je fait une petite application, mon objectif est VCD et SVCD et je ne supprime pas la source, mais je pense qu'il sera assez facile d'adapter à vos propres besoins.
Il peut convertir 1 vidéo et le couper ou peut convertir toutes les vidéos dans un dossier, les renommer et les mettre dans un sous-dossier / VCD
J'ajoute également une petite interface, espère que quelqu'un d'autre trouver utile!
Je mets le code et le fichier ici BTW: http://tequilaphp.wordpress.com/2010/08/27/learning-python-making-a-svcd-gui/