, , , ,st.write(n+'\n') # или вывод в файл
, ,st.close()
def run_analiz(fn):
, ,count = 1 # счетчик строк
, ,if not os.path.isfile(fn): # проверка существования файла
, , , ,print('"'+fn+'" file does not exist.')
, , , ,return
, ,
, ,global Tagss
, ,f = open(fn, 'rb') #
, ,d = f.read()
, ,for n in d:
, , , ,if n == 10: # символ завершения строки
, , , , , ,count += 1 # + в счетчик строк
, , , ,elif chr(n) == '<': # начало тега
, , , , , ,flag = True
, , , , , ,Tag = '' # подготовка места для тега
, , , ,else:
, , , , , ,if flag: # читаем тег
, , , , , , , ,if chr(n) == '>': # провека на конец тега, если да:
, , , , , , , , , ,S = Tag.split(' ')[0] # отбрасывание возможных параметров
, , , , , , , , , ,flag = False
, , , , , , , , , ,if S[0] == '/': # проверка на закрывающий тег
, , , , , , , , , , , ,Tagss.append(str(count)+' <'+S)
, , , , , , , , , , , ,S = S[1:] # удаление слеша
, , , , , , , , , , , ,Lo = L.pop() # чтение из стека
, , , , , , , , , , , ,if Lo[0] != S: # сообщение об ошибке
, , , , , , , , , , , , , ,printStack() # распечатка стека
, , , , , , , , , , , , , , # ежели такая распечатка не нужна - закомментируйте
, , , , , , , , , , , , , ,print('Teg = "'+Lo[0]+'" begin in str = '+ str(Lo[1]))
, , , , , , , , , , , , , ,print('Не соответствует')
, , , , , , , , , , , , , ,print('Teg ="' +S+ '"end in str = '+ str(count))
, , , , , , , , , , , , , ,f.close()
, , , , , , , , , , , , , ,return
, , , , , , , , , ,else:
, , , , , , , , , , , ,if Tag[-1] != '/': # обработка одинарных тегов
, , , , , , , , , , , , , ,T = Tag.split(' ')
, , , , , , , , , , , , , ,Tagss.append(str(count)+' <'+T[0])
, , , , , , , , , , , , , ,Lo = [S, count] # подготовка для записи в стек
, , , , , , , , , , , , , ,L.append(Lo) # запись в стек
, , , , , , , ,else:
, , , , , , , , , ,Tag = Tag + chr(n) # добавление символа к тегу
, ,f.close()
, ,print('OK!!!') # сообщение об удачной проверке.
while True: # бесконечный цикл проверок
FN = input('Введите имя файла: ['+file+']')
if FN == '': # если сразу нажат "Enter"
, , run_analiz(file) # повторяем проверку файла
else:
, , file = FN # запоминаем новое имя
, , run_analiz(file) # проверяем новый файл
fb2errors.py
#!/usr/bin/env python
# -*- codning: utf-8 -*-
import sys, os
import zipfile
# создание списка файлов fb2 с повреждением структуры
#----------------------------------------------
OList = []
Count = 0
def fb2err(fn): # проверка структуры файла
, ,global Count
, ,flag = False # признак анализа тега
, ,S = '' # место для обработанного тега
, ,Tag = '' # место для тега
, ,L = [] # стек
, ,if isinstance(fn, str):
, , , ,f = open(fn, 'rb') # открыт .fb2
, , , ,d = f.read()
, ,else:
, , , ,d = fn.read() # открыт .zip
, ,for n in d:
, , , ,if chr(n) == '<': # начало тега
, , , , , ,flag = True
, , , , , ,Tag = '' # подготовка места для тега
, , , ,else:
, , , , , ,if flag: # читаем тег
, , , , , , , ,if chr(n) == '>': # провека на конец тега, если да:
, , , , , , , , , ,S = Tag.split(' ')[0] # отбрасывание возможных параметров
, , , , , , , , , ,flag = False
, , , , , , , , , ,if S[0] == '/': # проверка на закрывающий тег
, , , , , , , , , , , ,S = S[1:] # удаление слеша
, , , , , , , , , , , ,Lo = L.pop() # чтение из стека
, , , , , , , , , , , ,if Lo != S: # ОШИБКА
, , , , , , , , , , , , , ,Count += 1
, , , , , , , , , , , , , ,return True
, , , , , , , , , ,else:
, , , , , , , , , , , ,if Tag[-1] != '/': # обработка одинарных тегов
, , , , , , , , , , , , , , L.append(S) # запись в стек
, , , , , , , ,else:
, , , , , , , , , ,Tag = Tag + chr(n) # добавление символа к тегу
, ,return False # удачная проверка.
def parse_zip(fn): # обработка zip
, ,global OList
, ,z = zipfile.ZipFile(fn, 'r')
, ,filelist = z.namelist()
, ,filelist.sort()
, ,for n in filelist:
, , , ,try:
, , , , , ,if n[-4:] == ".fb2":
, , , , , , , ,if fb2err(z.open(n, 'r')):
, , , , , , , , , ,OList.append(fn)
, , , ,except:
, , , , , ,print( "X15:", n )
def parse_file(fn): # обработка файла
, ,global OList
, ,m = fn.split(".")[-1]
, ,if (m == "zip"): # если zip
, , , ,parse_zip(fn)
, ,elif (m == "fb2"): # если fb2
, , , ,if fb2err(fn):
, , , , , ,OList.append(fn)
, , , ,
def parse_dir(fn): # сканирование папки
, ,dirlist = os.listdir(fn)
, ,dirlist.sort()
, ,for a in dirlist:
, , , ,b = os.path.join(fn, a)
, , , ,if os.path.isdir(b):
, , , , , ,parse_dir(b) # сканирование подпапки
, , , ,else:
, , , , , ,if os.path.getsize(b) > 0:
, , , , , , , ,parse_file(b)
#-------------------------
path = os.getcwd()
parse_dir(path) # сканирование текущей папки
if len(OList) > 0: # сохранение результатов
, ,fn = 'fb2Error.txt'
# при необходимости сохранения старых файлов fb2Error.txt - снять комментарии
, ,nu = 0
, ,while os.path.isfile(fn):
, , , ,nu += 1
, , , ,fn = 'fb2Error'+str(nu)+'.txt'
#
, ,f = open(fn, 'w')
, ,for i in OList:
, , , ,f.write(i+'\n')
, ,f.close()
print('Файлов с ошибкой '+str(Count))
moveIn.py
#!/usr/bin/env python
# -*- codning: utf-8 -*-
import sys, os
import shutil
# перемещение поврежденный файлов fb2 для последующего ремонта
#----------------------------------------------
path = os.getcwd()
Count = 0