Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 28, 2011 21:56:11

apologize828
От:
Зарегистрирован: 2010-02-13
Сообщения: 223
Репутация: +  1  -
Профиль   Отправить e-mail  

удалить все пустые каталоги.

Блин чет не могу никак догнать, есть каталог с таким содержимым:
catalog:
– ab
–bd
–file.txt
–df
–gf
–пусто
и так далее.
В папках (ab, df) точно ничего нету кроме другой папки(bd, gf), а вот в этих папках могут лежать или не лежать файлы. Так вот необходимо: если например df -> gf -> пусто, то удалить gf и df.

думал рубануть так: получить список папок ab, df и т.д и узнать их размер ну и удалить там где вес 0. Но блин os.path.getsize(path) работает если os.path.getsize(path/to/the/catalog), а вот так os.path.getsize(path/to/the/ab) и на всех остальных показывает 0. хотя там есть папки где их вес не равен 0. Подскажите как можно реализовать такую задачу.



Офлайн

#2 Авг. 28, 2011 22:59:30

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

удалить все пустые каталоги.

Посчитать кол-во файлов (не-каталогов) для всех корневых папок? В вашем случае это будет ab - 1 df -0

Офлайн

#3 Авг. 29, 2011 01:25:48

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

удалить все пустые каталоги.

catalog:
–ab
–bd
–file.txt
–df
–gf
–пусто
–file.txt



Отредактировано (Авг. 29, 2011 01:28:51)

Офлайн

#4 Авг. 29, 2011 07:51:13

apologize828
От:
Зарегистрирован: 2010-02-13
Сообщения: 223
Репутация: +  1  -
Профиль   Отправить e-mail  

удалить все пустые каталоги.

s0rg
Посчитать кол-во файлов (не-каталогов) для всех корневых папок? В вашем случае это будет ab - 1 df -0
ок!попробую что-нить в этом духе.



Офлайн

#5 Авг. 29, 2011 08:32:46

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

удалить все пустые каталоги.

Если нужен код - могу дать, когда-то приходилось такую задачу решать

Офлайн

#6 Авг. 29, 2011 09:20:41

apologize828
От:
Зарегистрирован: 2010-02-13
Сообщения: 223
Репутация: +  1  -
Профиль   Отправить e-mail  

удалить все пустые каталоги.

s0rg
Если нужен код - могу дать, когда-то приходилось такую задачу решать
пока не надо сам попробую сделать! потом отпишусь!



Офлайн

#7 Авг. 29, 2011 11:50:00

apologize828
От:
Зарегистрирован: 2010-02-13
Сообщения: 223
Репутация: +  1  -
Профиль   Отправить e-mail  

удалить все пустые каталоги.

s0rg
Если нужен код - могу дать, когда-то приходилось такую задачу решать
если я правильно понял тут надо использовать рекурсию?но че-то не получается у меня с ней состряпать нифига(. Так что буду признателен за ваш код.



Офлайн

#8 Авг. 29, 2011 13:18:48

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

удалить все пустые каталоги.

#!/usr/bin/env python                                                                                                                                          
#-*- coding: utf8 -*-

import os

def dir_walker(root):
for fname in os.listdir(root):
path = os.path.join(root, fname)
if os.path.isdir(path):
for entry in dir_walker(path):
yield entry
yield path


def get_files_in_directory(root):
fcounter = dict()
for f in dir_walker(root):
base = f.split(os.sep)[1]
if os.path.isdir(base):
fcounter.setdefault(base, 0)
if os.path.isfile(f):
fcounter[base] += 1
return fcounter

files_counter = get_files_in_directory('.')

for key, value in sorted(files_counter.iteritems(), key=lambda (k, v): (v, k)):
print "%s -> %d" % (key, value)
Ну и с помощью shutil'а можно удалить те которые с 0

Офлайн

#9 Авг. 29, 2011 14:21:34

Dmitrys
От:
Зарегистрирован: 2011-08-26
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

удалить все пустые каталоги.

Предложу такое простенькое решение:

import os

def is_empty_dir(dirname):
for item in os.listdir(dirname):
item_path = os.path.join(dirname, item)
if os.path.isfile(item_path):
return 0
elif os.path.isdir(item_path):
result = is_empty_dir(item_path)
if result == 0:
return 0

return 1


dirname = os.getcwd()

for item in os.listdir(dirname):
item_path = os.path.join(dirname, item)
if os.path.isdir(item_path):
if not is_empty_dir(item_path):
print '%s is not empty' % (item_path)
Просьба камнями не кидаться :)



Офлайн

#10 Авг. 30, 2011 00:57:16

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2843
Репутация: +  186  -
Профиль   Отправить e-mail  

удалить все пустые каталоги.

Ловите вариант с рекурсией :)

#!/usr/bin/python
# -*- coding: utf-8 -*-
import os

def udalenie(kat, P = True):
if os.path.isdir(kat):
if len(os.listdir(kat)) > 0:
for x in os.listdir(kat):
if os.path.isdir(os.path.join(kat,x)):
if len(os.listdir(os.path.join(kat,x))) == 0: os.rmdir(os.path.join(kat,x))
else: udalenie(os.path.join(kat,x))
if P: udalenie(kat, False)
else: os.rmdir(kat)



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Отредактировано (Авг. 30, 2011 00:59:24)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version