【问题标题】:Select the first n smallest files from a folder从文件夹中选择前 n 个最小的文件
【发布时间】:2017-10-28 03:14:09
【问题描述】:

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

import os

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

使用此代码,很遗憾,我将全部选中。

【问题讨论】:

  • 你所说的“更小的维度”是什么意思?
  • 文件更小。 @MSeifert
  • 感谢您的澄清 - 我已经这么认为了,但想确认一下。

标签: python python-2.7 file


【解决方案1】:

您可以使用os.path.getsize 获取文件大小,然后只使用sort 您的文件(heapq.nsmallest 通常是首选,但已在另一个答案中涵盖,因此我将展示替代方法):

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]

【讨论】:

    【解决方案2】:
    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])
    

    【讨论】:

    • 此代码是否选择大小以 KB 为单位的前 10 个文件,小于?
    • 这确实会选择前 10 个文件。您还想按文件大小排序吗?在您未指定的问题中。
    • 是的,它有效。但我只需要列表中的文件名。
    • @hackkato - 很酷,然后只显示名称索引。更新了代码。
    【解决方案3】:

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

    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)
    

    【讨论】:

    • @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 结果 = _nsmallest(n, it) 文件“prova.py”,行8、in minimum = nsmallest(n, listfile, lambda x : stat(x).st_size) OSError: [Errno 2] No such file or directory: 'classes.apk.txt'
    • 这里无论如何都不需要lambda...只需传递它os.path.getsize...
    【解决方案4】:

    除了上述好的解决方案,这是我的 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-29
      • 1970-01-01
      • 2019-07-20
      • 2011-04-08
      • 1970-01-01
      相关资源
      最近更新 更多