Найти - Пользователи
Полная версия: удалить все пустые каталоги.
Начало » Python для новичков » удалить все пустые каталоги.
1 2
apologize828
Блин чет не могу никак догнать, есть каталог с таким содержимым:
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
Посчитать кол-во файлов (не-каталогов) для всех корневых папок? В вашем случае это будет ab - 1 df -0
py.user.next
catalog:
–ab
–bd
–file.txt
–df
–gf
–пусто
–file.txt
apologize828
s0rg
Посчитать кол-во файлов (не-каталогов) для всех корневых папок? В вашем случае это будет ab - 1 df -0
ок!попробую что-нить в этом духе.
s0rg
Если нужен код - могу дать, когда-то приходилось такую задачу решать
apologize828
s0rg
Если нужен код - могу дать, когда-то приходилось такую задачу решать
пока не надо сам попробую сделать! потом отпишусь!
apologize828
s0rg
Если нужен код - могу дать, когда-то приходилось такую задачу решать
если я правильно понял тут надо использовать рекурсию?но че-то не получается у меня с ней состряпать нифига(. Так что буду признателен за ваш код.
s0rg
#!/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
Предложу такое простенькое решение:

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
Ловите вариант с рекурсией :)

#!/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)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB