Usando Python para executar um comando em cada arquivo em uma pasta
Pergunta
Eu estou tentando criar um script Python que:
- Olhe para a pasta "/ input"
- Para cada vídeo nessa pasta, execute um comando mencoder (para transcodificar-los para algo jogável no meu telefone)
- Uma vez mencoder terminou sua corrida, exclua o vídeo original.
Isso não parece muito difícil, mas eu chupar a python:)
Algumas ideias sobre o que o script deve ser semelhante?
Bônus pergunta: Devo usar
os.system
ou
subprocess.call
?
Subprocess.call parece permitir um script mais legível, desde que eu posso escrever o comando como este:
cmdLine = [ 'mencoder', sourceVideo, '-Ovc', 'cópia de', '-Oac', 'cópia de', '-Ss', '00: 02: 54' , '-endpos', '00: 00: 54' , '-O', destinationVideo]
EDIT: Ok, que as obras:
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')
Eu removi o comando mencoder, para maior clareza e porque eu ainda estou trabalhando nisso.
Obrigado a todos por sua entrada.
Solução
Para encontrar todos os nomes de arquivos usar os.listdir()
.
Então você loop sobre os nomes dos arquivos. Como assim:
import os
for filename in os.listdir('dirname'):
callthecommandhere(blablahbla, filename, foo)
Se você preferir subprocesso, o uso subprocesso. : -)
Outras dicas
Use os.walk para iterate de forma recursiva sobre o conteúdo diretório:
import os
root_dir = '.'
for directory, subdirectories, files in os.walk(root_dir):
for file in files:
print os.path.join(directory, file)
Não há diferença real entre os.system e subprocess.call aqui - a menos que você tem que lidar com arquivos de nome estranho (nomes de arquivos incluindo espaços, aspas e assim por diante). Se este for o caso, subprocess.call é definitivamente melhor, porque você não precisa fazer qualquer shell de citar em nomes de arquivos. os.system é melhor quando você precisa aceitar qualquer comando shell válido, por exemplo, recebeu do usuário no arquivo de configuração.
Python pode ser um exagero para isso.
for file in *; do mencoder -some options $file; rm -f $file ; done
AVI
para MPG
(escolher suas extensões):
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 você pode usar a função os.path.walk, o que faz mais trabalho para você do que apenas os.walk:
Um exemplo estúpido:
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)
Eu tive um problema semelhante, com um monte de ajuda da web e este post que fiz uma pequena aplicação, o meu objectivo é VCD e SVCD e eu não exclua a fonte, mas eu acho que vai ser bastante fácil de se adaptar às suas próprias necessidades.
Pode converter um vídeo e cortá-la ou pode converter todos os vídeos em uma pasta, renomeá-los e colocá-los em uma subpasta / VCD
Eu também adicionar uma interface pequena, esperança alguém encontrá-lo! Útil
Eu coloquei o código e arquivo aqui btw: http://tequilaphp.wordpress.com/2010/08/27/learning-python-making-a-svcd-gui/