2016-06-02 2 views
1

Мне нужно освободить место на диске с большим количеством файлов. Я хочу найти, какие папки занимают больше места в определенном месте, называемом C: \ RS_Data. Как только я определю, какой из sufolders занимает больше всего пространства, я хочу развернуть эти подпапки и выполнить ту же задачу. Так Iw ульд хотел разработать скрипт, который будет работать со мной указав путь для возвращения размера файлов и папок, Это может быть что-то вроде этого: C: \ RS_Data: Sub_Folder_1: 566000 кб Sub_Folder_2: 323333 кб Sub_folder_3 : 3,123,456 кб random_file.ext: 3123 кбPython - укажите размер подпапок в указанной папке

и так далее ...

Я тогда хотел запустить тот же сценарий на скажем Sub_folder_3.

Я нашел следующий сценарий на форуме и добавил paths.append (путь в строке 22:.

import locale 
import os 

locale.setlocale(locale.LC_ALL, "") 

def get_size(state, root, names): 
    paths = [os.path.realpath(os.path.join(root, n)) for n in names] 
    # handles dangling symlinks 
    state[0] += sum(os.stat(p).st_size for p in paths if os.path.exists(p)) 

def print_sizes(root): 
    total = 0 
    paths = [] 
    state = [0] 
    n_ind = s_ind = 0 
    for name in sorted(os.listdir(root)): 
     path = os.path.join(root, name) 
     if not os.path.isdir(path): 
      continue 
     paths.append(path) 

     state[0] = 0 
     os.path.walk(path, get_size, state) 
     total += state[0] 
     s_size = locale.format('%8.0f', state[0], 3) 
     n_ind = max(n_ind, len(name), 5) 
     s_ind = max(s_ind, len(s_size)) 
     paths.append((name, s_size)) 

    for name, size in paths: 
     print name.ljust(n_ind), size.rjust(s_ind), 'bytes' 
    s_total = locale.format('%8.0f', total, 3) 
    print '\ntotal'.ljust(n_ind), s_total.rjust(s_ind), 'bytes' 

print_sizes('.') 

Я получил сообщение об ошибке, что там было слишком много значения распаковывать Есть ли способ Ài может работать это со сценарием, работающий на пути, по которому я определяю?

Спасибо.

Я взял образец рекомендовал ниже и изменить его, так что функция может выполняться в цикле. Это возвращает 0 для всех файлов и папки в родительской папке. де:

import os 

myDir = "C:\\RS_Data" 
folders = os.listdir(myDir) 

for file in folders: 
    def get_size(start_path = file): 
     global total_size 
     total_size = 0 
     for dirpath, dirnames, filenames in os.walk(start_path): 
      for f in filenames: 
       fp = os.path.join(dirpath, f) 
       total_size += os.path.getsize(fp) 
     return total_size 

    print os.path.basename(file),":", get_size() 

Вот результат:

Attribute.gdb : 0 
Bookmarks : 0 
calculations : 0 
Common : 0 
Copy of CO_054_Run Batch Files.bat : 0 
CO_003_Run Batch Files.bat : 0 
CO_052_Run Batch Files.bat : 0 
CO_053_Run Batch Files.bat : 0 
CO_054_2_Run_Batch_Files.bat : 0 
CO_054_Run Batch Files.bat : 0 
CO_073_Run Batch Files_Old.bat : 0 
CO_073_Run_Batch_Files.bat : 0 
CO_073_Run_Batch_FilesREV1.bat : 0 
gdb backups : 0 
GeocodingInformation.gdb : 0 
GeocodingInformation.ldb : 0 
GeocodingInformation.mdb : 0 
GeocodingInformationold.mdb : 0 
GIS_Projects : 0 
Models : 0 
Network : 0 
Non_RS_MXDs : 0 
old2Run Batch Files.bat : 0 
old3Run Batch Files.bat : 0 
OldCO_052_053_054_Run Batch Files2.bat : 0 
OldCO_052_053_054_Run Batch FilesIJ.bat : 0 
oldCO_052_Run Batch Files.bat : 0 
oldCO_053_Run Batch Files.bat : 0 
oldCO_073_Run Batch Files.bat : 0 
orig_rs_system.mdb : 0 
orig_rs_system_backup.mdb : 0 
PatternGroup.gdb : 0 
Python : 0 
Recovered : 0 
robocopy.exe : 0 
ROBOUSERS.OUT : 0 
rs_system.mdb : 0 
rs_system_backup.mdb : 0 
rs_system_backupnew.ldb : 0 
rs_system_backupnew.mdb : 0 
Run Batch Files_old.bat : 0 
Scrap : 0 
Temp : 0 
Templates.gdb : 0 
Workspace : 0 
WorkspacesSettings.gdb : 0 

Если я запустить сценарий без цикла он возвращает накопительный размер указанной папки.

+0

Зачем использовать код на всех? Не будет ли эта команда делать то же самое, и вы можете отправить ее в файл, если хотите: dir c: \ myfolder/O: -S/S – mrunion

+0

Не уверен, но я думаю, что вам нужно запустить это в командной строке ? Если это так, у меня нет доступа, поскольку я убегаю от тонкого клиента и не имею прав администратора на сервере. – ShaunO

+0

ОК, справедливо. Но как вы собираетесь запускать свою программу Python? – mrunion

ответ

0

Существует аналогичный вопрос по адресу: Calculating a directory size using Python?

import os 
    def get_size(start_path = '.'): 
    total_size = 0 
    for dirpath, dirnames, filenames in os.walk(start_path): 
     for f in filenames: 
      fp = os.path.join(dirpath, f) 
      total_size += os.path.getsize(fp) 
    return total_size 
print get_size() 
+0

Да. Я тоже это видел, но продолжаю получать «UnboundLocalError: локальная переменная toatl_size», на которую ссылаются перед назначением ». Также я не вижу, где я могу указать папку, в которой я хочу вернуть результаты. – ShaunO

+0

@Shaun UnboundLocalError заключается в попытке использовать переменную до ее инициализации. Где вы впервые определили «total_size»? Попробуйте поместить «global total_size» в начале функции, которая изменяет ее значение. Вы также скопировали это сообщение об ошибке? Если это так, проблема в том, что вы указали «total_size» неправильно (вы сказали «toatl_size») –

+1

Так оно и было. toatl, а не общий. Но все же это возвращает один размер для того, что я считаю корневым каталогом. Я попытаюсь пропустить его, чтобы печатать папки и имена файлов с соответствующими размерами. – ShaunO

Смежные вопросы