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

Python 从文件夹中选择前n个最小的文件,python,python-2.7,file,Python,Python 2.7,File,我有一个包含许多文件的目录,大约50k。我想选择n最小的文件 import os def main(): listfile = os.listdir("../../folder") for singlefile in listfile: print singlefile 不幸的是,有了这段代码,我将把它们全部选中。您可以使用它来获取文件的大小。结合,您可以轻松找到最小的文件: def main(): # The folder containing files. directory

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

import os

def main():
listfile = os.listdir("../../folder")
for singlefile in listfile:
    print singlefile
不幸的是,有了这段代码,我将把它们全部选中。

您可以使用它来获取文件的大小。结合,您可以轻松找到最小的文件:

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])
from os import listdir
from os import stat
from heapq import nsmallest

n = 10
listfile = listdir("../../folder")
smallest = nsmallest(n, listfile, lambda x : stat(x).st_size)
您可以使用获取文件大小,然后根据它对文件进行排序。(
heapq.nsmallest
通常被优先考虑,但已经包含在另一个答案中,因此我将展示另一个选项):

一行:

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

除了以上的好办法,这是我的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)

“更小的尺寸”是什么意思?更小的文件尺寸@MSeifertThanks需要澄清-我已经这么想了,但想确定一下。这段代码是否选择了大小小于KB的前10个文件?这确实会选择前10个文件。是否还要按文件大小排序?在问题中你没有具体说明。是的,它起作用了。但我只需要列表中的文件名。@hackkato-cool然后只显示名称索引。更新的代码。@hackkato这对我来说很好用。是否愿意分享您遇到的错误?回溯(最后一次调用):文件“prova.py”,第12行,在main()文件“prova.py”中,第8行,在main中最小=nsmallest(n,listfile,lambda x:stat(x).st_size)文件“/usr/lib/python2.7/heapq.py”,第432行,在nsmallest result=\nsmallest(n,it)文件“prova.py”中,第8行,在minimate=nsmallest(n,listfile,lambda x:stat(x).st_size)OSError:[Errno 2]没有这样的文件或目录:'classes.apk.txt'无论如何这里不需要
lambda
。。。只需传递它
os.path.getsize
。。。
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)