Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 21, 2014 12:50:04

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

Как удалить файлы по маске?

Nikfel
Выдаёт отказано в доступе.
проверил у себя - то же самое
делай через try … except … с отловом PermissionError

Nikfel
и там нет доступа к некоторым папкам или это даже не папки, а ярлыки
да, это непонятно что



Офлайн

#2 Янв. 22, 2014 20:35:57

Nikfel
Зарегистрирован: 2014-01-19
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Как удалить файлы по маске?

Написал таким образом:

# coding: cp1251
import os, fnmatch, ctypes
from os import listdir
from os.path import isfile
from os.path import join as joinpath
SHERB_NOCONFIRMATION = 1
SHERB_NOPROGRESSUI   = 2
SHERB_NOSOUND        = 4
def EmptyRecycleBin(options=SHERB_NOCONFIRMATION or SHERB_NOPROGRESSUI or SHERB_NOSOUND):
    ctypes.windll.shell32.SHEmptyRecycleBinA(None, None, options)
fil = open('error_Delete.log', 'w')
def ClearFolder(Path):
    for root, dirs, files in os.walk(Path):
        for name in files:
            strName = os.path.join(root, name)
            if isfile(strName) :
                try:
                    if os.path.exists(strName) :
                        print ('Удаление : ' + strName)
                        os.remove(strName)
                except PermissionError:
                    fil.write(strName + '\n')
                    continue
def DelFilesToMask(Path):
    a = ["*.diz", "*.tmp", "*.temp", "*.chk", "*.old", "*.gid", "*.nch", "*.wbk",
    "*.fts", "*.ftg", "*.$$$", "*log.txt", "*.err", "*.---", "*.~*", "~*.*", "*.??$",
    "*.___", "*.log", "*.~mp", "*._mp", "*.dmp", "*.prv", "*.sik", "*.bak", "thumbs.db",
    "CHKLIST.MS", "*.ilk", "*.aps", "*.ncb", "*.pch", "*.$db", "*.?$?", "*.??~", "*.?~?",
    "*.db$", "*.^", "*._dd", "*._detmp", "chklist.*", "mscreate.dir", "log*.txt", "*.log?"]
    for root, dirs, files in os.walk(Path):
        for name in files:
            strName = os.path.join(root, name)
            for i in a:
                if fnmatch.fnmatch(os.path.basename(strName), i):
                    try:
                        if os.path.exists(strName) :
                            print ('Удаление : ' + strName)
                            os.remove(strName)
                    except PermissionError:
                        fil.write(strName + '\n')
                        continue
def main():
    tmp = os.path.expandvars('%TEMP%')
    temp = os.path.expandvars('%SystemRoot%\TEMP')
    print("Очистка \n\n" + tmp + '\n')
    ClearFolder(tmp)
    print('\n' + temp + '\n')
    ClearFolder(temp)
    print("\nОчистка корзины \n")
    EmptyRecycleBin(options=SHERB_NOCONFIRMATION)
    print("Очистка файлов на диске C: \n")
    DelFilesToMask('c:\\')
    print("Завершено")
    fil.close()
if __name__ == '__main__':
    main()
Не достаток в медлительности процесса, но зато работает. По нормальному похоже код можно написать только в c++ или в делфи и других языках программирования.

Офлайн

#3 Янв. 22, 2014 21:47:57

sanodin
От:
Зарегистрирован: 2011-06-16
Сообщения: 515
Репутация: +  31  -
Профиль   Отправить e-mail  

Как удалить файлы по маске?

недавно боролся с отказом в доступе
http://python.su/forum/topic/22988/?page=2
копировать можно, удалять нет

Отредактировано sanodin (Янв. 23, 2014 08:18:54)

Офлайн

#4 Янв. 22, 2014 23:29:11

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

Как удалить файлы по маске?

Nikfel
Не достаток в медлительности процесса
try … except … - медленная конструкция, поэтому лучше через проверки делать
возможно, там через os.stat() можно понять, нормальная это папка или нет

Nikfel
По нормальному похоже код можно написать только в c++ или в делфи
по скорости разработки питон быстрее

тебе надо подтянуть алгоритмизацию
у тебя, к примеру, если файл не может быть удалён, продолжают проверяться остальные маски для него
и проверяется существование файла, когда он и так найден как существующий



Офлайн

#5 Янв. 23, 2014 00:02:40

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Как удалить файлы по маске?

Nikfel
По нормальному похоже код можно написать только в c++ или в делфи и других языках программирования.
я по нормальному пишу на Питоне. А если вы хотите сказать о быстродействии, то компилируемые языки быстрее интепретируемых - это милион раз не новость, а ассемблер вероятнее еще быстрее чем с/с++.

py.user.next
у тебя, к примеру, если файл не может быть удалён, продолжают проверяться остальные маски для него
и проверяется существование файла, когда он и так найден как существующий
+1. Nikfel
если вас не устраивает скорость работы вашего кода, то вам нужно делать профилирование, для выявления “узких” мест. И далее оптимизировать код.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#6 Янв. 23, 2014 00:08:48

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Как удалить файлы по маске?

py.user.next
try … except … - медленная конструкция, поэтому лучше через проверки делать
на самом деле зависит от ситуации (входных данных). У меня был случай когда эта конструкция работала ощутимо быстрее нежели проверки. Речь там шла о переводе строки в целочисленное целое большого числа строк. try ..except вышло по времени выгоднее чем str.isdigit(). Но опять таки - все зависит от входных данных, в ином случае картина может быть диаметрально противоположной.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#7 Янв. 23, 2014 03:10:41

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

Как удалить файлы по маске?

Nikfel
Не достаток в медлительности процесса, но зато работает
Вам правильно сказали
py.user.next
тебе надо подтянуть алгоритмизацию
Попробуйте так:
import fnmatch
import os
import re
def delete_files_by_mask(root, masks):
    root = os.path.abspath(root)
    pattern = re.compile("|".join(map(fnmatch.translate, masks)), re.I).match
    for path, dirs, files in os.walk(root):
        for name in filter(pattern, files):
            try:
                filename = os.path.join(path, name)
                os.remove(os.path.join(path, filename))
            except OSError as e:
                print("{}: {}".format(e.strerror, filename))
masks = ["*.diz", "*.tmp", "*.temp", "*.chk", "*.old", "*.gid", "*.nch", "*.wbk",
    "*.fts", "*.ftg", "*.$$$", "*log.txt", "*.err", "*.---", "*.~*", "~*.*", "*.??$",
    "*.___", "*.log", "*.~mp", "*._mp", "*.dmp", "*.prv", "*.sik", "*.bak", "thumbs.db",
    "CHKLIST.MS", "*.ilk", "*.aps", "*.ncb", "*.pch", "*.$db", "*.?$?", "*.??~", "*.?~?",
    "*.db$", "*.^", "*._dd", "*._detmp", "chklist.*", "mscreate.dir", "log*.txt", "*.log?"]
delete_files_by_mask(r"c:\", masks)
Выполняться будет не быстро, но гораздо быстрее Вашего варианта



Офлайн

#8 Янв. 23, 2014 09:13:03

sanodin
От:
Зарегистрирован: 2011-06-16
Сообщения: 515
Репутация: +  31  -
Профиль   Отправить e-mail  

Как удалить файлы по маске?

http://technet.microsoft.com/ru-ru/sysinternals/bb897556
можете проделать подобное на python
подобным образом и анлокер действует если не может убить процесс пользующий файл
P.S. все равно надо аккуратней с удалением системных файлов, исключить директории, которые нежелательно трогать, например удаление этого файла c:\Boot\BCD.LOG, может вызвать при следующей загрузке, проблемы

import win32api
import win32con
#win32file.MoveFileEx("test.txt", "test2.txt" , win32file.MOVEFILE_DELAY_UNTIL_REBOOT)#переименование
win32api.MoveFileEx("C:\\san.txt", None, win32con.MOVEFILE_DELAY_UNTIL_REBOOT)#удаление

Отредактировано sanodin (Янв. 23, 2014 14:13:22)

Офлайн

#9 Янв. 26, 2014 10:37:45

Nikfel
Зарегистрирован: 2014-01-19
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Как удалить файлы по маске?

py.user.next
тебе надо подтянуть алгоритмизацию
С этим согласен. Просто я не давно начал изучать питон самостоятельно и внимательности не хватает. Мне больше нравится язык Delphi и C++.

JOHN_16
если вас не устраивает скорость работы вашего кода, то вам нужно делать профилирование, для выявления “узких” мест. И далее оптимизировать код.
Со всеми основами языка питон я ещё не разобрался для этого. Подозреваю что скорость моего кода мала из-за того что много циклов использую, наверно можно найти способ проще, но для этого нужно глубже изучить питон.

Всем спасибо. Буду пробовать книжки о питоне.

Офлайн

#10 Янв. 26, 2014 19:21:51

4kpt_II
От: Харьков
Зарегистрирован: 2013-10-24
Сообщения: 999
Репутация: +  58  -
Профиль   Отправить e-mail  

Как удалить файлы по маске?

А мне очень не нравится делфи. Сам на нем долгое время работал. Вспоминаю с ужасом эти деньки

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version