apologize828
Авг. 28, 2011 21:56:11
Блин чет не могу никак догнать, есть каталог с таким содержимым:
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. Подскажите как можно реализовать такую задачу.
s0rg
Авг. 28, 2011 22:59:30
Посчитать кол-во файлов (не-каталогов) для всех корневых папок? В вашем случае это будет ab - 1 df -0
py.user.next
Авг. 29, 2011 01:25:48
catalog:
–ab
–bd
–file.txt
–df
–gf
–пусто
–file.txt
apologize828
Авг. 29, 2011 07:51:13
s0rg
Посчитать кол-во файлов (не-каталогов) для всех корневых папок? В вашем случае это будет ab - 1 df -0
ок!попробую что-нить в этом духе.
s0rg
Авг. 29, 2011 08:32:46
Если нужен код - могу дать, когда-то приходилось такую задачу решать
apologize828
Авг. 29, 2011 09:20:41
s0rg
Если нужен код - могу дать, когда-то приходилось такую задачу решать
пока не надо сам попробую сделать! потом отпишусь!
apologize828
Авг. 29, 2011 11:50:00
s0rg
Если нужен код - могу дать, когда-то приходилось такую задачу решать
если я правильно понял тут надо использовать рекурсию?но че-то не получается у меня с ней состряпать нифига(. Так что буду признателен за ваш код.
s0rg
Авг. 29, 2011 13:18:48
#!/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
Dmitrys
Авг. 29, 2011 14:21:34
Предложу такое простенькое решение:
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)
Просьба камнями не кидаться :)
Rodegast
Авг. 30, 2011 00:57:16
Ловите вариант с рекурсией :)
#!/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)