Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 19, 2014 19:08:19

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

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

Пробовал так, но работает не правильно, т.е. нет доступа к некоторым папкам, таким как : Documents and Settings и другим подобным, как избежать эту ошибку? Использую PyScrypter. Функция FileMaskEquate была переписана с языка Delphi и усовершенствована немного. Система Windows 7 x64. Помогите найти ошибку. Заранее спасибо.

import time
import os
from os import listdir
from os.path import isfile
from os.path import join as joinpath
def FileMaskEquate(F, M):
    F = F.upper()
    M = M.upper()
    fl, ml = len(F) - 1, len(M) - 1
    mp, fp, ft = 0, 0, fl
    while ft > 0 :
        if F[ft] == "." :
            break
        ft -= 1
    if ft == 0 and M == '*.' :
         return 1;
    while mp <= ml:
        if fp > fl or mp > ml : return 0
        if M[mp] == "?" :
            mp += 1
            fp += 1
        elif M[mp] == "*":
            if mp == ml :
                return 1
            if M[mp + 1] == F[fp]:
                if F[fp] == '.' and ft != fp :
                    fp += 1
                else :
                    mp += 1
            elif fp == fl :
                return 0
            else :
                fp += 1
        elif F[fp] != M[mp] :
            return 0
        else :
            fp += 1
            mp += 1
    return 1
def DelFilesToMask(Path):
    #if not os.path.exists(Path) :
        #return 0
    if Path == 'c:\Documents and Settings' :
        return 0
    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 i in listdir(Path):
        s = joinpath(Path,i)
        if isfile(s):
            for i in a:
                if FileMaskEquate(os.path.basename(s), i) == 1:
                    print (s)
                    #os.remove(s)
        else :
            DelFilesToMask(s)
def main():
    DelFilesToMask("c:\\")
    time.sleep(3)
if __name__ == '__main__':
    main()

Отредактировано Nikfel (Янв. 19, 2014 19:09:10)

Офлайн

#2 Янв. 19, 2014 19:33:17

Singularity
Зарегистрирован: 2011-07-28
Сообщения: 1387
Репутация: +  75  -
Профиль   Отправить e-mail  

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

import os, glob
for file in glob.glob('/home/ihor/*.py'):
    os.remove(file)

а что это значит ? “*.^”

Отредактировано Singularity (Янв. 19, 2014 19:34:15)

Офлайн

#3 Янв. 19, 2014 19:48:06

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

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

Я просто хочу чтобы в папке были проверены все файлы удовлетворяющие маске файла и удалены. Запускаю проверку на поиск файлов по маске FileMaskEquate в папке C:\ и там нет доступа к некоторым папкам или это даже не папки, а ярлыки. Вроде находит файлы нормально, но при сканировании некоторых папок вылетает ошибка доступа и сканирование папок останавливается.

Singularity
import os, glob
for file in glob.glob('/home/ihor/*.py'):
os.remove(file)
Этот код не подходит, т.к. получает список файлов по одной маске, а я получаю список всех файлов и проверяю их на соответствие определенной маске файла. Проблема в моём коде в том что к некоторым папкам нет доступа и алгоритм не работает после того как попытается получить список файлов из папки.

Singularity
а что это значит ? “*.^”
Это маска для файла взяты из программы Wise Disk Cleaner. Вот только не знаю то ли задавать их в “ ” или ‘ ’

Отредактировано Nikfel (Янв. 19, 2014 20:01:50)

Офлайн

#4 Янв. 19, 2014 22:21:19

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

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

через os.access() проверь права

>>> os.access('/etc', os.R_OK)
True
>>> os.access('/etc', os.R_OK | os.W_OK)
False
>>>



Отредактировано py.user.next (Янв. 19, 2014 22:22:19)

Офлайн

#5 Янв. 20, 2014 04:55:23

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

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

Посмотрите модуль fnmatch, может подойдёт вместо собственного велосипеда.

..bw



Офлайн

#6 Янв. 20, 2014 06:30:49

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

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

Nikfel
пишет ошибку - выкладывайте полный код ошибки

Nikfel
Path == ‘c:\Documents and Settings’
так писать плохо - символ \ означает спец.символ последовательности, например “C:\t.file” на самом деле из за последовательности \t означающая символ табуляции будет выглядеть так: “C: .file”. Либо экранируйте символ так \\, т.е. “C:\\t.file” либо задавайте строки “сырыми”, например r“C:\t.file”.
Nikfel
time.sleep(3)
зачем здесь это - уму не приложу. неужто сделать видимость загруженности работой?

А вообще все это конечно один большой и достаточно ужасный велосипед. Если вам нужен именно хороший рабочий код в стиле Питона, а не С (да да делфи туда же), то вам на вооружение модули fnmatch или сразу glob, все остальное лишнее. Также имейте хоть сотню шаблонов, просто в цикле проверяйте их.

и еще, определитесь с самим понятием маски - если это UNIX pattern system, то там ?* это спец символы. Откройте справку на модуль fnmatch - там расписано. Всякие ^$ то это из регулярных выражений, это тема на порядок сложнее.



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

Офлайн

#7 Янв. 20, 2014 18:49:16

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

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

Осталась проблема вот с этим:

os.listdir('c:\\Documents and Settings\\')
PyScripter выдаёт следующее: PermissionError: Отказано в доступе: ‘c:\\Documents and Settings\\*.*’
Хотя это даже не папка, а ярлык на папку c:\Users\ , а моя функция DelFilesToMask получает список всех папок и вылет ошибки происходит когда доходит дело до c:\Documents and Settings\

os.access всегда выдает true на c:\Documents and Settings\ и проверка на существование этой папки через os.path.isdir(Path) всегда true.

Как устранить эту ошибку?

Отредактировано Nikfel (Янв. 20, 2014 19:12:25)

Офлайн

#8 Янв. 20, 2014 20:21:01

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

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

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:
            for i in a:
                strName = os.path.join(root, name)
                if fnmatch.fnmatch(os.path.basename(strName), i): 
                    if os.access(strName, os.W_OK):
                        os.remove(strName)
Указываю так диск C
DelFilesToMask("c:\\")
Ошибка подобная возникает с некоторыми файлами, т.е. отказ в доступе. Похоже не правильно использую os.access или надо использовать что-то другое.
Можно ли выбрать определенную папку используя os.walk?

Отредактировано Nikfel (Янв. 20, 2014 20:47:26)

Офлайн

#9 Янв. 20, 2014 21:38:58

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

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

Nikfel
Похоже не правильно использую os.access
в последнем коде неправильно
проверять надо папку, из которой удаляешь файлы, а не сами файлы

Nikfel
os.access всегда выдает true на c:\Documents and Settings\ и проверка на существование этой папки через os.path.isdir(Path) всегда true.

Nikfel
PermissionError: Отказано в доступе: ‘c:\\Documents and Settings\\*.*’

открой консоль просто и набери
import os
os.listdir('C:\\Documents and Settings\\')



Отредактировано py.user.next (Янв. 20, 2014 21:40:22)

Офлайн

#10 Янв. 20, 2014 22:11:04

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

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

py.user.next
открой консоль просто и набери
import os
os.listdir('C:\\Documents and Settings\\')
Выдаёт отказано в доступе.

А как проверить файлы на доступ, т.е. используются ли они другими программами, которые не дадут удалить файл?

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version