Come posso scorrere i file in una determinata directory?


556

Devo scorrere tutti i .asmfile all'interno di una determinata directory e fare alcune azioni su di essi.

Come può essere fatto in modo efficiente?

Risposte:


808

Risposta 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

Python 3.6 versione della risposta sopra, usando os- supponendo che tu abbia il percorso della directory come stroggetto in una variabile chiamata 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

O ricorsivamente, usando 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)

1
Questo sembra semplicemente elencare le directory o i file immediatamente in una directory. La risposta di pedromateo di seguito sembra fare un elenco ricorsivo.
Jay Sheth,

8
Si noti che nella directory Python 3.6 è previsto che sia in byte e quindi listdir sputerà un elenco di nomi di file anche nel tipo di dati byte, quindi non è possibile eseguire endwith direttamente su di esso. Questo blocco di codice dovrebbe essere modificato indirectory = 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))deve essere modificato per print(os.path.join(directory_in_str, filename))farlo funzionare in Python 3.6
Hugo Koopmans,

54
Se lo vedi nel 2017 o oltre, os.scandir (dir_str) è ora disponibile e molto più pulito da usare. Non c'è bisogno di fsencode. for entry in os.scandir(path): print(entry.path)
Capra,

2
Preferisco if filename.endswith((".asm", ".py")):aif filename.endswith(".asm") or filename.endswith(".py"):
Maroloccio

153

Questo eseguirà l'iterazione su tutti i file discendenti, non solo sui figli immediati della directory:

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)

3
Un riferimento per la funzione os.walk è disponibile al seguente indirizzo: docs.python.org/2/library/os.path.html#os.path.walk
ScottMcC

136

Puoi provare a utilizzare il modulo glob :

import glob

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

e da Python 3.5 puoi cercare anche nelle sottodirectory:

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

Dai documenti:

Il modulo glob trova tutti i percorsi che corrispondono a un modello specificato secondo le regole usate dalla shell Unix, sebbene i risultati vengano restituiti in ordine arbitrario. Non viene eseguita l'espansione della tilde, ma *,? E gli intervalli di caratteri espressi con [] verranno abbinati correttamente.


19

Da Python 3.5, le cose sono molto più facili con 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'uso di scandir () anziché listdir () può aumentare significativamente le prestazioni del codice che necessita anche di informazioni sul tipo di file o sugli attributi di file, poiché gli oggetti os.DirEntry espongono queste informazioni se il sistema operativo le fornisce durante la scansione di una directory. Tutti i metodi os.DirEntry possono eseguire una chiamata di sistema, ma is_dir () e is_file () di solito richiedono solo una chiamata di sistema per collegamenti simbolici; os.DirEntry.stat () richiede sempre una chiamata di sistema su Unix ma ne richiede solo una per i collegamenti simbolici su Windows.


entryè un posix.DirEntry tipo con un sacco di metodi utili quali entry.is_dir(), is_file(),is_symlink()
crypdick

17

Python 3.4 e versioni successive offrono pathlib nella libreria standard. Potresti fare:

from pathlib import Path

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

O se non ti piacciono le comprensioni dell'elenco:

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

Path gli oggetti possono essere facilmente convertiti in stringhe.


9

Ecco come faccio a scorrere i file in 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

NESSUNA DI QUESTE TECNICHE GARANTISCE QUALSIASI ORDINE DI ITERAZIONE

Sì, super imprevedibile. Si noti che ordino i nomi dei file, il che è importante se l'ordine dei file è importante, ad esempio per i frame video o la raccolta di dati dipendenti dal tempo. Assicurati di inserire gli indici nei nomi dei file!


Non sempre ordinati ... im1, im10, im11 ..., im2 ... Approccio altrimenti utile. from pkg_resources import parse_versione filenames.sort(key=parse_version)lo ha fatto.
Hastur,

5

È possibile utilizzare glob per fare riferimento alla directory e all'elenco:

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)

Per ottenere l'elenco di tutte le directory nell'array è possibile utilizzare os :

os.listdir(directory)

4

Non sono ancora abbastanza soddisfatto di questa implementazione, volevo avere un costruttore personalizzato che fa in DirectoryIndex._make(next(os.walk(input_path)))modo che tu possa semplicemente passare il percorso per cui desideri un elenco di file. Modifiche benvenute!

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)

2

Mi piace molto usare la scandirdirettiva integrata nella oslibreria. Ecco un esempio funzionante:

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

risposta duplicata
crypdick
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.