从文件夹中选择前n个最小的文件

时间:2017-05-27 08:57:38

标签: python python-2.7 file

我有一个包含许多文件的目录,大约50k。我想选择 n 最小的文件。

import os

def main():
listfile = os.listdir("../../folder")
for singlefile in listfile:
    print singlefile

有了这段代码,不幸的是,我会全部选择它们。

4 个答案:

答案 0 :(得分:4)

您可以使用os.path.getsize来获取文件大小,然后使用sort文件来获取文件大小。 (heapq.nsmallest通常是优先的,但已经在另一个anser中涵盖,所以我将展示另一种选择):

import os

directory = "../../folder"
n = 10

files = os.listdir(directory)
files_sorted_by_size = sorted(files, key=lambda filename: os.path.getsize(os.path.join(directory, filename)))  
nsmallest_files = files_sorted_by_size[:n] 
print(nsmallest_files)  

在一行中:

sorted(os.listdir(directory), key=lambda filename: os.path.getsize(os.path.join(directory, filename)))[:n]

答案 1 :(得分:1)

def main():
 # The folder containing files.
 directory = ""../../folder""

 # Get all files.
 list = os.listdir(directory)

 # Loop and add files to list.
 pairs = []
 for file in list:

   # Use join to get full file path.
   location = os.path.join(directory, file)

   # Get size and add to list of tuples.
   size = os.path.getsize(location)
   pairs.append((size, file))

   # Sort list of tuples by the first element, size.
   pairs.sort(key=lambda s: s[0])

 # Display pairs.
 for pair in pairs:
  print(pair[1])

答案 2 :(得分:0)

您可以使用os.stat来获取文件的大小。与heapq.nsmallest结合使用,您可以轻松找到最小的文件:

routes = list()
routes.append(app1_routes)
routes.extend(app2_routes)

答案 3 :(得分:0)

除了上述好的解决方案,这是我的25美分。您可以使用os.walk, os.stat & sorted函数从目录中获取n个最小的文件。它也可以扩展到递归目录。

import os


def get_n_smallest_files(directory, n):
    file_map = {}
    for root, subdirs, files in os.walk(directory):
       for file_path in [root + file for file in files]:
           file_map[file_path] = os.stat(file_path).st_size
    return sorted(file_map.items(), key=lambda x: x[1])[:n]


if __name__ == "__main__":
    directory = "/path/to/directory/"
    small_files_limit = 10
    print get_n_smallest_files(directory, small_files_limit)