Форум сайта python.su
Пробовал так, но работает не правильно, т.е. нет доступа к некоторым папкам, таким как : 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)
Офлайн
import os, glob for file in glob.glob('/home/ihor/*.py'): os.remove(file)
Отредактировано Singularity (Янв. 19, 2014 19:34:15)
Офлайн
Я просто хочу чтобы в папке были проверены все файлы удовлетворяющие маске файла и удалены. Запускаю проверку на поиск файлов по маске 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)
Офлайн
через 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)
Офлайн
Посмотрите модуль fnmatch, может подойдёт вместо собственного велосипеда.
..bw
Офлайн
Nikfel
пишет ошибку - выкладывайте полный код ошибки
Nikfelтак писать плохо - символ \ означает спец.символ последовательности, например “C:\t.file” на самом деле из за последовательности \t означающая символ табуляции будет выглядеть так: “C: .file”. Либо экранируйте символ так \\, т.е. “C:\\t.file” либо задавайте строки “сырыми”, например r“C:\t.file”.
Path == ‘c:\Documents and Settings’
Nikfelзачем здесь это - уму не приложу. неужто сделать видимость загруженности работой?
time.sleep(3)
Офлайн
Осталась проблема вот с этим:
os.listdir('c:\\Documents and Settings\\')
Отредактировано Nikfel (Янв. 20, 2014 19:12:25)
Офлайн
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)
DelFilesToMask("c:\\")
Отредактировано Nikfel (Янв. 20, 2014 20:47:26)
Офлайн
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)
Офлайн
py.user.nextВыдаёт отказано в доступе.
открой консоль просто и набериimport os os.listdir('C:\\Documents and Settings\\')
Офлайн