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?
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)
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)
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.
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.
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!
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)
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.
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)
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.")