web-dev-qa-db-fra.com

Utilisation de Python pour exécuter une commande sur chaque fichier d'un dossier

J'essaie de créer un script Python qui:

  1. Regardez dans le dossier "/ input"
  2. Pour chaque vidéo de ce dossier, exécutez une commande mencoder (pour les transcoder en quelque chose de jouable sur mon téléphone)
  3. Une fois que mencoder a terminé sa course, supprimez la vidéo d'origine.

Cela ne semble pas trop difficile, mais je crains à python :)

Des idées sur ce à quoi le script devrait ressembler?

Question bonus: devrais-je utiliser

os.system

ou

subprocess.call

?

Subprocess.call semble permettre un script plus lisible, car je peux écrire la commande comme ceci:

cmdLine = ['mencoder', sourceVideo, '-ovc', 'copy', '-oac', 'copy', '-ss', '00: 02: 54 ',' -endpos ', '00: 00: 54 ',' -o ', destinationVideo]

EDIT: Ok, ça marche:

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')

J'ai supprimé la commande mencoder, pour plus de clarté et parce que je travaille toujours dessus.

Merci à tous pour votre contribution.

51
Manu

Pour trouver tous les noms de fichiers, utilisez os.listdir().

Ensuite, vous bouclez sur les noms de fichiers. Ainsi:

import os
for filename in os.listdir('dirname'):
     callthecommandhere(blablahbla, filename, foo)

Si vous préférez le sous-processus, utilisez le sous-processus. :-)

105
Lennart Regebro

Utilisez os.walk pour parcourir de manière récursive 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)

Il n'y a pas de réelle différence entre os.system et subprocess.call ici - à moins que vous n'ayez à gérer des fichiers aux noms étranges (noms de fichiers comprenant des espaces, des guillemets, etc.). Si tel est le cas, subprocess.call est définitivement meilleur, car vous n'avez pas besoin de faire de citations Shell sur les noms de fichiers. os.system est meilleur lorsque vous devez accepter une commande Shell valide, par exemple reçu de l'utilisateur dans le fichier de configuration.

25
Maciej Pasternacki

Python pourrait être exagéré pour cela.

for file in *; do mencoder -some options $file; rm -f $file ; done
11
Kurt

AVI à MPG (choisissez 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
3
gimel

J'ai eu un problème similaire, avec beaucoup d'aide du Web et ce post j'ai fait une petite application, ma cible est VCD et SVCD et je ne supprime pas la source mais je pense qu'il sera assez facile de l'adapter à la vôtre Besoins.

Il peut convertir 1 vidéo et la couper ou peut convertir toutes les vidéos dans un dossier, les renommer et les placer dans un sous-dossier/VCD

J'ajoute également une petite interface, j'espère que quelqu'un d'autre la trouvera utile!

Je mets le code et le fichier ici btw: http://tequilaphp.wordpress.com/2010/08/27/learning-python-making-a-svcd-gui/

1
itzco

Ou vous pouvez utiliser la fonction os.path.walk, qui fait plus de travail pour vous que simplement 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 __== '__main__':
    import os.path
    directory = './'
    arguments = '[args go here]'
    os.path.walk(directory,walk_func,arguments)
1
job