2010-04-09 7 views
4

J'ai un script Python qui lit un fichier csv de texte et crée un fichier de liste de lecture. Cependant, je ne peux que faire un à la fois, comme:Exécution d'un script Python sur tous les fichiers d'un répertoire

python playlist.py foo.csv foolist.txt 

Cependant, j'ai un répertoire de fichiers qui doivent être transformés en une liste de lecture, avec des noms différents, et parfois un nombre différent de fichiers. Jusqu'à présent, j'ai regardé la création d'un fichier txt avec une liste de tous les noms du fichier dans le répertoire, puis la boucle à travers chaque ligne de cela, mais je sais qu'il doit y avoir un moyen plus facile de le faire.

+0

* et quelques fois il y a plus de overs * Qu'est-ce que cela signifie? – SilentGhost

+0

@davr; Pourquoi avez-vous retiré le tag bash, peut-être qu'il veut l'utiliser? – falstro

+0

Désolé j'avais la balise bash, comme j'essayais de le faire à travers bash, comme finalement je veux mettre un front de cacao pour bash. Le hack bon marché que j'ai utilisé en lisant des fichiers texte était aussi en bash. – S1syphus

Répondre

7
for f in *.csv; do 
    python playlist.py "$f" "${f%.csv}list.txt" 
done 

Est-ce que cela fera l'affaire? Cela mettra foo.csv dans foolist.txt et abc.csv dans abclist.txt. Ou voulez-vous tous dans le même fichier?

+0

Exactement ce que j'étais après merci. – S1syphus

2

si vous avez le nom du répertoire que vous pouvez utiliser os.listdir

os.listdir(dirname) 

si vous voulez sélectionner uniquement un certain type de fichier, par exemple, seul fichier csv, vous pouvez utiliser le module glob.

+0

ou utilisez simplement '.' comme nom de répertoire? – falstro

+0

@roe: si dans le répertoire de travail, oui. – SilentGhost

3

Il suffit d'utiliser une boucle avec le glob astérisque, en vous assurant que vous citez les choses de façon appropriée pour les espaces dans les noms de fichiers

for file in *.csv; do 
    python playlist.py "$file" >> outputfile.txt; 
done 
3

Est-il un seul répertoire, ou imbriquées?

Ex.

topfile.csv 
topdir 
    --dir1 
     --file1.csv 
     --file2.txt 
     --dir2 
      --file3.csv 
      --file4.csv 

Pour imbriqué, vous pouvez utiliser os.walk(topdir) pour obtenir tous les fichiers et répertoires récursive dans un répertoire.

Vous pouvez configurer votre script pour accepter ou dirs fichiers:

python playlist.py topfile.csv topdir

import sys 
import os 

def main(): 
    files_toprocess = set() 
    paths = sys.argv[1:] 
    for p in paths: 
     if os.path.isfile(p) and p.endswith('.csv'): 
      files_toprocess.add(p) 
     elif os.path.isdir(p): 
      for root, dirs, files in os.walk(p): 
       files_toprocess.update([os.path.join(root, f) 
             for f in files if f.endswith('.csv')]) 
+0

Je vais essayer aussi, c'est un peu capricieux du scénario tel qu'il est – S1syphus

Questions connexes