web-dev-qa-db-fra.com

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

J'ai besoin de parcourir tous les fichiers .asm dans un répertoire donné et de faire certaines actions dessus.

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

439
Itzik984

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 le chemin du répertoire est un objet str 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)
659
anselm

Cela va parcourir 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)
118
pedromateo

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 effectuer une recherche dans les sous-répertoires:

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

De la docs:

Le module glob trouve tous les chemins d'accès correspondant à un modèle spécifié conformément aux règles utilisées par le shell Unix, bien que les résultats soient renvoyés dans un ordre arbitraire. Aucun développement de tilde n'est effectué, mais *,? Et les plages de caractères exprimées avec [] seront correctement appariées.

111
Doboy

Python 3.4 et versions ultérieures offrent 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 compréhensions de liste:

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

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

15
Greg

Voici comment parcourir 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 TOUT ORDRE 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, c’est-à-dire pour les images vidéo ou la collecte de données en fonction du temps. Assurez-vous de mettre des index dans vos noms de fichiers!

6
Daniel McGrath

Je ne suis pas encore assez satisfait de cette implémentation, je voulais un constructeur personnalisé qui fait DirectoryIndex._make(next(os.walk(input_path))) de sorte que vous puissiez simplement indiquer le chemin pour lequel vous voulez une liste de fichiers. Les modifications sont les 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)
4
ThorSummoner

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 nécessitant également des informations sur le type de fichier ou ses attributs, 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 () ne nécessitent généralement qu'un appel système pour les liens symboliques; os.DirEntry.stat () requiert toujours un appel système sous Unix, mais un seul pour les liens symboliques sous Windows.

3
crypdick

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 d'un tableau, vous pouvez utiliser os :

os.listdir(directory)
1
YAP

J'aime beaucoup utiliser la directive scandir intégrée à la bibliothèque os. 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.")
1
jamescampbell