2011-02-02 6 views
0

J'ai un script python qui fonctionne sur trois fichiers de la façon suivante align.py * .wav * .txt * .TextGrid Cependant, j'ai un répertoire plein de fichiers que je veux boucle à travers. L'auteur original suggère de créer un script shell pour parcourir les fichiers. La partie la plus délicate de la boucle est que je dois faire correspondre trois fichiers à la fois avec trois extensions différentes pour que le script s'exécute correctement. Quelqu'un peut-il m'aider à comprendre comment créer un script shell pour faire une boucle dans un répertoire de fichiers, en faire correspondre trois d'après le nom (avec trois extensions différentes) et exécuter le script python sur chaque triplet? Merci!Script shell UNIX pour appeler python

+1

S'il y aura un fichier wave et txt pour chaque fichier TextGrid, alors je modifierais simplement le script python pour inférer les noms de ces deux, et seulement lui passer la liste * .TextGrid. Est-il faisable pour vous de changer le script python? – DSimon

+0

Veuillez ajouter quelques exemples de fichiers et comment vous souhaitez qu'ils soient traités. Votre question ne décrit pas suffisamment ce que vous cherchez. – chmullig

+1

Vous n'avez pas besoin de script shell du tout; Python est capable de regarder à travers les répertoires lui-même .. – poke

Répondre

0

Vous pouvez utiliser glob.glob pour répertorier uniquement les wav fichiers, puis construire l'appel comme si subprocess.Popen:

import glob 
import os 
import subprocess 

for wav_name in glob.glob('*.wav'): 
    basename,ext = os.path.splitext(wav_name) 
    txt_name=basename+'.txt' 
    grid_name=basename+'.TextGrid' 
    proc=subprocess.Popen(['align.py',wav_name,txt_name,grid_name]) 
    proc.communicate() 
3

En supposant que vous utilisez bash, voici un one-liner:

for f in *.wav; do align.py $f ${f%\.*}.txt ${f%\.*}.TextGrid; done 
+0

Cela fonctionne très bien! – Alex

Questions connexes