So zählen Sie die Anzahl der Dateien in einem Verzeichnis mit Python


224

Ich muss die Anzahl der Dateien in einem Verzeichnis mit Python zählen.

Ich denke, der einfachste Weg ist len(glob.glob('*')) , aber das zählt auch das Verzeichnis selbst als Datei.

Gibt es eine Möglichkeit, nur die Dateien in einem Verzeichnis zu zählen?


Um Verzeichnisse wegzulassen, können Sie '* .fileextension' für jede gesuchte Dateierweiterung ausführen.

Antworten:


275

os.listdir()wird etwas effizienter sein als zu verwenden glob.glob. Verwenden Sie Folgendes, um zu testen, ob ein Dateiname eine normale Datei ist (und kein Verzeichnis oder eine andere Entität) os.path.isfile():

import os, os.path

# simple version for working with CWD
print len([name for name in os.listdir('.') if os.path.isfile(name)])

# path joining version for other paths
DIR = '/tmp'
print len([name for name in os.listdir(DIR) if os.path.isfile(os.path.join(DIR, name))])

14
Denken Sie daran, das folder_pathInnere hinzuzufügen, os.path.filename(name)wenn Sie nicht auf dem CWD sind. stackoverflow.com/questions/17893542/…
Rafael Oliveira

1
Dies zählt die Datei in verschachtelten Ordnern nicht.
Codersofthedark

5
Wenn Sie rekursiv in Verzeichnissen verschachtelte Dateien zählen möchten, ist die Lösung os.walk () möglicherweise besser geeignet.
Joel B

Was ist der Vorteil von os.path.join(DIR, name)over DIR + '/' + name? Letzteres ist kürzer und meiner Meinung nach klarer als Ersteres. Gibt es vielleicht ein Betriebssystem, auf dem letzteres versagen würde?
HelloGoodbye

@HelloGoodbye Das ist genau der Grund.
Ellockie


48

Für alle Arten von Dateien enthalten Unterverzeichnisse:

import os

list = os.listdir(dir) # dir is your directory path
number_files = len(list)
print number_files

Nur Dateien (Unterverzeichnisse vermeiden):

import os

onlyfiles = next(os.walk(dir))[2] #dir is your directory path as string
print len(onlyfiles)

Dies ist nicht rekursiv
Kyle Bridenstine

32

Hier ist fnmatch sehr praktisch:

import fnmatch

print len(fnmatch.filter(os.listdir(dirpath), '*.txt'))

Weitere Details: http://docs.python.org/2/library/fnmatch.html


3
Dies ist viel schneller (ungefähr die Hälfte der Zeit beim Testen in einem Verzeichnis mit 10.000 Dateien), wenn Sie das gesuchte Muster kennen, anstatt jede Datei mit os.path.isfile()der akzeptierten Antwort zu testen . Auch deutlich schneller als glob.glob().
CivFan

14

Wenn Sie alle Dateien im Verzeichnis zählen möchten - einschließlich Dateien in Unterverzeichnissen -, ist der pythonischste Weg:

import os

file_count = sum(len(files) for _, _, files in os.walk(r'C:\Dropbox'))
print(file_count)

Wir verwenden eine Summe, die schneller ist als das explizite Hinzufügen der Dateizahlen (Timings ausstehend).


1
Hallo, ich habe versucht, diesen Code zu verstehen (der Code funktioniert perfekt). Ich weiß, dass wir ihn _in einer forSchleife verwenden können. os.walkauch ich weiß. Sie sind sich jedoch nicht sicher, was mit den Unterstrichen in der sumFunktion los ist . Vielen Dank!
Ejaz

1
Unsderscore ist nur ein Variablenname @Ejaz. Konventionell, wenn wir die Variable ignorieren - das tun wir hier - rufen wir walk auf und zählen nur die Anzahl der Dateien in jedem Verzeichnis, wobei die Rückgabewerte root und dirs walk ignoriert werden
Mr_and_Mrs_D

12
import os
print len(os.listdir(os.getcwd()))

2
Dies kann manchmal nützlich sein, aber es enthält auch Unterverzeichnisse in der Zählung
Brian Burns

10
def directory(path,extension):
  list_dir = []
  list_dir = os.listdir(path)
  count = 0
  for file in list_dir:
    if file.endswith(extension): # eg: '.txt'
      count += 1
  return count

10

Ich bin überrascht, dass niemand erwähnt hat os.scandir:

def count_files(dir):
    return len([1 for x in list(os.scandir(dir)) if x.is_file()])

Funktioniert hervorragend mit Python 3.6!
Aoki Ahishatsu

7

Dies verwendet os.listdirund funktioniert für jedes Verzeichnis:

import os
directory = 'mydirpath'

number_of_files = len([item for item in os.listdir(directory) if os.path.isfile(os.path.join(directory, item))])

Dies kann mit einem Generator vereinfacht und etwas beschleunigt werden mit:

import os
isfile = os.path.isfile
join = os.path.join

directory = 'mydirpath'
number_of_files = sum(1 for item in os.listdir(directory) if isfile(join(directory, item)))

5
def count_em(valid_path):
   x = 0
   for root, dirs, files in os.walk(valid_path):
       for f in files:
            x = x+1
print "There are", x, "files in this directory."
return x

Aus diesem Beitrag entnommen


2
1. filesist eine Liste. 2. OP sucht nicht nach rekursiver Zählung
SilentGhost

4
import os

def count_files(in_directory):
    joiner= (in_directory + os.path.sep).__add__
    return sum(
        os.path.isfile(filename)
        for filename
        in map(joiner, os.listdir(in_directory))
    )

>>> count_files("/usr/lib")
1797
>>> len(os.listdir("/usr/lib"))
2049

4

Lukes Code neu formatieren.

import os

print len(os.walk('/usr/lib').next()[2])

4

Hier ist ein einfacher einzeiliger Befehl, den ich nützlich fand:

print int(os.popen("ls | wc -l").read())

Das Parsen der Ausgabe von lsist im Allgemeinen verpönt (dies kann häufig zu Problemen führen), obwohl dies keine schlechte "Quick-and-Dirty" -Methode in der Shell ist. Sie sollten jedoch verwenden ls -1, damit eine Zeile pro Datei garantiert wird.
Blutgewinn

3

Ich stimme zwar der Antwort von @DanielStutzbach zu: os.listdir()Wird etwas effizienter sein als die Verwendungglob.glob .

Eine zusätzliche Genauigkeit, wenn Sie die Anzahl bestimmter Dateien im Ordner zählen möchten, die Sie verwenden möchten len(glob.glob()). Wenn Sie beispielsweise alle PDFs in einem Ordner zählen möchten, den Sie verwenden möchten:

pdfCounter = len(glob.glob1(myPath,"*.pdf"))

2

Es ist einfach:

print(len([iq for iq in os.scandir('PATH')]))

Es zählt einfach die Anzahl der Dateien im Verzeichnis. Ich habe die Listenverständnis-Technik verwendet, um durch ein bestimmtes Verzeichnis zu iterieren und alle Dateien zurückzugeben. "len (zurückgegebene Liste)" gibt die Anzahl der Dateien zurück.


1
Willkommen bei Stack Overflow. Die Qualität dieser Antwort kann durch Hinzufügen einer Erklärung verbessert werden: Wie zu
antworten

1
Vielen Dank Elletlar, ich habe meine Antwort bearbeitet, ich werde sicherstellen, dass ich umfassender antworte: D
Agha Saad

1
import os

total_con=os.listdir('<directory path>')

files=[]

for f_n in total_con:
   if os.path.isfile(f_n):
     files.append(f_n)


print len(files)

Das OP fragte nach der Anzahl der Dateien , hier werden auch Verzeichnisse aufgelistet.
Korem

1

Wenn Sie die Standard-Shell des Betriebssystems verwenden, können Sie das Ergebnis viel schneller erhalten als auf rein pythonische Weise.

Beispiel für Windows:

import os
import subprocess

def get_num_files(path):
    cmd = 'DIR \"%s\" /A-D /B /S | FIND /C /V ""' % path
    return int(subprocess.check_output(cmd, shell=True))

1
Aber es wird nicht so tragbar sein.
Politank-Z

1

Ich habe eine andere Antwort gefunden, die als akzeptierte Antwort korrekt sein kann.

for root, dirs, files in os.walk(input_path):    
for name in files:
    if os.path.splitext(name)[1] == '.TXT' or os.path.splitext(name)[1] == '.txt':
        datafiles.append(os.path.join(root,name)) 


print len(files) 

0

Ich habe glob.iglobfür eine Verzeichnisstruktur ähnlich verwendet

data
└───train
   └───subfolder1
   |      file111.png
   |      file112.png
   |      ...
   |
   └───subfolder2
          file121.png
          file122.png
          ...
└───test
       file221.png
       file222.png

Beide der folgenden Optionen geben 4 zurück (wie erwartet, dh die Unterordner selbst werden nicht gezählt )

  • len(list(glob.iglob("data/train/*/*.png", recursive=True)))
  • sum(1 for i in glob.iglob("data/train/*/*.png"))

0

Ich habe dies getan und dies gab die Anzahl der Dateien im Ordner (Attack_Data) zurück ... das funktioniert gut.

import os
def fcount(path):
    #Counts the number of files in a directory
    count = 0
    for f in os.listdir(path):
        if os.path.isfile(os.path.join(path, f)):
            count += 1

    return count
path = r"C:\Users\EE EKORO\Desktop\Attack_Data" #Read files in folder
print (fcount(path))
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.