web-dev-qa-db-fra.com

Comment exécuter plusieurs fichiers Python en exécutant un code de terminal?

Pour mon projet d'exploration de texte (avec un Enronensemble de données ), j'ai ce script Python:

from glob import glob
import fileinput
with open('/media/output/inbox.txt', 'w') as out:
for line in fileinput.input(glob('*.')):
    if 'Subject:' in line:
        out.write(line)

Dans plus de 1000 dossiers avec une structure de dossier en une étape comme celle-ci,

-folder
  --folder 2.

en utilisant cette commande de terminal et cela fonctionne parfaitement.

find allen-p fischer-m kitchen-l phanis-s smith-m arnold-j forney-j kuykendall-t pimenov-v solberg-g ,,,,,,,,,,, zufferli-j -maxdepth 1 -exec cp file.py {} \;

En examinant le script Python, j'essaie d'extraire une ligne particulière d'un fichier et de la coller dans un autre fichier.

Ensuite, j'ai réalisé que je devais exécuter ces scripts un par un.

Comment puis-je exécuter chaque script automatiquement l'un après l'autre et avec toute la structure de dossiers?

Je recherche un code terminal comme ci-dessus ou un script Python.

3
Miller

Vous n'avez pas besoin de copier le script dans chaque répertoire. Modifiez simplement la commande find pour l'exécuter à la place:

find allen-p ... zufferli-j -maxdepth 1 -type d -execdir python "$PWD"/file.py \;

L'option -execdir exécute la commande dans chaque répertoire. Nous utilisons $PWD pour indiquer le chemin complet du script, de sorte qu'un changement de répertoire de travail n'affecte pas l'emplacement dans lequel la commande cherche le script.

Cependant, puisque vous l'avez quand même copié, vous pouvez ignorer le $PWD:

find allen-p ... zufferli-j -maxdepth 1 -type d -execdir python file.py \;

Remarque

Vous n'avez pas fourni de vérification de type dans votre commande find (comme je l'ai fait avec -type d ci-dessus). Sans lui, le fichier tous de ces répertoires a été remplacé par file.py. Vous voulez seulement copier dans (et exécuter) des répertoires, vous devriez donc avoir ajouté un -type d.

3
muru

Vous pouvez également écrire une boucle qui se déplace dans chaque répertoire et exécute le script avant de revenir en arrière:

for dir in allen-p fischer-m ... solberg-g; do
    cd "$d" && /path/to/python/script.py && ../
done

Notez que cela échouera si le script python échoue dans l’un des répertoires.

1
terdon