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
암호가 아닌 경우 folder_path내부 를 추가해야합니다 os.path.filename(name). stackoverflow.com/questions/17893542/…
Rafael Oliveira

1
중첩 된 폴더 안에있는 파일은 계산하지 않습니다.
codersofthedark

5
디렉토리 안에 중첩 된 파일을 재귀 적으로 계산하려면 os.walk () 솔루션을 사용하는 것이 좋습니다.
Joel B

os.path.join(DIR, name)over 를 사용하면 어떤 이점이 DIR + '/' + name있습니까? 후자는 더 짧고 IMO는 전자보다 더 명확합니다. 후자가 실패하는 OS가 있습니까?
HelloGoodbye

@HelloGoodbye 바로 그 이유입니다.
ellockie


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)

이 순환되지 않습니다
카일 Bridenstine

32

fnmatch가 매우 유용한 곳입니다.

import fnmatch

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

자세한 내용은 http://docs.python.org/2/library/fnmatch.html


3
찾고있는 패턴을 알고 있다면 os.path.isfile()허용 된 답변 과 같이 각 파일을 테스트하는 것보다 훨씬 빠릅니다 (1 만 개의 파일이있는 디렉토리에서 테스트 할 때 약 절반의 시간) . 보다 훨씬 빠릅니다 glob.glob().
CivFan

14

하위 디렉토리의 파일을 포함하여 디렉토리의 모든 파일을 계산하려면 가장 비법적인 방법은 다음과 같습니다.

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라는 변수 이름 일뿐입니다. 즉, 여기서 수행하는 작업입니다. 우리는 walk를 호출하고 각 디렉토리의 파일 수만 세고 루트와 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에서 잘 작동합니다!
Aoki Ahishatsu

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

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

이 게시물 에서 가져온


2
1. files목록입니다. 2. OP는 재귀 카운트를 찾지 않습니다
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

다음은 유용한 한 줄 명령입니다.

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

ls셸에서 나쁜 "빠르고 더러운"방법은 아니지만 출력을 구문 분석하는 것은 일반적으로 싫증이납니다 (자주 문제를 일으킬 수 있음). 그러나을 사용해야 ls -1하므로 파일 당 한 줄을 보장합니다.
Bloodgain

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 (반환 목록)"은 파일 수를 반환합니다.


1
스택 오버플로에 오신 것을 환영합니다. 이 답변의 품질은 다음과 같은 설명을 추가하여 향상시킬 수 있습니다. 답변 방법
Elletlar

1
감사합니다 Elletlar, 내 답변을 편집했습니다. 더 포괄적 인 방식으로 응답하도록하겠습니다. 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)

OP는 파일 수를 요청했으며 여기 에는 디렉토리도 나열됩니다.
Korem

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

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.