Domanda Come elenco tutti i file di una directory?


Come posso elencare tutti i file di una directory in Python e aggiungerli a a list?


2811
2017-07-08 19:31


origine


risposte:


os.listdir() otterrà tutto ciò che è in una directory: file e directory.

Se vuoi appena file, puoi filtrarlo usando os.path:

from os import listdir
from os.path import isfile, join
onlyfiles = [f for f in listdir(mypath) if isfile(join(mypath, f))]

o potresti usare os.walk() che produrrà due elenchi per ogni directory che visita, suddividendoli in file e directory per te. Se si desidera solo la directory principale, è possibile interrompere la prima volta

from os import walk

f = []
for (dirpath, dirnames, filenames) in walk(mypath):
    f.extend(filenames)
    break

E infine, come mostra quell'esempio, aggiungendo una lista a un'altra che puoi usare .extend() o

>>> q = [1, 2, 3]
>>> w = [4, 5, 6]
>>> q = q + w
>>> q
[1, 2, 3, 4, 5, 6]

Personalmente, preferisco .extend()


2812
2017-07-08 21:01



Preferisco usare il glob modulo, così come il pattern matching e l'espansione.

import glob
print(glob.glob("/home/adam/*.txt"))

Restituirà una lista con i file interrogati:

['/home/adam/file1.txt', '/home/adam/file2.txt', .... ]

1138
2017-07-09 18:13



import os
os.listdir("somedirectory")

restituirà un elenco di tutti i file e le directory in "somedirectory".


517
2017-07-08 19:35



Ottieni un elenco di file con Python 2 e 3


Ho anche realizzato un breve video qui:  Python: come ottenere un elenco di file in una directory


os.listdir ()

o ..... caldo per ottenere tutti i file (e le directory) nella directory corrente (Python 3)

Il modo più semplice per avere il file nella directory corrente in Python 3 è questo. È davvero semplice; Usa il os modulo e la funzione listdir () e avrai il file in quella directory (e le eventuali cartelle che si trovano nella directory, ma non avrai il file nella sottodirectory, per cui puoi usare walk - ne parlerò dopo).

>>> import os
>>> arr = os.listdir()
>>> arr
['$RECYCLE.BIN', 'work.txt', '3ebooks.txt', 'documents']

Utilizzando glob

Ho trovato glob più facile selezionare file dello stesso tipo o con qualcosa in comune. Guarda il seguente esempio:

import glob

txtfiles = []
for file in glob.glob("*.txt"):
    txtfiles.append(file)

Utilizzando la comprensione delle liste

import glob

mylist = [f for f in glob.glob("*.txt")]

Ottenere il nome completo del percorso con os.path.abspath

Come hai notato, non hai il percorso completo del file nel codice sopra. Se è necessario avere il percorso assoluto, è possibile utilizzare un'altra funzione di os.path modulo chiamato _getfullpathname, mettendo il file che ottieni os.listdir() come argomento. Ci sono altri modi per avere il percorso completo, come vedremo in seguito (ho sostituito, come suggerito da mexmex, _getfullpathname con abspath).

>>> import os
>>> files_path = [os.path.abspath(x) for x in os.listdir()]
>>> files_path
['F:\\documenti\applications.txt', 'F:\\documenti\collections.txt']

Ottieni il nome completo del percorso di un tipo di file in tutte le sottodirectory con walk

Lo trovo molto utile per trovare cose in molte directory e mi ha aiutato a trovare un file su cui non ricordavo il nome:

import os

# Getting the current work directory (cwd)
thisdir = os.getcwd()

# r=root, d=directories, f = files
for r, d, f in os.walk(thisdir):
    for file in f:
        if ".docx" in file:
            print(os.path.join(r, file))

os.listdir (): recupera i file nella directory corrente (Python 2)

In Python 2 tu, se vuoi la lista dei file nella directory corrente, devi dare l'argomento come '.' o os.getcwd () nel metodo os.listdir.

>>> import os
>>> arr = os.listdir('.')
>>> arr
['$RECYCLE.BIN', 'work.txt', '3ebooks.txt', 'documents']

Per salire nell'albero delle directory

>>> # Method 1
>>> x = os.listdir('..')

# Method 2
>>> x= os.listdir('/')

Ottieni file: os.listdir () in una particolare directory (Python 2 e 3)

>>> import os
>>> arr = os.listdir('F:\\python')
>>> arr
['$RECYCLE.BIN', 'work.txt', '3ebooks.txt', 'documents']

Ottieni i file di una particolare sottodirectory con os.listdir ()

import os

x = os.listdir("./content")

os.walk ('.') - directory corrente

>>> import os
>>> arr = next(os.walk('.'))[2]
>>> arr
['5bs_Turismo1.pdf', '5bs_Turismo1.pptx', 'esperienza.txt']

modulo glob: tutti i file

import glob
print(glob.glob("*"))

out:['content', 'start.py']

next (os.walk ('.')) e os.path.join ('dir', 'file')

>>> import os
>>> arr = []
>>> for d,r,f in next(os.walk("F:\_python)):
>>>     for file in f:
>>>         arr.append(os.path.join(r,file))
...
>>> for f in arr:
>>>     print(files)

>output

F:\\_python\\dict_class.py
F:\\_python\\programmi.txt

next (os.walk ('F: \') - ottieni il percorso completo - la comprensione degli elenchi

>>> [os.path.join(r,file) for r,d,f in next(os.walk("F:\\_python")) for file in f]
['F:\\_python\\dict_class.py', 'F:\\_python\\programmi.txt']

os.walk - get full path - tutti i file in sotto dir

x = [os.path.join(r,file) for r,d,f in os.walk("F:\\_python") for file in f]

>>>x
['F:\\_python\\dict.py', 'F:\\_python\\progr.txt', 'F:\\_python\\readl.py']

os.listdir () - ottiene solo i file txt

>>> arr_txt = [x for x in os.listdir() if x.endswith(".txt")]
>>> print(arr_txt)
['work.txt', '3ebooks.txt']

glob - ottieni solo file txt

>>> import glob
>>> x = glob.glob("*.txt")
>>> x
['ale.txt', 'alunni2015.txt', 'assenze.text.txt', 'text2.txt', 'untitled.txt']

Usare glob per ottenere il percorso completo dei file

Se dovrei avere bisogno del percorso assoluto dei file:

>>> from path import path
>>> from glob import glob
>>> x = [path(f).abspath() for f in glob("F:\*.txt")]
>>> for f in x:
...  print(f)
...
F:\acquistionline.txt
F:\acquisti_2018.txt
F:\bootstrap_jquery_ecc.txt

Altro uso di glob

Se voglio tutti i file nella directory:

>>> x = glob.glob("*")

Utilizzando os.path.isfile per evitare le directory nell'elenco

import os.path
listOfFiles = [f for f in os.listdir() if os.path.isfile(f)]
print(listOfFiles)

> output

['a simple game.py', 'data.txt', 'decorator.py']

Usare pathlib da (Python 3.4)

import pathlib

>>> flist = []
>>> for p in pathlib.Path('.').iterdir():
...  if p.is_file():
...   print(p)
...   flist.append(p)
...
error.PNG
exemaker.bat
guiprova.mp3
setup.py
speak_gui2.py
thumb.PNG

Se vuoi usare la comprensione delle liste

>>> flist = [p for p in pathlib.Path('.').iterdir() if p.is_file()]

Ottieni tutti e solo i file con os.walk

import os
x = [i[2] for i in os.walk('.')]
y=[]
for t in x:
    for f in t:
        y.append(f)

>>> y
['append_to_list.py', 'data.txt', 'data1.txt', 'data2.txt', 'data_180617', 'os_walk.py', 'READ2.py', 'read_data.py', 'somma_defaltdic.py', 'substitute_words.py', 'sum_data.py', 'data.txt', 'data1.txt', 'data_180617']

Ottieni solo i file con successivo e cammina in una directory

>>> import os
>>> x = next(os.walk('F://python'))[2]
>>> x
['calculator.bat','calculator.py']

Ottieni solo directory con next e cammina in una directory

>>> import os
>>> next(os.walk('F://python'))[1] # for the current dir use ('.')
['python3','others']

Ottieni tutti i nomi delle sottodirectory con walk

>>> for r,d,f in os.walk("F:\_python"):
...  for dirs in d:
...   print(dirs)
...
.vscode
pyexcel
pyschool.py
subtitles
_metaprogramming
.ipynb_checkpoints

os.scandir () da Python 3.5 su

>>> import os
>>> x = [f.name for f in os.scandir() if f.is_file()]
>>> x
['calculator.bat','calculator.py']

# Another example with scandir (a little variation from docs.python.org)
# This one is more efficient than os.listdir.
# In this case, it shows the files only in the current directory
# where the script is executed.

>>> import os
>>> with os.scandir() as i:
...  for entry in i:
...   if entry.is_file():
...    print(entry.name)
...
ebookmaker.py
error.PNG
exemaker.bat
guiprova.mp3
setup.py
speakgui4.py
speak_gui2.py
speak_gui3.py
thumb.PNG
>>>

Ex. 1: Quanti file ci sono nelle sottodirectory?

In questo esempio, cerchiamo il numero di file che sono inclusi in tutta la directory e nelle sue sottodirectory.

import os

def count(dir, counter=0):
    "returns number of files in dir and subdirs"
    for pack in os.walk(dir):
        for f in pack[2]:
            counter += 1
    return dir + " : " + str(counter) + "files"

print(count("F:\\python"))

> output

>'F:\\\python' : 12057 files'

Es.2: Come copiare tutti i file da una directory a un'altra?

Uno script per fare ordine nel tuo computer trovando tutti i file di un tipo (predefinito: pptx) e copiandoli in una nuova cartella.

import os
import shutil
from path import path

destination = "F:\\file_copied"
# os.makedirs(destination)

def copyfile(dir, filetype='pptx', counter=0):
    "Searches for pptx (or other - pptx is the default) files and copies them"
    for pack in os.walk(dir):
        for f in pack[2]:
            if f.endswith(filetype):
                fullpath = pack[0] + "\\" + f
                print(fullpath)
                shutil.copy(fullpath, destination)
                counter += 1
    if counter > 0:
        print("------------------------")
        print("\t==> Found in: `" + dir + "` : " + str(counter) + " files\n")

for dir in os.listdir():
    "searches for folders that starts with `_`"
    if dir[0] == '_':
        # copyfile(dir, filetype='pdf')
        copyfile(dir, filetype='txt')


> Output

_compiti18\Compito Contabilità 1\conti.txt
_compiti18\Compito Contabilità 1\modula4.txt
_compiti18\Compito Contabilità 1\moduloa4.txt
------------------------
==> Found in: `_compiti18` : 3 files

Ex. 3: Come ottenere tutti i file in un file txt

Nel caso in cui desideri creare un file txt con tutti i nomi di file:

import os
mylist = ""
with open("filelist.txt", "w", encoding="utf-8") as file:
    for eachfile in os.listdir():
        mylist += eachfile + "\n"
    file.write(mylist)

327
2018-01-03 15:36



Una soluzione a una linea per ottenere solo lista di file (nessuna sottodirectory):

filenames = next(os.walk(path))[2]

o percorsi assoluti:

paths = [os.path.join(path,fn) for fn in next(os.walk(path))[2]]

144
2018-01-18 17:42



Ottenere percorsi di file completi da una directory e da tutte le sue sottodirectory

import os

def get_filepaths(directory):
    """
    This function will generate the file names in a directory 
    tree by walking the tree either top-down or bottom-up. For each 
    directory in the tree rooted at directory top (including top itself), 
    it yields a 3-tuple (dirpath, dirnames, filenames).
    """
    file_paths = []  # List which will store all of the full filepaths.

    # Walk the tree.
    for root, directories, files in os.walk(directory):
        for filename in files:
            # Join the two strings in order to form the full filepath.
            filepath = os.path.join(root, filename)
            file_paths.append(filepath)  # Add it to the list.

    return file_paths  # Self-explanatory.

# Run the above function and store its results in a variable.   
full_file_paths = get_filepaths("/Users/johnny/Desktop/TEST")

  • Il percorso che ho fornito nella funzione precedente conteneva 3 file, due dei quali nella directory principale e un altro in una sottocartella chiamata "SUBFOLDER". Ora puoi fare cose come:
  • print full_file_paths che stamperà la lista:

    • ['/Users/johnny/Desktop/TEST/file1.txt', '/Users/johnny/Desktop/TEST/file2.txt', '/Users/johnny/Desktop/TEST/SUBFOLDER/file3.dat']

Se lo desideri, puoi aprire e leggere il contenuto oppure concentrarti solo sui file con estensione ".dat" come nel seguente codice:

for f in full_file_paths:
  if f.endswith(".dat"):
    print f

/Users/johnny/Desktop/TEST/SUBFOLDER/file3.dat


110
2017-10-11 00:55



Dalla versione 3.4 sono integrati iteratori per questo che sono molto più efficienti di os.listdir():

pathlib: Novità nella versione 3.4.

>>> import pathlib
>>> [p for p in pathlib.Path('.').iterdir() if p.is_file()]

Secondo PEP 428, lo scopo del pathlib la libreria serve a fornire una semplice gerarchia di classi per gestire i percorsi del filesystem e le operazioni comuni che gli utenti eseguono su di essi.

os.scandir(): Novità nella versione 3.5.

>>> import os
>>> [entry for entry in os.scandir('.') if entry.is_file()]

Nota che os.walk() usi os.scandir() invece di os.listdir() dalla versione 3.5, e la sua velocità è aumentata di 2-20 volte secondo PEP 471.

Consentitemi anche di leggere il commento di ShadowRanger qui sotto.


57
2018-06-18 20:58



mi è davvero piaciuto la risposta di Adamk, suggerendo che tu usi glob(), dal modulo con lo stesso nome Questo ti permette di avere pattern matching con *S.

Ma come altre persone hanno sottolineato nei commenti, glob() può essere inciampato su direzioni oblique incoerenti. Per aiutarti, ti suggerisco di usare il join() e expanduser() funzioni nel os.path modulo, e forse il getcwd() funzione nel os modulo, pure.

Come esempi:

from glob import glob

# Return everything under C:\Users\admin that contains a folder called wlp.
glob('C:\Users\admin\*\wlp')

Quanto sopra è terribile - il percorso è stato hardcoded e funzionerà solo su Windows solo tra il nome del drive e il \s è stato codificato nel percorso.

from glob    import glob
from os.path import join

# Return everything under Users, admin, that contains a folder called wlp.
glob(join('Users', 'admin', '*', 'wlp'))

Quanto sopra funziona meglio, ma si basa sul nome della cartella Usersche si trova spesso su Windows e non così spesso trovato su altri sistemi operativi. Si basa anche sull'utente che ha un nome specifico, admin.

from glob    import glob
from os.path import expanduser, join

# Return everything under the user directory that contains a folder called wlp.
glob(join(expanduser('~'), '*', 'wlp'))

Funziona perfettamente su tutte le piattaforme.

Un altro grande esempio che funziona perfettamente su piattaforme e fa qualcosa di un po 'diverso:

from glob    import glob
from os      import getcwd
from os.path import join

# Return everything under the current directory that contains a folder called wlp.
glob(join(getcwd(), '*', 'wlp'))

Spero che questi esempi ti aiutino a vedere il potere di alcune delle funzioni che puoi trovare nei moduli standard della libreria Python.


45
2017-07-09 11:43



def list_files(path):
    # returns a list of names (with extension, without full path) of all files 
    # in folder path
    files = []
    for name in os.listdir(path):
        if os.path.isfile(os.path.join(path, name)):
            files.append(name)
    return files 

33
2018-06-10 16:16