Comment puis-je parcourir les fichiers d'un répertoire donné?

556

J'ai besoin de parcourir tous les .asmfichiers d'un répertoire donné et de faire quelques actions dessus.

Comment cela peut-il être fait de manière efficace?

Itzik984
la source

Réponses:

808

Réponse originale:

import os

for filename in os.listdir(directory):
    if filename.endswith(".asm") or filename.endswith(".py"): 
         # print(os.path.join(directory, filename))
        continue
    else:
        continue

Version Python 3.6 de la réponse ci-dessus, en utilisant os- en supposant que vous avez le chemin du répertoire en tant strqu'objet dans une variable appelée directory_in_str:

import os

directory = os.fsencode(directory_in_str)

for file in os.listdir(directory):
     filename = os.fsdecode(file)
     if filename.endswith(".asm") or filename.endswith(".py"): 
         # print(os.path.join(directory, filename))
         continue
     else:
         continue

Ou récursivement, en utilisant pathlib:

from pathlib import Path

pathlist = Path(directory_in_str).glob('**/*.asm')
for path in pathlist:
     # because path is object not string
     path_in_str = str(path)
     # print(path_in_str)
anselm
la source
1
Cela semble simplement lister les répertoires ou fichiers immédiatement sous un répertoire. La réponse de pedromateo ci-dessous semble faire une liste récursive.
Jay Sheth
8
Veuillez noter que dans le répertoire Python 3.6, le répertoire devrait être en octets, puis listdir crachera une liste de noms de fichiers également en type de données octets, vous ne pouvez donc pas exécuter endswith directement dessus. Ce bloc de code devrait être changé endirectory = os.fsencode(directory_in_str) for file in os.listdir(directory): filename = os.fsdecode(file) if filename.endswith(".asm") or filename.endswith(".py"): # print(os.path.join(directory, filename)) continue else: continue
Kim Stacks
13
print(os.path.join(directory, filename))besoin d'être changé pour print(os.path.join(directory_in_str, filename))le faire fonctionner en python 3.6
Hugo Koopmans
54
Si vous voyez cela en 2017 ou au-delà, os.scandir (dir_str) est maintenant disponible et beaucoup plus propre à utiliser. Pas besoin de fsencode. for entry in os.scandir(path): print(entry.path)
chèvre
2
Préférez if filename.endswith((".asm", ".py")):àif filename.endswith(".asm") or filename.endswith(".py"):
Maroloccio
153

Cela parcourra tous les fichiers descendants, pas seulement les enfants immédiats du répertoire:

import os

for subdir, dirs, files in os.walk(rootdir):
    for file in files:
        #print os.path.join(subdir, file)
        filepath = subdir + os.sep + file

        if filepath.endswith(".asm"):
            print (filepath)
pedromateo
la source
3
Une référence pour la fonction os.walk se trouve à l' adresse
ScottMcC
136

Vous pouvez essayer d'utiliser le module glob :

import glob

for filepath in glob.iglob('my_dir/*.asm'):
    print(filepath)

et depuis Python 3.5, vous pouvez également rechercher des sous-répertoires:

glob.glob('**/*.txt', recursive=True) # => ['2.txt', 'sub/3.txt']

De la documentation:

Le module glob trouve tous les chemins correspondant à un modèle spécifié selon les règles utilisées par le shell Unix, bien que les résultats soient retournés dans un ordre arbitraire. Aucune expansion de tilde n'est effectuée, mais *,? Et les plages de caractères exprimées avec [] seront correctement mises en correspondance.

Doboy
la source
19

Depuis Python 3.5, les choses sont beaucoup plus faciles avec os.scandir ( )

with os.scandir(path) as it:
    for entry in it:
        if entry.name.endswith(".asm") and entry.is_file():
            print(entry.name, entry.path)

L'utilisation de scandir () au lieu de listdir () peut augmenter considérablement les performances du code qui nécessite également des informations sur le type ou l'attribut de fichier, car les objets os.DirEntry exposent ces informations si le système d'exploitation les fournit lors de l'analyse d'un répertoire. Toutes les méthodes os.DirEntry peuvent effectuer un appel système, mais is_dir () et is_file () nécessitent généralement un appel système uniquement pour les liens symboliques; os.DirEntry.stat () nécessite toujours un appel système sous Unix mais n'en requiert qu'un pour les liens symboliques sous Windows.

crypdick
la source
entryest un posix.DirEntry de type avec un tas de méthodes pratiques telles que entry.is_dir(), is_file(),is_symlink()
crypdick
17

Python 3.4 et versions ultérieures proposent pathlib dans la bibliothèque standard. Vous pourriez faire:

from pathlib import Path

asm_pths = [pth for pth in Path.cwd().iterdir()
            if pth.suffix == '.asm']

Ou si vous n'aimez pas les listes de compréhension:

asm_paths = []
for pth in Path.cwd().iterdir():
    if pth.suffix == '.asm':
        asm_pths.append(pth)

Path les objets peuvent facilement être convertis en chaînes.

Greg
la source
9

Voici comment j'itère les fichiers en Python:

import os

path = 'the/name/of/your/path'

folder = os.fsencode(path)

filenames = []

for file in os.listdir(folder):
    filename = os.fsdecode(file)
    if filename.endswith( ('.jpeg', '.png', '.gif') ): # whatever file types you're using...
        filenames.append(filename)

filenames.sort() # now you have the filenames and can do something with them

AUCUNE DE CES TECHNIQUES NE GARANTIT TOUTE COMMANDE D'ITÉRATION

Oui, super imprévisible. Notez que je trie les noms de fichiers, ce qui est important si l'ordre des fichiers est important, par exemple pour les images vidéo ou la collecte de données en fonction du temps. Assurez-vous cependant de mettre des index dans vos noms de fichiers!

Daniel McGrath
la source
Pas toujours trié ... im1, im10, im11 ..., im2 ... Autrement approche utile. from pkg_resources import parse_versionet l'a filenames.sort(key=parse_version)fait.
Hastur
5

Vous pouvez utiliser glob pour référencer le répertoire et la liste:

import glob
import os

#to get the current working directory name
cwd = os.getcwd()
#Load the images from images folder.
for f in glob.glob('images\*.jpg'):   
    dir_name = get_dir_name(f)
    image_file_name = dir_name + '.jpg'
    #To print the file name with path (path will be in string)
    print (image_file_name)

Pour obtenir la liste de tous les répertoires du tableau, vous pouvez utiliser os :

os.listdir(directory)
JAPPER
la source
4

Je ne suis pas encore très satisfait de cette implémentation, je voulais avoir un constructeur personnalisé qui le fasse de DirectoryIndex._make(next(os.walk(input_path)))telle sorte que vous puissiez simplement passer le chemin pour lequel vous voulez une liste de fichiers. Modifications bienvenues!

import collections
import os

DirectoryIndex = collections.namedtuple('DirectoryIndex', ['root', 'dirs', 'files'])

for file_name in DirectoryIndex(*next(os.walk('.'))).files:
    file_path = os.path.join(path, file_name)
ThorSummoner
la source
2

J'aime vraiment utiliser la scandirdirective intégrée à la osbibliothèque. Voici un exemple de travail:

import os

i = 0
with os.scandir('/usr/local/bin') as root_dir:
    for path in root_dir:
        if path.is_file():
            i += 1
            print(f"Full path is: {path} and just the name is: {path.name}")
print(f"{i} files scanned successfully.")
jamescampbell
la source
réponse en double
crypdick