Получение файлов из аргумента Directory, сортировка по размеру

Я пытаюсь написать программу, которая принимает аргумент командной строки, просматривает дерево каталогов, предоставленное аргументом, и создает список всех файлов в каталоге, а затем сортирует по длине файлов.

Я не из сценариста, но это то, что у меня есть, и оно не работает:

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" 

Может кто-то указать мне верное направление?

3 Solutions collect form web for “Получение файлов из аргумента Directory, сортировка по размеру”

Надеюсь, эта функция поможет вам (я использую 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 

Это подход с использованием генераторов. Должно быть быстрее для большого количества файлов …

Это начало обоих примеров:

 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) ) 

Вы извлекаете команду, а не первый аргумент с 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]) 

Предполагая, что вам не нужен несортированный список, мы будем использовать метод sort ():

 files_list.sort(key=operator.itemgetter(1)) 
  • разбиение 32-битного числа на отдельные поля
  • Как python «знает», что делать с ключевым словом «in»?
  • В Python объект () равен чему угодно, кроме самого себя?
  • Изменение порядка отображения тегов в таблице (Google App Engine-Python)
  • Преобразование строки в список в Python
  • В чем разница между hasattr () и 'attribute' в dir ()?
  • Есть ли какой-либо умный способ комбинировать перекрывающиеся пути в python?
  • проблемы с psycopg2 на движке Google Apps
  • Чтение строки из файла без продвижения
  • Создать долгоживущий токен доступа из недолговечного?
  • Appengine remote_api_shell не работает с учетными данными приложения по умолчанию с момента обновления
  • Python - лучший язык программирования в мире.