Pythonを使用してディレクトリ内のファイル数をカウントする方法


224

Pythonを使用して、ディレクトリ内のファイル数を数える必要があります。

最も簡単な方法はだと思いますがlen(glob.glob('*'))、これはディレクトリ自体もファイルとして数えます。

ディレクトリ内のファイルのみをカウントする方法はありますか?


ディレクトリを除外するには、探しているファイル拡張子に対して「* .fileextension」を実行できます。

回答:


275

os.listdir()を使用するよりもわずかに効率的ですglob.glob。ファイル名が通常のファイルであり(ディレクトリやその他のエンティティではない)かどうかをテストするには、次を使用します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
CWDにいない場合は、必ずfolder_path内部を追加os.path.filename(name)してください。 stackoverflow.com/questions/17893542/...
ラファエル・オリベイラ

1
ネストされたフォルダ内のファイルはカウントされません。
codersofthedark 2015

5
ディレクトリ内にネストされたファイルを再帰的にカウントするには、os.walk()ソリューションの方が適している場合があります。
Joel B

os.path.join(DIR, name)以上を使用する利点は何DIR + '/' + nameですか?後者は前者よりも短く、IMOはより明確です。おそらく、後者が失敗するいくつかのOS:esはありますか?
HelloGoodbye 2016年

@HelloGoodbyeそれがまさに理由です。
ellockie 2016年


48

すべての種類のファイルについて、含まれるサブディレクトリ:

import os

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

ファイルのみ(サブディレクトリを避ける):

import os

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

これは再帰的ではありません
カイル・ブリデンスティン

32

ここでfnmatchが非常に便利になります。

import fnmatch

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

詳細:http : //docs.python.org/2/library/fnmatch.html


3
あなたが探しているパターンがわかっている場合、これはos.path.isfile()受け入れられた回答のように各ファイルをテストするよりもはるかに高速です(10,000ファイルのディレクトリでの私のテストの約半分の時間)。また、よりもはるかに高速ですglob.glob()
CivFan

14

ディレクトリ内のすべてのファイル(サブディレクトリ内のファイルを含む)をカウントする場合、最もPython的な方法は次のとおりです。

import os

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

ファイル数を明示的に追加するよりも速い合計を使用します(タイミングは保留中)


1
こんにちは、私はこのコードを理解しようとしました(コードは完璧_に機能しforます)。ループで使用できることはわかっています。os.walk私も知っています。しかし、sum関数内のアンダースコアで何が起こっているのかわからないので、詳しく説明してください。ありがとう!
Ejaz

1
Unsderscoreは単なる変数名@Ejazです。ここでは、変数を無視するときに使用します。ここでは、これをウォークと呼び、各ディレクトリ内のファイル数のみをカウントします。ルートとdirs walkの戻り値は無視します
Mr_and_Mrs_D

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

2
これはときどき役立つかもしれませんが、カウントにサブディレクトリも含まれます
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

誰も言及しなかったことに驚いていos.scandirます:

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

Python 3.6でうまく動作します!
青木あひさし2018

7

これはos.listdir任意のディレクトリを使用して機能します。

import os
directory = 'mydirpath'

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

これはジェネレーターで単純化でき、次のようにして少し速くできます:

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


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

ルークのコードの再フォーマット。

import os

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

4

ここに私が便利だと思った簡単な1行のコマンドがあります:

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

の出力を解析することlsは、一般的には避けられますが(これは、しばしば問題を引き起こす可能性があります)、これはシェルでの悪い「迅速かつ汚い」メソッドではありません。ls -1ただし、を使用する必要があるため、ファイルごとに1行が保証されます。
ブラッドゲイン

3

@DanielStutzbachによって提供された答えに同意しos.listdir()ますが、を使用するよりも少し効率的ですglob.glob

ただし、さらに精度が高く、フォルダ内の特定のファイルの数をカウントする場合は、を使用しますlen(glob.glob())。たとえば、使用したいフォルダー内のすべてのPDFをカウントする場合:

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

2

簡単です:

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

それは単にディレクトリ内のファイルの数を数えるだけで、リスト内包手法を使用して特定のディレクトリを反復処理し、すべてのファイルを返します。"len(returned list)"はファイル数を返します。


1
Stack Overflowへようこそ。この回答の質は、説明を追加することで改善できます:回答方法
Elletlar '29

1
ありがとうElletlar、私は私の答えを編集しました。私はより包括的な方法で応答することを確認します:D
Agha Saad 2018

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)

OPはファイル数を要求しました。これにはディレクトリもリストされます。
Korem、2014

1

オペレーティングシステムの標準シェルを使用する場合は、純粋なpythonicの方法を使用するよりもはるかに速く結果を得ることができます。

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
ただし、移植性は低くなります。
Politank-Z 2015

1

受け入れられた回答として正しい可能性がある別の回答を見つけました。

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

私は次のglob.iglobようなディレクトリ構造に使用しました

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

次のオプションはどちらも4を返します(期待どおり、つまりサブフォルダー自体はカウントされません)。

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

0

私はこれを行い、これはフォルダー内のファイル数(Attack_Data)を返しました...これは正常に動作します。

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))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.