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?

prosseek
quelle
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))])
Daniel Stutzbach
quelle
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
102
import os

path, dirs, files = next(os.walk("/usr/lib"))
file_count = len(files)
Luke
quelle
2
Dies ist nicht rekursiv
Kyle Bridenstine
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)
Guillermo Pereira
quelle
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

ngeek
quelle
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).

Mr_and_Mrs_D
quelle
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()))
Ausschlag
quelle
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
Ninjrok
quelle
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()])
qed
quelle
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)))
Joaquin
quelle
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

Kristian Damian
quelle
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
tzot
quelle
4

Lukes Code neu formatieren.

import os

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

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

print int(os.popen("ls | wc -l").read())
Bojan Tunguz
quelle
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"))
LBes
quelle
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.

Agha Saad
quelle
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)
Mohit Dabas
quelle
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))
Styler
quelle
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) 
Ismail
quelle
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"))
user799188
quelle
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))
Sam Ekoro
quelle