Frage Wie listet ich alle Dateien eines Verzeichnisses auf?


Wie kann ich alle Dateien eines Verzeichnisses in Python auflisten und sie zu einem hinzufügen? list?


2812
2017-07-08 19:31


Ursprung


Antworten:


os.listdir() Sie erhalten alles, was in einem Verzeichnis ist - Dateien und Verzeichnisse.

wenn du willst gerade Dateien, können Sie dies entweder mit os.path:

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

oder du könntest es benutzen os.walk() Dies ergibt zwei Listen für jedes besuchte Verzeichnis - Aufteilen in Dateien und Verzeichnisse für Sie. Wenn Sie nur das oberste Verzeichnis möchten, können Sie das erste Mal brechen, wenn es das erste Mal gibt

from os import walk

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

Und schließlich, wie das Beispiel zeigt, können Sie entweder eine Liste zu einer anderen hinzufügen .extend() oder

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

Persönlich bevorzuge ich .extend()


2813
2017-07-08 21:01



Ich bevorzuge die Verwendung der glob Modul, wie es Mustererkennung und Erweiterung.

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

Es wird eine Liste mit den abgefragten Dateien zurückgeben:

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

1138
2017-07-09 18:13



import os
os.listdir("somedirectory")

gibt eine Liste aller Dateien und Verzeichnisse in "somedirectory" zurück.


518
2017-07-08 19:35



Erhalte eine Liste von Dateien mit Python 2 und 3


Ich habe hier auch ein kurzes Video gemacht:  Python: Wie bekomme ich eine Liste von Dateien in einem Verzeichnis?


os.listdir ()

oder ..... hot, um alle Dateien (und Verzeichnisse) im aktuellen Verzeichnis (Python 3) zu bekommen

Die einfachste Möglichkeit, die Datei im aktuellen Verzeichnis in Python 3 zu haben, ist dies. Es ist wirklich einfach; benutze die os Modul und die Funktion listdir () und Sie haben die Datei in diesem Verzeichnis (und eventuelle Ordner, die im Verzeichnis sind, aber Sie haben nicht die Datei im Unterverzeichnis, dafür können Sie Walk - ich werde darüber reden später).

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

Mit glob

Ich fand es einfacher, eine Datei gleichen Typs oder mit etwas gemeinsamem auszuwählen. Sehen Sie sich das folgende Beispiel an:

import glob

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

Listenverständnis verwenden

import glob

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

Abrufen des vollständigen Pfadnamens mit os.path.abspath

Wie Sie bemerkt haben, haben Sie nicht den vollständigen Pfad der Datei im obigen Code. Wenn Sie den absoluten Pfad benötigen, können Sie eine andere Funktion des verwenden os.path Modul genannt _getfullpathnamedie Datei, von der du kommst os.listdir() als ein Argument. Es gibt andere Möglichkeiten, den vollen Pfad zu haben, wie wir später sehen werden (ich habe ersetzt, wie es von mexmex, _getfullpathname mit vorgeschlagen wird abspath).

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

Holen Sie den vollständigen Pfadnamen eines Dateityps in alle Unterverzeichnisse mit walk

Ich finde das sehr nützlich, um Sachen in vielen Verzeichnissen zu finden, und es hat mir geholfen, eine Datei zu finden, über die ich mich an den Namen nicht erinnerte:

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 (): Dateien im aktuellen Verzeichnis abrufen (Python 2)

Wenn Sie in Python 2 die Liste der Dateien im aktuellen Verzeichnis haben wollen, müssen Sie das Argument als '.' oder os.getcwd () in der os.listdir-Methode.

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

Um in den Verzeichnisbaum zu gehen

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

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

Dateien abrufen: os.listdir () in einem bestimmten Verzeichnis (Python 2 und 3)

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

Abrufen von Dateien eines bestimmten Unterverzeichnisses mit os.listdir ()

import os

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

os.walk ('.') - aktuelles Verzeichnis

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

glob-Modul - alle Dateien

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

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

next (os.walk ('.')) und 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

weiter (os.walk ('F: \') - holen Sie sich den vollständigen Pfad - Listenverständnis

>>> [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 - Erhalte den vollständigen Pfad - alle Dateien in Unterverzeichnissen

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 () - holt nur txt Dateien

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

glob - bekomme nur txt-Dateien

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

Verwenden Sie glob, um den vollständigen Pfad der Dateien abzurufen

Wenn ich den absoluten Pfad der Dateien benötige:

>>> 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

Andere Verwendung von Glob

Wenn ich alle Dateien im Verzeichnis haben möchte:

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

Verwenden Sie os.path.isfile, um Verzeichnisse in der Liste zu vermeiden

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']

Pfadlib von (Python 3.4) verwenden

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

Wenn Sie Listenverständnis verwenden möchten

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

Hol dir alle und nur Dateien mit 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']

Erhalte nur Dateien mit dem nächsten und gehe in ein Verzeichnis

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

Bekommen Sie nur Verzeichnisse mit dem nächsten und gehen Sie in einem Verzeichnis

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

Erhalte alle Subdir-Namen mit 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 () von Python 3.5 auf

>>> 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: Wie viele Dateien gibt es in den Unterverzeichnissen?

In diesem Beispiel suchen wir nach der Anzahl der Dateien, die in dem gesamten Verzeichnis und seinen Unterverzeichnissen enthalten sind.

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'

Ex.2: Wie kopiert man alle Dateien von einem Verzeichnis in ein anderes?

Ein Skript, um Ordnung in Ihren Computer zu finden, alle Dateien eines Typs (Standard: pptx) zu finden und sie in einem neuen Ordner zu kopieren.

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: Wie man alle Dateien in eine TXT-Datei bekommt

Falls Sie eine TXT-Datei mit allen Dateinamen erstellen möchten:

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



Eine One-Line-Lösung zu bekommen nur Liste der Dateien (keine Unterverzeichnisse):

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

oder absolute Pfadnamen:

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

144
2018-01-18 17:42



Vollständige Dateipfade aus einem Verzeichnis und allen Unterverzeichnissen abrufen

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

  • Der Pfad, den ich in der obigen Funktion angegeben habe, enthielt 3 Dateien - zwei davon im Stammverzeichnis und ein weiterer in einem Unterordner namens "SUBFOLDER". Sie können jetzt Folgendes tun:
  • print full_file_paths welche die Liste drucken wird:

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

Wenn Sie möchten, können Sie den Inhalt öffnen und lesen oder sich nur auf Dateien mit der Erweiterung ".dat" konzentrieren, wie im folgenden Code:

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



Seit Version 3.4 sind sie eingebaut Iteratoren für diese, die viel effizienter sind als os.listdir():

pathlib: Neu in Version 3.4.

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

Gemäß PEP 428, Das Ziel von pathlib Bibliothek soll eine einfache Hierarchie von Klassen bereitstellen, um Dateisystempfade und die gemeinsamen Operationen, die Benutzer über sie ausführen, zu behandeln.

os.scandir(): Neu in Version 3.5.

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

Beachten Sie, dass os.walk() Verwendet os.scandir() Anstatt von os.listdir() ab Version 3.5, und seine Geschwindigkeit wurde um 2-20 mal nach erhöht PEP 471.

Lassen Sie mich auch den folgenden Kommentar von ShadowRanger lesen.


57
2018-06-18 20:58