从Directory Argument中获取文件,按大小排序

时间:2013-11-27 20:40:11

标签: python

我正在尝试编写一个带有命令行参数的程序,扫描参数提供的目录树,并创建目录中每个文件的列表,然后按文件长度排序。

我不是一个剧本家伙 - 但这就是我所拥有的并且它不起作用:

import sys
import os
from os.path import getsize

file_list = []

#Get dirpath
dirpath = os.path.abspath(sys.argv[0])
if os.path.isdir(dirpath):
    #Get all entries in the directory
    for root, dirs, files in os.walk(dirpath):
        for name in files:
            file_list.append(name)
        file_list = sorted(file_list, key=getsize)
        for item in file_list:
            sys.stdout.write(str(file) + '\n')

else:
    print "not found"

有人能指出我正确的方向吗?

4 个答案:

答案 0 :(得分:10)

希望这个函数可以帮助你(我正在使用Python 2.7):

import os    

def get_files_by_file_size(dirname, reverse=False):
    """ Return list of file paths in directory sorted by file size """

    # Get list of files
    filepaths = []
    for basename in os.listdir(dirname):
        filename = os.path.join(dirname, basename)
        if os.path.isfile(filename):
            filepaths.append(filename)

    # Re-populate list with filename, size tuples
    for i in xrange(len(filepaths)):
        filepaths[i] = (filepaths[i], os.path.getsize(filepaths[i]))

    # Sort list by file size
    # If reverse=True sort from largest to smallest
    # If reverse=False sort from smallest to largest
    filepaths.sort(key=lambda filename: filename[1], reverse=reverse)

    # Re-populate list with just filenames
    for i in xrange(len(filepaths)):
        filepaths[i] = filepaths[i][0]

    return filepaths

答案 1 :(得分:7)

这是一种使用生成器的方法。对于大量文件应该更快......

这是两个例子的开头:

import os, operator, sys
dirpath = os.path.abspath(sys.argv[0])
# make a generator for all file paths within dirpath
all_files = ( os.path.join(basedir, filename) for basedir, dirs, files in os.walk(dirpath) for filename in files   )

如果您只想要一个没有大小的文件列表,可以使用:

sorted_files = sorted(all_files, key = os.path.getsize)

但是如果您想要列表中的文件和路径,可以使用:

# make a generator for tuples of file path and size: ('/Path/to/the.file', 1024)
files_and_sizes = ( (path, os.path.getsize(path)) for path in all_files )
sorted_files_with_size = sorted( files_and_sizes, key = operator.itemgetter(1) )

答案 2 :(得分:1)

您正在使用argv[0]提取命令而不是第一个参数;使用argv[1]

dirpath = sys.argv[1]  # argv[0] contains the command itself.

出于性能原因,我建议您预取文件大小,而不是在排序过程中多次询问操作系统有关同一文件的大小(正如Koffein建议的那样,os.walk是要走的路):

files_list = []
for path, dirs, files in os.walk(dirpath)):
    files_list.extend([(os.path.join(path, file), getsize(os.path.join(path, file))) for file in files])

假设您不需要未排序的列表,我们将使用就地排序()方法:

files_list.sort(key=operator.itemgetter(1))

答案 3 :(得分:0)

使用熊猫怎么样?

import pandas as pd
import os

file_paths = [os.path.join(files_dir, file_name) for file_name in os.listdir(files_dir)]
file_sizes = [os.path.getsize(file_path) for file_path in file_paths]

df = pd.DataFrame({'file_path': file_paths, 'file_size': file_sizes}).sort_values('file_size', ascending = False)

然后,您可以轻松地从df中恢复值列表。