如何使用Python计算目录中的文件数量

我需要使用Python来统计目录中的文件数量。 我想最简单的方法是len(glob.glob('*')) ,但是也将该目录计为一个文件。

有什么办法只能计算目录中的文件吗?

os.listdir()会比使用glob.glob更有效率。 要testing文件名是否是普通文件(而不是目录或其他实体),请使用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))]) 
 import os path, dirs, files = os.walk("/usr/lib").next() file_count = len(files) 

对于所有types的文件,子目录包括:

 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) 

这就是fnmatch非常方便的地方:

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

更多细节: http : //docs.python.org/2/library/fnmatch.html

 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 
 import os print len(os.listdir(os.getcwd())) 

这使用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))) 
 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 

从这个post中取出

 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 

我很惊讶,没有人提到os.scandir

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

卢克的代码重新格式化。

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

这是一个简单的一行命令,我觉得很有用:

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

如果您使用的是操作系统的标准shell,则可以更快地获得结果,而不是使用纯pythonic方式。

Windows示例:

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

我发现另一个答案可能是正确的接受答案。

 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) 

我使用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"))

我做了这个,并返回文件夹中的文件数(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))