Найти - Пользователи
Полная версия: Как удалить файлы по маске?
Начало » Python для новичков » Как удалить файлы по маске?
1 2 3
py.user.next
Nikfel
Выдаёт отказано в доступе.
проверил у себя - то же самое
делай через try … except … с отловом PermissionError

Nikfel
и там нет доступа к некоторым папкам или это даже не папки, а ярлыки
да, это непонятно что
Nikfel
Написал таким образом:
# 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++ или в делфи и других языках программирования.
sanodin
недавно боролся с отказом в доступе
http://python.su/forum/topic/22988/?page=2
копировать можно, удалять нет
py.user.next
Nikfel
Не достаток в медлительности процесса
try … except … - медленная конструкция, поэтому лучше через проверки делать
возможно, там через os.stat() можно понять, нормальная это папка или нет

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

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

py.user.next
у тебя, к примеру, если файл не может быть удалён, продолжают проверяться остальные маски для него
и проверяется существование файла, когда он и так найден как существующий
+1. Nikfel
если вас не устраивает скорость работы вашего кода, то вам нужно делать профилирование, для выявления “узких” мест. И далее оптимизировать код.
JOHN_16
py.user.next
try … except … - медленная конструкция, поэтому лучше через проверки делать
на самом деле зависит от ситуации (входных данных). У меня был случай когда эта конструкция работала ощутимо быстрее нежели проверки. Речь там шла о переводе строки в целочисленное целое большого числа строк. try ..except вышло по времени выгоднее чем str.isdigit(). Но опять таки - все зависит от входных данных, в ином случае картина может быть диаметрально противоположной.
pyuser
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)
Выполняться будет не быстро, но гораздо быстрее Вашего варианта
sanodin
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)#удаление
Nikfel
py.user.next
тебе надо подтянуть алгоритмизацию
С этим согласен. Просто я не давно начал изучать питон самостоятельно и внимательности не хватает. Мне больше нравится язык Delphi и C++.

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

Всем спасибо. Буду пробовать книжки о питоне.
4kpt_II
А мне очень не нравится делфи. Сам на нем долгое время работал. Вспоминаю с ужасом эти деньки
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