<?xml version="1.0" encoding="utf-8"?>
<FictionBook xmlns="http://www.gribuser.ru/xml/fictionbook/2.0"
  xmlns:l="http://www.w3.org/1999/xlink">
  <description>
  <title-info>
<genre>comp_programming</genre>
   <author>
    <first-name>W</first-name>
    <last-name>Cat</last-name>
    <nickname>w_cat</nickname>
   </author>
    <book-title>Приложение к «Python в библиотеке»</book-title>
<annotation>
<p>Запустив скрипт «fb2_dir.py» Вы извлечете из файла исходники сакриптов.</p>
</annotation>
   <lang>ru</lang>
  </title-info>
  <document-info>
   <author>
    <first-name>W</first-name>
    <last-name>Cat</last-name>
    <nickname>w_cat</nickname>
   </author>
   <program-used>my_Make_FB2</program-used>
   <date value="2022-07-09">09.07.2022</date>
    <id>2022-07-09-18-52-40-044-3153</id>
    <version>1.0</version>
  </document-info>
 </description>
<body>
<section type="d">
<title><p>Arch</p></title>
<section>
<title><p>read_me.txt</p></title>
<p>Здравствуйте.
</p>
<p>Данный файл является приложением к опусу «Python в библиотеке». Здесь собраны основные скрипты упомянутые в учебнике.
</p>
<p>Основная «фишка» данного текста такая: «легким движением» выполнения скрипта «fb2_dir.py» содержимое этого файла скопируется в папки и файлы со скриптами.
</p>
<p>Т.е. при успешном выполнении нижеследующих действий в Вашем распоряжении появятся исходные коды скриптов.
</p>
<p>Действия следующие:
</p>
<p>1. любым способом скопируйте скрипт «fb2_dir.py» из файла fb2 в отдельный файл.
</p>
<p>2. замените блоки « , ,» на блок из четырех пробелов.
</p>
<p>3. поместите данный файл и скрипт «fb2_dir.py» в отдельную папку (желательно).
</p>
<p>4. запустите скрипт. Если все сделано правильно, появится папка с исходниками
</p>
<p>5. вполне разумно ВЫ можете опасаться злонамеренных действий ужасного хакера w_cat.
</p>
<p>Предварительно внимательно проверьте предлагаемые скрипты, от этого все только выиграют.
</p>
<p>
</p>
<p>w_cat
</p>
<p>
</p>
<p>PS
</p>
<p>Да, ежели не будет протестов от читателей, я намереваюсь регулярно обновлять этот файл, пополняя и исправляя его содержимое.
</p>
<p>13.07.2022
</p>
</section>
<section type="f">
<title><p>fb2_dir.py</p></title>
<p>#!/usr/bin/env python
</p>
<p># -*- coding: utf-8 -*-
</p>
<p>import sys, os
</p>
<p># преобразование файла fb2 в каталог с папками и файлами
</p>
<p>#--------------------------------------------------
</p>
<p>stack = []
</p>
<p>List = []
</p>
<p>#---
</p>
<p>def SaveList(fn, L):
</p>
<p> , ,f = open(fn, 'w', encoding="utf-8")
</p>
<p> , ,for i in L:
</p>
<p> , , , ,f.write(my_str(i))
</p>
<p> , ,f.close()
</p>
<p>
</p>
<p>def my_str(s): 
</p>
<p> , ,s=s.replace(' , ,','    ')
</p>
<p> , ,s=s.replace('&#38;#62;','**')# вставьте вместо ** символ "больше"
</p>
<p> , ,s=s.replace('&#38;#60;','**')# вставьте вместо ** символ "меньше"
</p>
<p> , ,return s
</p>
<p>#----------------------------------------
</p>
<p>
</p>
<p>path = os.getcwd()
</p>
<p>cur_dir = path
</p>
<p>fb2_file = 'fb.fb2'
</p>
<p>
</p>
<p>if not os.path.isfile(fb2_file):
</p>
<p> , ,sys.exit(fb2_file + ' - does not exist')
</p>
<p>folder = False
</p>
<p>text_f = False
</p>
<p>Other = False
</p>
<p>f =open(fb2_file, encoding="utf-8")
</p>
<p>Li=f.readlines()
</p>
<p>for i in Li:
</p>
<p> , ,if Other:
</p>
<p> , , , ,if i.find('&#60;/section')==0:
</p>
<p> , , , , , ,Other = False
</p>
<p> , , , ,continue
</p>
<p> , ,if text_f:
</p>
<p> , , , ,if i.find('&#60;/section')==0:
</p>
<p> , , , , , ,text_f = False
</p>
<p> , , , , , ,SaveList(file_name, List)
</p>
<p> , , , ,elif i.find('&#60;title&#62;')==0:
</p>
<p> , , , , , ,s = i[10:-13]
</p>
<p> , , , , , ,file_name = os.path.join(cur_dir, s)
</p>
<p> , , , ,elif i.find('&#60;/p&#62;')&#62;-1:
</p>
<p> , , , , , ,i = ''
</p>
<p> , , , ,else:
</p>
<p> , , , , , ,List.append(i[3:]) , ,
</p>
<p> , , , ,continue
</p>
<p> , , , ,
</p>
<p> , ,if folder:
</p>
<p> , , , ,if i.find('&#60;title&#62;')==0:
</p>
<p> , , , , , ,s = i[10:-13]
</p>
<p> , , , , , ,cur_dir =  os.path.join(cur_dir, s)
</p>
<p> , , , , , ,stack.insert(0,cur_dir)
</p>
<p> , , , , , ,if os.path.isdir(cur_dir):
</p>
<p> , , , , , , , ,sys.exit(cur_dir + ' - exists')
</p>
<p> , , , , , ,os.mkdir(cur_dir)
</p>
<p> , , , , , ,folder = False
</p>
<p> , , , ,continue
</p>
<p> , ,if i.find('&#60;section')==0:
</p>
<p> , , , ,if i.find('type="d"')&#62; -1:
</p>
<p> , , , , , ,folder = True
</p>
<p> , , , ,else:
</p>
<p> , , , , , ,if i.find('type="f"')&#62; -1:
</p>
<p> , , , , , , , ,text_f = True
</p>
<p> , , , , , , , ,List.clear()
</p>
<p>
</p>
<p> , ,if i.find('&#60;/section')==0: 
</p>
<p> , , , ,if len(stack)&#62;0:
</p>
<p> , , , , , ,stack.pop(0)
</p>
<p> , , , , , ,if len(stack)&#62;0:
</p>
<p> , , , , , , , ,cur_dir = stack[0]
</p>
<p>
</p>
<p>print( 'Done!')
</p>
<p> Конец скрипта fb2_dir.py
</p>
<p>
</p>
</section>
<section type="d">
<title><p>3</p></title>
<section type="f">
<title><p>spas2.py</p></title>
<p>#!/bin/env python
</p>
<p># -*- coding: utf-8 -*-
</p>
<p># replacing spaces with dots
</p>
<p>import sys, os
</p>
<p>
</p>
<p>path = os.getcwd()
</p>
<p>
</p>
<p>def work():
</p>
<p>   new_List = [] #
</p>
<p>   old_List = []
</p>
<p>   new_List.clear() #
</p>
<p>   old_List.clear()
</p>
<p>   print('')
</p>
<p>   FN = input('Введите имя файла:')
</p>
<p>
</p>
<p>   fn1=os.path.join(path, FN)
</p>
<p>   base=os.path.splitext(FN)[0]
</p>
<p>   fb2_file=open(fn1,'r')
</p>
<p>   old_List=fb2_file.readlines()
</p>
<p>   fb2_file.close()
</p>
<p>
</p>
<p>   n = 0
</p>
<p>   for item in old_List:
</p>
<p> , ,  n += 1
</p>
<p> , ,  s='|'+item
</p>
<p> , ,  s=s.replace('\t','    ')
</p>
<p> , ,  s=s.replace('|    ','| . .')   
</p>
<p> , ,  s=s.replace('    ',' . .')
</p>
<p> , ,  s = "{0:2d}{1:s}".format(n,s)
</p>
<p> , ,  new_List.append(s)
</p>
<p>
</p>
<p>   fn2=os.path.join(path, base)+".txt"
</p>
<p>   new_file=open(fn2,'w')
</p>
<p>
</p>
<p>   for item in new_List:
</p>
<p> , ,  new_file.write(item)
</p>
<p>
</p>
<p>   new_file.close()
</p>
<p>
</p>
<p>   print('Done')
</p>
<p>
</p>
<p>while True:
</p>
<p>   work() # Exit =&#62; Ctrl + C
</p>
</section>
<section type="f">
<title><p>_my_zip.py</p></title>
<p>#!/usr/bin/env python
</p>
<p># -*- coding: utf-8 -*-
</p>
<p># Упаковка файлов fb2 в архивы zip
</p>
<p>import sys, os
</p>
<p>import zipfile
</p>
<p>
</p>
<p>co = 0
</p>
<p>
</p>
<p>def parse_file(FileName):
</p>
<p> , ,global co
</p>
<p> , ,fn = os.path.basename(FileName)
</p>
<p># , ,print fn+'.zip'
</p>
<p>
</p>
<p> , ,z = zipfile.ZipFile(fn+'.zip', 'w', zipfile.ZIP_DEFLATED)  # Создание нового архива
</p>
<p> , ,z.write(fn)
</p>
<p> , ,z.close()
</p>
<p> , ,os.remove(FileName)
</p>
<p> , ,co += 1
</p>
<p>
</p>
<p>
</p>
<p>def parse_dir(fn):
</p>
<p> , , , ,m = fn.split('.')[-1]
</p>
<p># , , , ,print fn
</p>
<p> , , , ,if (m == 'fb2'):
</p>
<p> , , , , , ,parse_file(fn)
</p>
<p> , , , , , ,
</p>
<p> , , , , , ,
</p>
<p>path = os.getcwd()
</p>
<p>files = os.listdir(path) 
</p>
<p>for file in files:
</p>
<p># , , , ,print (os.path.join(path, file))
</p>
<p> , , , ,parse_dir(os.path.join(path, file))
</p>
<p>
</p>
<p>print ('Zip =&#62; ' + str(co))
</p>
<p>print ('Done!')
</p>
</section>
</section>
<section type="d">
<title><p>5</p></title>
<section type="f">
<title><p>main_ok.py</p></title>
<p>#!/usr/bin/env python
</p>
<p># -*- coding: utf-8 -*-
</p>
<p>import sys, os
</p>
<p>import xml.dom.minidom
</p>
<p>import zipfile
</p>
<p>import shutil
</p>
<p># form 21.05.2021
</p>
<p>#sys.path.append("/work/Python/modules/s")
</p>
<p>#--------------------------------------------------
</p>
<p>#from m_list import Books
</p>
<p>Books = []
</p>
<p>
</p>
<p>def FindValue(s1, s2):
</p>
<p>  global Books
</p>
<p> # L1 = []
</p>
<p>  maxW = len(Books)
</p>
<p>
</p>
<p>  L1 = [s1, s2]
</p>
<p>  if maxW == 0:
</p>
<p> , , Books.append(L1) 
</p>
<p># , ,Books += [s1, s2] 
</p>
<p>
</p>
<p>  else:
</p>
<p> , , minW = -1
</p>
<p> , , cur = maxW // 2
</p>
<p> , , wList = Books[cur][0]
</p>
<p> , , while not(s1 == wList):
</p>
<p> , , , ,if s1 &#60; wList:
</p>
<p> , , , , , ,maxW = cur
</p>
<p> , , , ,else:
</p>
<p> , , , , , ,minW = cur
</p>
<p> , , , ,if maxW - minW == 1:
</p>
<p> , , , , , ,if s1 &#62; wList:
</p>
<p> , , , , , , , ,cur += 1
</p>
<p> , , , , , ,Books.insert(cur, L1)
</p>
<p> , , , , , ,return
</p>
<p> , , , ,cur = ((maxW-minW) //2) + minW
</p>
<p> , , , ,wList = Books[cur][0]
</p>
<p>
</p>
<p> , , Books.insert(cur+1, L1)
</p>
<p>
</p>
<p>def PrintList():
</p>
<p> , ,for i in Books:
</p>
<p> , , , ,print (i[0] + ' ' + i[1])
</p>
<p>
</p>
<p>def SaveList():
</p>
<p> , ,f = open('lib.txt', 'w')
</p>
<p> , ,for i in Books:
</p>
<p> , , , ,f.write(i[0].encode('cp1251')+'\n')
</p>
<p> , , , ,f.write(i[1]+'\n\n')
</p>
<p> , ,f.close()
</p>
<p>#--------------------------------------------------
</p>
<p>#from m_dir import parse_dir
</p>
<p>Capture = ''
</p>
<p>FileName = ''
</p>
<p>
</p>
<p>def parse_zip(fn):
</p>
<p> , ,global FileName
</p>
<p># , ,print &#62;&#62; sys.stderr, 'Zip:', os.path.basename(fn)
</p>
<p> , ,FileName = fn
</p>
<p>
</p>
<p> , ,z = zipfile.ZipFile(fn, 'r')
</p>
<p> , ,filelist = z.namelist()
</p>
<p> , ,filelist.sort()
</p>
<p>
</p>
<p> , ,for n in filelist:
</p>
<p> , , , ,try:
</p>
<p> , , , , , ,if n[-4:] == ".fb2":
</p>
<p> , , , , , , , ,parse_fb2(z.open(n))
</p>
<p> , , , ,except:
</p>
<p># , , , , , ,print &#62;&#62; sys.stderr, 'X15:', n 
</p>
<p> , , , , , ,print( "X15:", n )
</p>
<p>
</p>
<p>def parse_fb2(fn):
</p>
<p> , ,global Capture
</p>
<p> , ,if isinstance(fn, str):
</p>
<p> , , , ,fn = open(fn)
</p>
<p> , ,try:
</p>
<p> , , , ,dom = xml.dom.minidom.parse(fn)
</p>
<p> , ,except:
</p>
<p> , , , ,print('Error:')
</p>
<p> , , , ,print(FileName)
</p>
<p> , ,else:
</p>
<p> , , , ,dom.normalize()
</p>
<p> , , , ,node1=dom.getElementsByTagName("description")[0]
</p>
<p> , , , ,node1=node1.getElementsByTagName("title-info")[0]
</p>
<p> , , , ,try:
</p>
<p> , , , , , ,node1=node1.getElementsByTagName("author")[0]
</p>
<p> , , , , , ,node1=node1.getElementsByTagName("last-name")[0]
</p>
<p> , , , , , ,s = node1.childNodes[0].nodeValue
</p>
<p> , , , , , ,s = s.encode("utf-8")
</p>
<p> , , , , , ,Capture = s.capitalize()
</p>
<p> , , , ,except:
</p>
<p> , , , , , ,Capture = "noname"
</p>
<p> , , , ,FindValue(Capture, FileName)
</p>
<p>
</p>
<p>def parse_file(fn):
</p>
<p> , ,global FileName
</p>
<p> , ,FileName = fn
</p>
<p> , ,m = fn.split(".")[-1]
</p>
<p> , ,if (m == "zip"):
</p>
<p> , , , ,parse_zip(fn)
</p>
<p> , ,elif (m == "fb2"):
</p>
<p> , , , ,parse_fb2(fn)
</p>
<p> , , , ,
</p>
<p>def parse_dir(fn):
</p>
<p> , ,dirlist = os.listdir(fn)
</p>
<p> , ,dirlist.sort()
</p>
<p> , ,for i in dirlist:
</p>
<p> , , , ,if os.path.getsize(i) &#62; 0:
</p>
<p> , , , , , ,parse_file(os.path.join(fn, i))
</p>
<p>#? , , , ,else:
</p>
<p>#? , , , , , ,print("bad zip "+ i)
</p>
<p>#--------------------------------------------------
</p>
<p>#from sort import path, mySorting
</p>
<p>
</p>
<p>path = os.getcwd()
</p>
<p>
</p>
<p>def mPrintList(oldn, M):
</p>
<p> , ,global path
</p>
<p> , ,ss = str(oldn, encoding='utf-8')
</p>
<p># , ,ss = path+"/"+s.encode("utf-8")
</p>
<p># , ,print(s)
</p>
<p>
</p>
<p> , ,if (not os.path.isdir(ss)):
</p>
<p># , , , ,print(ss)
</p>
<p> , , , ,os.mkdir(ss)
</p>
<p> , ,for k in M:
</p>
<p> , , , ,if (not os.path.isfile(ss)):
</p>
<p># , , , , , ,print(ss)
</p>
<p> , , , , , ,
</p>
<p> , , , , , ,shutil.move(k, ss)
</p>
<p># , , , ,print(ss)
</p>
<p># , , , ,shutil.move(k, ss)
</p>
<p> , , , ,
</p>
<p>def mySorting():
</p>
<p> , ,global Books
</p>
<p> , ,old_name = Books[len(Books)-1][0]
</p>
<p> , ,flag = 0 
</p>
<p> , ,for i in range(len(Books)-1, 0, -1):
</p>
<p> , , , , if flag == 0 and Books[i-1][0] == old_name:
</p>
<p> , , , , , , flag = 1
</p>
<p> , , , , , , L = []
</p>
<p> , , , , , , L.append(Books[i][1])
</p>
<p> , , , , , , Books.pop(i)
</p>
<p> , , , , , ,
</p>
<p> , , , , if flag == 1: 
</p>
<p> , , , , , , if Books[i-1][0] == old_name:
</p>
<p> , , , , , , , ,L.append(Books[i-1][1])
</p>
<p> , , , , , , , ,Books.pop(i-1)
</p>
<p> , , , , , , else:
</p>
<p> , , , , , , , , mPrintList(old_name, L)
</p>
<p> , , , , , , , , old_name = Books[i-1][0]
</p>
<p> , , , , , , , , flag = 0
</p>
<p> , , , , else:
</p>
<p> , , , , , , old_name = Books[i-1][0]
</p>
<p> , ,
</p>
<p> , ,if flag == 1:
</p>
<p> , , , ,mPrintList(old_name, L)
</p>
<p> , , , ,
</p>
<p>#----------------------------------------
</p>
<p>def mMain():
</p>
<p>  mySorting()
</p>
<p>
</p>
<p>  fbName = "f"
</p>
<p>  fNum = 1
</p>
<p>  fName = fbName + str(fNum) #'f1'
</p>
<p>  num = 0
</p>
<p>  if len(Books) &#62; 0:
</p>
<p> , ,  if (not os.path.isdir(fName)):
</p>
<p> , , , ,  os.mkdir(fName)
</p>
<p> , ,  for i in Books:
</p>
<p> , , , ,  if (not os.path.isfile(path+"/"+fName)):
</p>
<p> , , , , , ,  shutil.move(i[1], path+"/"+fName)
</p>
<p> , , , ,  num += 1
</p>
<p> , , , ,  if num == 9: # number in folder !!!
</p>
<p> , , , , , ,  fNum += 1
</p>
<p> , , , , , ,  fName = fbName + str(fNum)
</p>
<p> , , , , , ,  if (not os.path.isdir(fName)):
</p>
<p> , , , , , , , ,  os.mkdir(fName)
</p>
<p> , , , , , ,  num = 0
</p>
<p>
</p>
<p>  print( 'Done!')
</p>
<p>
</p>
<p>#--------------------------------------------------
</p>
<p>parse_dir(path)
</p>
<p>if len(Books) == 0:
</p>
<p> , ,print('Empty dir')
</p>
<p>else:
</p>
<p> , ,mMain()
</p>
<p>
</p>
</section>
</section>
<section type="d">
<title><p>6</p></title>
<section type="f">
<title><p>fb2err4.py</p></title>
<p>#!/usr/bin/env python
</p>
<p># -*- codning: utf-8 -*-
</p>
<p>import sys, os
</p>
<p>
</p>
<p># проверка структуры файла fb2
</p>
<p>#----------------------------------------------
</p>
<p>file  = 'lib.fb2'
</p>
<p>#count = 1 #  счетчик строк
</p>
<p>flag = False # признак анализа тега
</p>
<p>S = '' # место для обработанного тега
</p>
<p>Tag = '' # место для тега
</p>
<p>L = [] # стек
</p>
<p>Tagss = []
</p>
<p>'''
</p>
<p>with open(file, encoding="utf8") as f:
</p>
<p> , ,LList = f.readlines()
</p>
<p>for i in LList:
</p>
<p> , ,count += 1
</p>
<p> , ,if i.find('section') &#62; -1:
</p>
<p> , , , ,print(count)
</p>
<p> , , , ,print(i)
</p>
<p>f.close()
</p>
<p>'''
</p>
<p>def printStack():
</p>
<p> , ,st = open("stack.txt", "w")
</p>
<p> , ,for n in Tagss:
</p>
<p> , , , ,#print(n) # вывод на этран
</p>
<p> , , , ,st.write(n+'\n') # или вывод в файл
</p>
<p> , ,st.close()
</p>
<p>
</p>
<p>def run_analiz(fn):
</p>
<p> , ,count = 1 #  счетчик строк
</p>
<p> , ,if not os.path.isfile(fn): # проверка существования файла
</p>
<p> , , , ,print('"'+fn+'" file does not exist.')
</p>
<p> , , , ,return
</p>
<p> , ,
</p>
<p> , ,global Tagss
</p>
<p> , ,f = open(fn, 'rb') # 
</p>
<p> , ,d = f.read()
</p>
<p> , ,for n in d:
</p>
<p> , , , ,if n == 10: # символ завершения строки
</p>
<p> , , , , , ,count += 1 # + в счетчик строк
</p>
<p> , , , ,elif chr(n) == '&#60;': # начало тега
</p>
<p> , , , , , ,flag = True
</p>
<p> , , , , , ,Tag = '' # подготовка места для тега
</p>
<p> , , , ,else:
</p>
<p> , , , , , ,if flag: # читаем тег
</p>
<p> , , , , , , , ,if chr(n) == '&#62;': # провека на конец тега, если да:
</p>
<p> , , , , , , , , , ,S = Tag.split(' ')[0] # отбрасывание возможных параметров
</p>
<p> , , , , , , , , , ,flag = False
</p>
<p> , , , , , , , , , ,if S[0] == '/': # проверка на закрывающий тег
</p>
<p> , , , , , , , , , , , ,Tagss.append(str(count)+' &#60;'+S)
</p>
<p> , , , , , , , , , , , ,S = S[1:] # удаление слеша
</p>
<p> , , , , , , , , , , , ,Lo = L.pop() # чтение из стека
</p>
<p> , , , , , , , , , , , ,if Lo[0] != S: # сообщение об ошибке
</p>
<p> , , , , , , , , , , , , , ,printStack() # распечатка стека
</p>
<p> , , , , , , , , , , , , , , # ежели такая распечатка не нужна - закомментируйте
</p>
<p> , , , , , , , , , , , , , ,print('Teg = "'+Lo[0]+'" begin in str = '+ str(Lo[1]))
</p>
<p> , , , , , , , , , , , , , ,print('Не соответствует')
</p>
<p> , , , , , , , , , , , , , ,print('Teg ="' +S+ '"end in str = '+ str(count))
</p>
<p>
</p>
<p> , , , , , , , , , , , , , ,f.close()
</p>
<p> , , , , , , , , , , , , , ,return
</p>
<p> , , , , , , , , , ,else:
</p>
<p> , , , , , , , , , , , ,if Tag[-1] != '/': # обработка одинарных тегов
</p>
<p> , , , , , , , , , , , , , ,T = Tag.split(' ')
</p>
<p> , , , , , , , , , , , , , ,Tagss.append(str(count)+' &#60;'+T[0])
</p>
<p> , , , , , , , , , , , , , ,Lo = [S, count] # подготовка для записи в стек
</p>
<p> , , , , , , , , , , , , , ,L.append(Lo) # запись в стек
</p>
<p> , , , , , , , ,else:
</p>
<p> , , , , , , , , , ,Tag = Tag + chr(n) # добавление символа к тегу
</p>
<p> , ,f.close()
</p>
<p> , ,print('OK!!!') # сообщение об удачной проверке.
</p>
<p>while True: # бесконечный цикл проверок
</p>
<p>   FN = input('Введите имя файла: ['+file+']')
</p>
<p>   if  FN == '': # если сразу нажат "Enter"
</p>
<p> , ,   run_analiz(file) # повторяем проверку файла
</p>
<p>   else:
</p>
<p> , ,   file = FN # запоминаем новое имя
</p>
<p> , ,   run_analiz(file) # проверяем новый файл
</p>
<p>
</p>
<p>
</p>
</section>
<section type="f">
<title><p>fb2errors.py</p></title>
<p>#!/usr/bin/env python
</p>
<p># -*- codning: utf-8 -*-
</p>
<p>import sys, os
</p>
<p>import zipfile
</p>
<p>
</p>
<p># создание списка файлов fb2 с повреждением структуры
</p>
<p>#----------------------------------------------
</p>
<p>OList = []
</p>
<p>Count = 0
</p>
<p>def fb2err(fn): # проверка структуры файла
</p>
<p> , ,global Count
</p>
<p> , ,flag = False # признак анализа тега
</p>
<p> , ,S = '' # место для обработанного тега
</p>
<p> , ,Tag = '' # место для тега
</p>
<p> , ,L = [] # стек
</p>
<p>
</p>
<p> , ,if isinstance(fn, str):
</p>
<p> , , , ,f = open(fn, 'rb') # открыт .fb2
</p>
<p> , , , ,d = f.read()
</p>
<p> , ,else:
</p>
<p> , , , ,d = fn.read() # открыт .zip
</p>
<p> , ,for n in d:
</p>
<p> , , , ,if chr(n) == '&#60;': # начало тега
</p>
<p> , , , , , ,flag = True
</p>
<p> , , , , , ,Tag = '' # подготовка места для тега
</p>
<p> , , , ,else:
</p>
<p> , , , , , ,if flag: # читаем тег
</p>
<p> , , , , , , , ,if chr(n) == '&#62;': # провека на конец тега, если да:
</p>
<p> , , , , , , , , , ,S = Tag.split(' ')[0] # отбрасывание возможных параметров
</p>
<p> , , , , , , , , , ,flag = False
</p>
<p> , , , , , , , , , ,if S[0] == '/': # проверка на закрывающий тег
</p>
<p> , , , , , , , , , , , ,S = S[1:] # удаление слеша
</p>
<p> , , , , , , , , , , , ,Lo = L.pop() # чтение из стека
</p>
<p> , , , , , , , , , , , ,if Lo != S: # ОШИБКА
</p>
<p> , , , , , , , , , , , , , ,Count += 1
</p>
<p> , , , , , , , , , , , , , ,return True
</p>
<p> , , , , , , , , , ,else:
</p>
<p> , , , , , , , , , , , ,if Tag[-1] != '/': # обработка одинарных тегов
</p>
<p> , , , , , , , , , , , , , , L.append(S) # запись в стек
</p>
<p> , , , , , , , ,else:
</p>
<p> , , , , , , , , , ,Tag = Tag + chr(n) # добавление символа к тегу
</p>
<p>
</p>
<p> , ,return False # удачная проверка.
</p>
<p>
</p>
<p>def parse_zip(fn): # обработка zip
</p>
<p> , ,global OList
</p>
<p>
</p>
<p> , ,z = zipfile.ZipFile(fn, 'r')
</p>
<p> , ,filelist = z.namelist()
</p>
<p> , ,filelist.sort()
</p>
<p>
</p>
<p> , ,for n in filelist:
</p>
<p> , , , ,try:
</p>
<p> , , , , , ,if n[-4:] == ".fb2":
</p>
<p> , , , , , , , ,if fb2err(z.open(n, 'r')):
</p>
<p> , , , , , , , , , ,OList.append(fn)
</p>
<p> , , , ,except:
</p>
<p> , , , , , ,print( "X15:", n )
</p>
<p>
</p>
<p>def parse_file(fn): #  обработка файла
</p>
<p> , ,global OList
</p>
<p>
</p>
<p> , ,m = fn.split(".")[-1]
</p>
<p> , ,if (m == "zip"): # если zip
</p>
<p> , , , ,parse_zip(fn)
</p>
<p> , ,elif (m == "fb2"):  # если fb2
</p>
<p> , , , ,if fb2err(fn):
</p>
<p> , , , , , ,OList.append(fn)
</p>
<p> , , , ,
</p>
<p>def parse_dir(fn): # сканирование папки
</p>
<p> , ,dirlist = os.listdir(fn)
</p>
<p> , ,dirlist.sort()
</p>
<p> , ,for a in dirlist:
</p>
<p> , , , ,b = os.path.join(fn, a)
</p>
<p> , , , ,if os.path.isdir(b):
</p>
<p> , , , , , ,parse_dir(b) # сканирование подпапки
</p>
<p> , , , ,else:
</p>
<p> , , , , , ,if os.path.getsize(b) &#62; 0:
</p>
<p> , , , , , , , ,parse_file(b)
</p>
<p>#-------------------------
</p>
<p>path = os.getcwd()
</p>
<p>parse_dir(path) # сканирование текущей папки
</p>
<p>
</p>
<p>if len(OList) &#62; 0: # сохранение результатов
</p>
<p> , ,fn = 'fb2Error.txt'
</p>
<p>#  при необходимости сохранения старых файлов fb2Error.txt - снять комментарии
</p>
<p> , ,nu = 0
</p>
<p> , ,while os.path.isfile(fn):
</p>
<p> , , , ,nu += 1
</p>
<p> , , , ,fn = 'fb2Error'+str(nu)+'.txt'
</p>
<p>#
</p>
<p> , ,f = open(fn, 'w')
</p>
<p> , ,for i in OList:
</p>
<p> , , , ,f.write(i+'\n')
</p>
<p> , ,f.close()
</p>
<p>print('Файлов с ошибкой '+str(Count))
</p>
</section>
<section type="f">
<title><p>moveIn.py</p></title>
<p>#!/usr/bin/env python
</p>
<p># -*- codning: utf-8 -*-
</p>
<p>import sys, os
</p>
<p>import shutil
</p>
<p>
</p>
<p># перемещение поврежденный файлов fb2 для последующего ремонта
</p>
<p>#----------------------------------------------
</p>
<p>path = os.getcwd()
</p>
<p>
</p>
<p>Count = 0
</p>
<p>
</p>
<p>fn = 'fb2Error.txt' # !!! проследить за правильностью имени файла !!!
</p>
<p>if os.path.isfile(fn): # проверяем существование
</p>
<p> , ,with open(fn, 'r') as text: # открываем файл
</p>
<p> , , , ,mylist = text.readlines() # и читаем
</p>
<p> , ,fName = 'infiles' # подготавливаем имя папки адресата
</p>
<p> , ,if (not os.path.isdir(fName)): # если адресата нет
</p>
<p> , , , ,os.mkdir(fName) # то создаем его
</p>
<p> , ,mydir = os.path.join(path, fName)
</p>
<p> , ,for i in mylist: # просматриваем список
</p>
<p> , , , ,i = i.strip() # отрубаем пробелы
</p>
<p> , , , ,name = os.path.basename(i) # выделяем имя файла
</p>
<p> , , , ,dst = os.path.join(mydir, name) # определяем куда его сунуть
</p>
<p> , , , ,if os.path.isfile(i) and (not os.path.isfile(dst)):
</p>
<p> , , , , , ,shutil.move(i, dst) # перемещаем файл
</p>
<p> , , , , , ,Count += 1 # обновляем статистику
</p>
<p>
</p>
<p>#os.path.join(dirpath, filename))
</p>
<p>
</p>
<p>print('Файлов перемещено '+str(Count))
</p>
<p>#shutil.move(src, dst)
</p>
</section>
<section type="f">
<title><p>moveOut.py</p></title>
<p>#!/usr/bin/env python
</p>
<p># -*- codning: utf-8 -*-
</p>
<p>import sys, os
</p>
<p>import shutil
</p>
<p>
</p>
<p># перемещение файлов fb2 после ремонта на места дислокации
</p>
<p>#----------------------------------------------
</p>
<p>path = os.getcwd()
</p>
<p>
</p>
<p>Count = 0
</p>
<p>
</p>
<p>fn = 'fb2Error.txt' # !!! проследить за правильностью имени файла !!!
</p>
<p>if os.path.isfile(fn): # проверяем существование
</p>
<p> , ,with open(fn, 'r') as text: # открываем файл
</p>
<p> , , , ,mylist = text.readlines() # и читаем
</p>
<p> , ,fName = 'infiles' # подготавливаем имя ремонтной папки
</p>
<p> , ,if (not os.path.isdir(fName)): # если адресата нет
</p>
<p> , , , ,print('???')
</p>
<p> , , , ,exit() # то делать нечего...
</p>
<p> , ,mydir = os.path.join(path, fName) # ремонтная папка
</p>
<p> , ,for i in mylist: # просматриваем список
</p>
<p> , , , ,i = i.strip() # отрубаем пробелы
</p>
<p> , , , ,name = os.path.basename(i) # выделяем имя файла
</p>
<p> , , , ,dst = os.path.join(mydir, name) # определяем откуда его высунуть
</p>
<p> , , , ,if os.path.isfile(dst): # если файл на месте
</p>
<p> , , , , , ,shutil.move(dst,i) # перемещаем файл
</p>
<p> , , , , , ,Count += 1 # обновляем статистику
</p>
<p>
</p>
<p>print('Файлов перемещено '+str(Count))
</p>
<p>
</p>
</section>
<section type="f">
<title><p>un_zip.py</p></title>
<p>#!/usr/bin/env python
</p>
<p># -*- codning: utf-8 -*-
</p>
<p>import sys, os
</p>
<p>import zipfile
</p>
<p>
</p>
<p># Извлечение из архивов в папке
</p>
<p>#----------------------------------------------
</p>
<p>path = os.getcwd()
</p>
<p>Count = 0
</p>
<p>
</p>
<p>def parse_zip(fn): # обработка zip
</p>
<p> , ,global path
</p>
<p> , ,global Count
</p>
<p> , ,z = zipfile.ZipFile(fn, 'r')
</p>
<p> , ,z.extractall(path)
</p>
<p> , ,Count += 1
</p>
<p>
</p>
<p>def parse_file(fn): #  обработка файла
</p>
<p> , ,m = fn.split(".")[-1]
</p>
<p> , ,if (m == "zip"): # если zip
</p>
<p> , , , ,parse_zip(fn)
</p>
<p> , , , ,
</p>
<p>def parse_dir(fn): #
</p>
<p> , ,dirlist = os.listdir(fn)
</p>
<p> , ,dirlist.sort()
</p>
<p> , ,for a in dirlist:
</p>
<p> , , , ,if os.path.getsize(a) &#62; 0:
</p>
<p> , , , , , , , ,parse_file(a)
</p>
<p>#-------------------------
</p>
<p>
</p>
<p>parse_dir(path) # сканирование текущей папки
</p>
<p>print('Файлов извлечено '+str(Count))
</p>
</section>
</section>
<section type="d">
<title><p>7</p></title>
<section type="f">
<title><p>j_par.py</p></title>
<p>#!/bin/env python
</p>
<p># -*- coding: utf-8 -*-
</p>
<p># Объединение абзацев (версия 19.10.21)
</p>
<p>import sys, os
</p>
<p>#--------------------------------------
</p>
<p>def EndStr(s):
</p>
<p> , ,SQ = ''
</p>
<p> , ,for a in reversed(s):
</p>
<p> , , , ,if a == ' ':
</p>
<p> , , , , , ,return SQ[:-1]
</p>
<p> , , , ,else:
</p>
<p> , , , , , ,SQ = a+SQ
</p>
<p>#--------------------------------------
</p>
<p>old_List = [] # Сюда читается
</p>
<p>new_List = [] # Промеждуточный список
</p>
<p>#--------------------------------------
</p>
<p>#FN = input('Введите имя файла:')
</p>
<p>#fn1=path+FN
</p>
<p>FN = '2_.txt'
</p>
<p>fb2_file=open(FN,'r')
</p>
<p>#fb2_file=open(FN,'r', encoding='utf-8')
</p>
<p>old_List=fb2_file.readlines()
</p>
<p>fb2_file.close()
</p>
<p>#--------------------------------------
</p>
<p>SS = '' # Промежуточное хранение строки
</p>
<p>FlagQ = False
</p>
<p>
</p>
<p>i = -1
</p>
<p>for item in old_List: # первый проход
</p>
<p>
</p>
<p>поиск разорванных строк
</p>
<p> , ,i += 1
</p>
<p> , ,if i &#62;= len(old_List):
</p>
<p># , , , ,new_List.append(item[i+1]) ?
</p>
<p> , , , ,break
</p>
<p>
</p>
<p> , ,s = item.strip()# Обрезание пробелов
</p>
<p> , ,if s == '':
</p>
<p> , , , ,new_List.append(s)
</p>
<p> , , , ,continue
</p>
<p>
</p>
<p> , ,m = ord(s[-1]) # последний символ строки
</p>
<p># , ,print(s)
</p>
<p> , ,if (m &#62; 1071 and m &#60; 1104) or m == 44: # от "а" до "я" + ","
</p>
<p> , , , ,if i+1 &#62;= len(old_List):
</p>
<p> , , , , , ,break
</p>
<p> , , , ,d = old_List[i+1].strip()
</p>
<p> , , , ,if (d != ''):
</p>
<p> , , , , , ,m = ord(d[0]) # первый символ следующей строки
</p>
<p> , , , , , ,if (m &#62; 1071 and m &#60; 1104): # от "а" до "я"):
</p>
<p> , , , , , , , ,new_List.append(s+' @')# помечаем строку для объединения с последующей
</p>
<p> , , , , , ,else:# в обычном тексте вероятность, что строка
</p>
<p>
</p>
<p>завершится "собачкой" очено мала, но ... тогда это будет ошибочное объединение
</p>
<p> , , , , , , , ,new_List.append(s)
</p>
<p> , , , ,else:
</p>
<p> , , , , , ,new_List.append(s)
</p>
<p> , ,else:
</p>
<p> , , , ,new_List.append(s)
</p>
<p>
</p>
<p>
</p>
<p>old_List.clear()
</p>
<p>
</p>
<p>#for item in reversed(new_List): # второй проход
</p>
<p>
</p>
<p>объединение помеченных строк
</p>
<p>for item in new_List:
</p>
<p> , ,if item == '':
</p>
<p> , , , ,if SS != '':
</p>
<p> , , , , , ,old_List.append(SS)
</p>
<p> , , , , , ,SS = ''
</p>
<p> , , , ,old_List.append(item)
</p>
<p> , , , ,continue
</p>
<p>
</p>
<p> , ,if FlagQ:
</p>
<p> , , , ,SS = SS[:-1] + item
</p>
<p> , , , ,FlagQ = item[-1] == '@'
</p>
<p> , ,else:
</p>
<p> , , , ,if SS != '':
</p>
<p> , , , , , ,old_List.append(SS)
</p>
<p> , , , , , ,SS = ''
</p>
<p> , , , ,if item[-1] == '@': # последний символ строки
</p>
<p> , , , , , ,FlagQ = True
</p>
<p> , , , , , ,SS = item
</p>
<p> , , , ,else:
</p>
<p> , , , , , ,old_List.append(item)
</p>
<p>
</p>
<p>if SS != '':
</p>
<p> , ,old_List.append(SS)
</p>
<p>
</p>
<p>#--------------------------------------
</p>
<p>
</p>
<p>fn2="3_x.txt"
</p>
<p>new_file=open(fn2,'w')
</p>
<p>for i in old_List:
</p>
<p> , , new_file.write(i+'\n')
</p>
<p>new_file.close()
</p>
<p>print('Done')
</p>
</section>
<section type="f">
<title><p>perenos.py</p></title>
<p>|#!/bin/env python
</p>
<p># -*- coding: utf-8 -*-
</p>
<p># Объединение абзацев разде-
</p>
<p># разделенных переносами
</p>
<p># 19.10.21
</p>
<p>import sys, os
</p>
<p>#--------------------------------------
</p>
<p>def EndStr(s):
</p>
<p> , ,SQ = ''
</p>
<p> , ,for a in reversed(s):
</p>
<p> , , , ,if a == ' ':
</p>
<p> , , , , , ,return SQ[:-1]
</p>
<p> , , , ,else:
</p>
<p> , , , , , ,SQ = a+SQ
</p>
<p>#--------------------------------------
</p>
<p>old_List = [] # Сюда читается
</p>
<p>new_List = [] # Промеждуточный список
</p>
<p>#--------------------------------------
</p>
<p>#FN = input('Введите имя файла:')
</p>
<p>#fn1=path+FN
</p>
<p>FN = '1.txt'
</p>
<p>fb2_file=open(FN,'r')
</p>
<p>#fb2_file=open(FN,'r', encoding='utf-8')
</p>
<p>old_List=fb2_file.readlines()
</p>
<p>fb2_file.close()
</p>
<p>#--------------------------------------
</p>
<p>SS = '' # Промежуточное хранение строки
</p>
<p>SQ = '' # Начало слова "разор-
</p>
<p>
</p>
<p>"разорванного" "странным" переносом
</p>
<p>FlagQ = False
</p>
<p>
</p>
<p>i = 0
</p>
<p>
</p>
<p>Первый проход. Поиск "странных" переносов
</p>
<p>for item in old_List:
</p>
<p> , ,s = item.strip()# Обрезание пробелов
</p>
<p> , ,if s == '':
</p>
<p> , , , ,new_List.append(s)
</p>
<p> , , , ,i += 1
</p>
<p> , , , ,if i &#62; len(old_List):
</p>
<p> , , , , , ,new_List.append(item[i+1])
</p>
<p> , , , , , ,break
</p>
<p> , , , ,continue
</p>
<p> , ,
</p>
<p> , ,if (s[-1] == '-'): # последний символ строки
</p>
<p> , , , ,SQ = EndStr(s) # следующая строка начинается с SQ
</p>
<p> , , , ,if (SQ != None) and (SQ != '') and (old_List[i+1].find(SQ)==0):
</p>
<p> , , , , , ,m = -(len(SQ)+1)
</p>
<p> , , , , , ,new_List.append(s[:m]+'@') # помечаем строку для последующего объединения
</p>
<p> , , , ,else:
</p>
<p> , , , , , ,new_List.append(s)
</p>
<p> , ,else:
</p>
<p> , , , ,new_List.append(s)
</p>
<p> , ,i += 1
</p>
<p> , ,if i &#62; len(old_List):
</p>
<p> , , , ,new_List.append(item[i+1])
</p>
<p> , , , ,break
</p>
<p>
</p>
<p>old_List.clear()
</p>
<p>
</p>
<p># второй проход. соединение строк
</p>
<p>#for item in reversed(new_List):
</p>
<p>for item in new_List:
</p>
<p> , ,if item == '':
</p>
<p> , , , ,if SS != '':
</p>
<p> , , , , , ,old_List.append(SS)
</p>
<p> , , , , , ,SS = ''
</p>
<p> , , , ,old_List.append(item)
</p>
<p> , , , ,continue
</p>
<p># , ,print(item)
</p>
<p>
</p>
<p> , ,if FlagQ:
</p>
<p> , , , ,SS = SS[:-1] + item
</p>
<p> , , , ,FlagQ = item[-1] == '@'
</p>
<p> , ,else:
</p>
<p> , , , ,if SS != '':
</p>
<p> , , , , , ,old_List.append(SS)
</p>
<p> , , , , , ,SS = ''
</p>
<p> , , , ,if item[-1] == '@': # последний символ строки
</p>
<p> , , , , , ,FlagQ = True
</p>
<p> , , , , , ,SS = item
</p>
<p> , , , ,else:
</p>
<p> , , , , , ,old_List.append(item)
</p>
<p> , , , , , , , ,
</p>
<p>if SS != '':# запись последней строки
</p>
<p> , ,old_List.append(SS)
</p>
<p>
</p>
<p>#--------------------------------------
</p>
<p>
</p>
<p>fn2="2_.txt"
</p>
<p>new_file=open(fn2,'w')
</p>
<p>for i in old_List:
</p>
<p> , , new_file.write(i+'\n')
</p>
<p>new_file.close()
</p>
<p>print('Done')</p>
</section>
<section type="f">
<title><p>str2parag.py</p></title>
<p>﻿#!/usr/bin/env python
</p>
<p># -*- coding: utf-8 -*-
</p>
<p>import sys, os
</p>
<p>
</p>
<p>#-- скрипт для сборки абзацев из разрозненных строк ---
</p>
<p>
</p>
<p>s = '' # строка коию будем записывать в список
</p>
<p>L = [] # список для хранения выходного файла
</p>
<p>i = 0 # указатель положения в файле
</p>
<p>
</p>
<p>def RusBukva1(n): # обработка буквы «до»
</p>
<p> , ,return ((n &#62; 223) and (n &#60; 256)) or (n==44) or (n==45)
</p>
<p>def RusBukva2(n): #  обработка буквы «после»
</p>
<p> , ,return ((n &#62; 223) and (n &#60; 256))
</p>
<p>
</p>
<p>f = open('alfredr.txt', 'rb') # открываем и читаем промежуточный файл
</p>
<p>d = f.read()
</p>
<p>f.close()
</p>
<p>
</p>
<p>c13 = 2 # константа индицирующая наличие символа «13»
</p>
<p>for n in d:  # проверка промежуточного файла на наличие символа «13»
</p>
<p> , ,if (n == 13):
</p>
<p> , , , ,c13 = 3
</p>
<p> , , , ,break
</p>
<p>
</p>
<p>for n in d:  # основной цикл проверки файла
</p>
<p> , ,i +=1 # инкримент указателя положения в файле
</p>
<p> , ,if (n == 10): # если конец строки
</p>
<p> , , , ,if RusBukva1(d[i-c13]) and RusBukva2(d[i]): # проверяем «до» и «после»
</p>
<p> , , , ,   s += ' ' # в строку пробел
</p>
<p> , , , ,else:
</p>
<p> , , , ,   L.append(s) # добавляем строку в список
</p>
<p> , , , ,   s='' # подготовка пустой строки
</p>
<p> , ,else:
</p>
<p> , , , ,if n != 13:
</p>
<p> , , , , , ,m = d[i-1] # эта строка и 6 строк ниже объясню еще ниже
</p>
<p> , , , , , ,if (m &#62; 191) and (m &#60; 256):
</p>
<p> , , , , , , , ,m += 848
</p>
<p> , , , , , ,elif(m==184):
</p>
<p> , , , , , , , ,m = 1105
</p>
<p> , , , , , ,elif (m==151):
</p>
<p> , , , , , , , ,m = 8212
</p>
<p> , , , , , ,s += chr(m) # запись символа в строку
</p>
<p>
</p>
<p>
</p>
<p>f = open('outtext.txt', 'w') # выходной файл
</p>
<p>for etem in L: # просматриваем список и записываем в файл
</p>
<p> , ,f.write(etem+'\n')
</p>
<p>f.close()
</p>
<p>
</p>
<p>print('OK!!!')
</p>
</section>
<section type="f">
<title><p>utf8-1251.py</p></title>
<p>﻿#!/usr/bin/env python
</p>
<p># -*- coding: utf-8 -*-
</p>
<p>
</p>
<p>fin = open('art.txt', 'r') # открываем исходный файл
</p>
<p>out = open('outt.txt', 'w', encoding='cp1251')  # подготавливаем промежуточный файл
</p>
<p>
</p>
<p>for s in fin: # переписываем из файла в файл
</p>
<p> , ,s = s.rstrip()
</p>
<p> , ,out.write(s+'\n')
</p>
<p>
</p>
<p>fin.close()
</p>
<p>out.close()
</p>
<p>
</p>
<p>print('Done')
</p>
</section>
</section>
<section type="d">
<title><p>8 Images</p></title>
<section type="f">
<title><p>base64_pic.py</p></title>
<p>#!/usr/bin/env python
</p>
<p># -*- coding: utf-8 -*-
</p>
<p>import sys, os
</p>
<p>import base64
</p>
<p>
</p>
<p>def getAttribute(Tag):
</p>
<p> , ,s = Tag[Tag.find(' id=')+4:]
</p>
<p> , ,s = s[s.find('"')+1:]
</p>
<p> , ,s = s[:s.find('"')]
</p>
<p> , ,return s
</p>
<p>
</p>
<p>def parseBinaryContent(filename):
</p>
<p> , ,
</p>
<p> # filename = sys.argv[1]
</p>
<p> , ,if filename[-4:] == '.fb2':
</p>
<p> , , , , dirname = filename[:-4]+'_pic'
</p>
<p> , ,else:
</p>
<p> , , , , exit()
</p>
<p> , ,if not os.path.isdir(dirname):
</p>
<p> , , , ,os.mkdir(dirname)
</p>
<p> , ,flag = False
</p>
<p> , ,bina = False
</p>
<p> , ,S = ''
</p>
<p>
</p>
<p>
</p>
<p> , ,#------------------------
</p>
<p> , ,path = os.getcwd()
</p>
<p> , ,fin = os.path.join(path, filename)
</p>
<p> , ,f = open(fin, 'rb')
</p>
<p> , ,d = f.read()
</p>
<p> , ,
</p>
<p> , ,for n in d:
</p>
<p> , , , ,if bina:
</p>
<p> , , , , , ,if chr(n) == '&#60;':
</p>
<p> , , , , , , , ,print('5')
</p>
<p> , , , , , , , ,dd = base64.urlsafe_b64decode(S) #()
</p>
<p> , , , , , , , ,hh = open(os.path.join(dirname, name_Pic), 'wb')
</p>
<p> , , , , , , , ,hh.write(dd)
</p>
<p> , , , , , , , ,hh.close()
</p>
<p> , , , , , , , ,bina = False
</p>
<p> , , , , , ,else:
</p>
<p> , , , , , , , ,S = S + chr(n)
</p>
<p> , , , , , ,continue
</p>
<p> , , , ,if chr(n) == '&#60;': # начало тега
</p>
<p> , , , , , ,
</p>
<p> , , , , , ,flag = True
</p>
<p> , , , , , ,Tag = ''
</p>
<p> , , , ,else:
</p>
<p> , , , , , ,if flag:
</p>
<p> , , , , , , , ,if chr(n) == '&#62;':
</p>
<p> , , , , , , , , , ,
</p>
<p> , , , , , , , , , ,flag = False
</p>
<p> , , , , , , , , , ,if Tag.find('binary')&#62; -1:
</p>
<p> , , , , , , , , , ,   # print(Tag)
</p>
<p> , , , , , , , , , , , ,bina = True
</p>
<p> , , , , , , , , , , , ,S = ''
</p>
<p> , , , , , , , , , , , ,name_Pic = getAttribute(Tag)
</p>
<p> , , , , , , , , , , , ,
</p>
<p> , , , , , , , , , , , ,
</p>
<p> , , , , , , , ,else:
</p>
<p> , , , , , , , , , ,Tag = Tag + chr(n)
</p>
<p>
</p>
<p> , , , , , ,
</p>
<p> , , , , , , , , 
</p>
<p>
</p>
<p>parseBinaryContent('Ho.fb2')
</p>
</section>
<section type="f">
<title><p>del_pic.py</p></title>
<p>#!/usr/bin/env python
</p>
<p># -*- coding: utf-8 -*-
</p>
<p># Удаление секций binary из файла xxxx.fb2.zip
</p>
<p>
</p>
<p>import sys, os, io, zipfile
</p>
<p>
</p>
<p>cover = ''
</p>
<p>NameFb2 = ''
</p>
<p>L=[]
</p>
<p>
</p>
<p>#---------------------------------------------
</p>
<p>
</p>
<p>def Del_Image():
</p>
<p> , ,global NameFb2
</p>
<p> , ,global L
</p>
<p> , ,vi = io.StringIO()
</p>
<p>
</p>
<p> , ,notbinary = True
</p>
<p> , ,for i in L:
</p>
<p> , , , ,if notbinary:
</p>
<p> , , , , , ,if (i.find('&#60;binary')&#62;=0):
</p>
<p> , , , , , , , ,if (i.find(cover)&#62;=0):
</p>
<p> , , , , , , , , , ,vi.write(i)
</p>
<p> , , , , , , , ,else:
</p>
<p> , , , , , , , , , ,notbinary = False
</p>
<p> , , , , , ,else:
</p>
<p> , , , , , , , ,vi.write(i)
</p>
<p> , , , ,if i.find('&#60;/binary')&#62;=0:
</p>
<p> , , , , , ,notbinary = True
</p>
<p>
</p>
<p> , ,w = zipfile.ZipFile('^temp.zip', 'w', zipfile.ZIP_DEFLATED) # Создание нового архива
</p>
<p> , ,w.writestr(NameFb2, vi.getvalue()) , ,
</p>
<p> , ,w.close()
</p>
<p> , ,vi.close()
</p>
<p>
</p>
<p>#----------------------------------------
</p>
<p>
</p>
<p>def o_zip(fn):
</p>
<p> , ,global NameFb2
</p>
<p> , ,global L
</p>
<p>
</p>
<p> , ,z = zipfile.ZipFile(fn, 'r')
</p>
<p> , ,filelist = z.namelist()
</p>
<p>
</p>
<p> , ,for n in filelist:
</p>
<p> , , , ,try:
</p>
<p> , , , , , ,if n[-4:] == ".fb2":
</p>
<p> , , , , , , , ,body = z.open(n)
</p>
<p> , , , , , , , ,NameFb2 = n
</p>
<p> , , , , , , , ,for line in body:
</p>
<p> , , , , , , , , , ,L.append(str(line, 'UTF-8'))
</p>
<p> , , , , , , , ,return True
</p>
<p> , , , ,except:
</p>
<p> , , , , , ,print( "error:", n )
</p>
<p> , , , , , ,return False
</p>
<p>
</p>
<p>#-------------------- main ------------------------
</p>
<p>
</p>
<p>print('Удаление секций binary из файла xxxx.fb2.zip')
</p>
<p>FileName = input('Введите имя файла:')
</p>
<p>if FileName == '':
</p>
<p> , , exit()
</p>
<p>
</p>
<p>e = input('Удалить обложку? [y/n]')
</p>
<p>if e == 'y':
</p>
<p> , , cover = 'not'
</p>
<p>else:
</p>
<p> , , cover = 'cover.'
</p>
<p>
</p>
<p>if os.path.isfile(FileName):
</p>
<p> , ,if o_zip(FileName):
</p>
<p> , , , ,Del_Image()
</p>
<p> , , , ,os.remove(FileName)
</p>
<p> , , , ,os.rename('^temp.zip', FileName)
</p>
<p> , , , ,print("Done.")
</p>
<p> , ,else:
</p>
<p> , , , ,print("???")
</p>
<p>else:
</p>
<p> , ,print("File doesn't exists!")
</p>
<p>
</p>
</section>
<section type="f">
<title><p>pic_base64.py</p></title>
<p># подготовка рисунка для fb2
</p>
<p>
</p>
<p>import base64
</p>
<p># Автор: Abhishek Amin , ,Дата записи 09.04.2021
</p>
<p># + w_cat 05.07.22
</p>
<p>fn = 'ce55.jpg'
</p>
<p>with open(fn, 'rb') as binary_file:
</p>
<p> , ,binary_file_data = binary_file.read()
</p>
<p> , ,base64_encoded_data = base64.b64encode(binary_file_data)
</p>
<p> , ,base64_message = base64_encoded_data.decode('utf-8')
</p>
<p>
</p>
<p> , ,ff = fn + '.txt'
</p>
<p> , ,f = open(ff, 'w')
</p>
<p> , ,f.write('&#60;binary id="'+fn+'" content-type="image/jpg"&#62;'+'\n')
</p>
<p> , ,f.write(base64_message+'\n')
</p>
<p> , ,f.write('&#60;/binary&#62;'+'\n\n')
</p>
<p> , ,f.close()
</p>
<p># осталось сделать:
</p>
<p># 1. определение типа файла
</p>
<p># , ,и изменение content-type в соответствии с типом.
</p>
<p># 2. упаковку группы файлов.
</p>
</section>
</section>
<section type="d">
<title><p>10</p></title>
<section type="f">
<title><p>del_empty_dir.py</p></title>
<p>#!/bin/env python
</p>
<p># -*- coding: utf-8 -*-
</p>
<p># Удаление пустых папок
</p>
<p>import sys, os
</p>
<p>
</p>
<p>def del_empty_dirs(path):
</p>
<p> , ,global co
</p>
<p> , ,for d in os.listdir(path):
</p>
<p> , , , ,a = os.path.join(path, d)
</p>
<p> , , , ,if os.path.isdir(a):
</p>
<p> , , , , , ,del_empty_dirs(a)
</p>
<p> , , , , , ,if not os.listdir(a):
</p>
<p> , , , , , , , ,co += 1
</p>
<p> , , , , , , , ,os.rmdir(a) , , , , , ,
</p>
<p># ------------------------------ , , , , , ,   
</p>
<p>Mpath = os.getcwd()
</p>
<p>co = 0
</p>
<p>del_empty_dirs(Mpath)
</p>
<p>
</p>
<p>print('Удалено '+str(co)+' пустых папок.')
</p>
</section>
<section type="f">
<title><p>Mer.py</p></title>
<p>#!/usr/bin/env python
</p>
<p># -*- coding: utf-8 -*-
</p>
<p># поиск одинаковых файлов
</p>
<p>#
</p>
<p>import sys, os
</p>
<p>import hashlib #
</p>
<p>
</p>
<p>ex = 'zip'#'fb2'#'txt'#'mp4'#'gif'#'jpg'
</p>
<p>GFiles = []
</p>
<p>co = 0
</p>
<p>LOut = []
</p>
<p>def SaveInList(L3):
</p>
<p> , ,if len(L3) &#62; 0:
</p>
<p> , , , ,global co
</p>
<p> , , , ,global LOut
</p>
<p> , , , ,for i in L3:
</p>
<p> , , , , , ,LOut.append(i+'\n')
</p>
<p> , , , , , ,co += 1
</p>
<p> , , , ,LOut.append('-----\n\n')
</p>
<p>
</p>
<p>def ScanMd5(L2):
</p>
<p> , ,if len(L2) &#62; 0:
</p>
<p> , , , ,L3 = []
</p>
<p> , , , ,L2.sort()
</p>
<p> , , , ,flag = False
</p>
<p> , , , ,oldMd5 = ''
</p>
<p> , , , ,OldFile = ''
</p>
<p> , , , ,for i in L2:
</p>
<p> , , , , , ,m = i.split('%')
</p>
<p> , , , , , ,ZMd5= m[0]
</p>
<p> , , , , , ,if (not flag) and (ZMd5 == oldMd5):
</p>
<p> , , , , , , , ,flag = True
</p>
<p> , , , , , , , ,L3.append(OldFile)  
</p>
<p> , , , , , ,if flag:
</p>
<p> , , , , , , , ,if ZMd5 == oldMd5:
</p>
<p> , , , , , , , , , ,L3.append(m[1])
</p>
<p> , , , , , , , ,else:
</p>
<p> , , , , , , , , , ,flag = False
</p>
<p> , , , , , , , , , ,SaveInList(L3)
</p>
<p> , , , , , , , , , ,L3.clear()
</p>
<p>   , , , , , , , , , ,
</p>
<p> , , , , , ,oldMd5 = ZMd5
</p>
<p> , , , , , ,OldFile = m[1]
</p>
<p> , , , ,SaveInList(L3) #
</p>
<p> , ,
</p>
<p>def ScanSize(GFiles):
</p>
<p> , ,if len(GFiles) &#62; 0:
</p>
<p> , , , ,L = []
</p>
<p> , , , ,flag = False
</p>
<p> , , , ,oldSize = ''
</p>
<p> , , , ,OldFile = ''
</p>
<p> , , , ,for i in GFiles:
</p>
<p> , , , , , ,m = i.split('%')
</p>
<p> , , , , , ,Zaize = m[0]
</p>
<p> , , , , , ,if (not flag) and (Zaize == oldSize):
</p>
<p> , , , , , , , ,flag = True
</p>
<p> , , , , , , , ,L.append(getmd5(OldFile)+'%'+ OldFile)
</p>
<p> , , , , , ,if flag:
</p>
<p> , , , , , , , ,if Zaize == oldSize:
</p>
<p> , , , , , , , , , ,L.append(getmd5(m[1])+'%'+ m[1])
</p>
<p> , , , , , , , ,else:
</p>
<p> , , , , , , , , , ,flag = False
</p>
<p> , , , , , , , , , ,ScanMd5(L)
</p>
<p> , , , , , , , , , ,L.clear()
</p>
<p> , , , , , , , , , , , ,
</p>
<p> , , , , , ,oldSize = Zaize
</p>
<p> , , , , , ,OldFile = m[1]
</p>
<p> , , , ,ScanMd5(L) #
</p>
<p>#--------------------------------------------------
</p>
<p>def getmd5(file_name):
</p>
<p>## try
</p>
<p> with open(file_name, "rb" ) as file_to_check:
</p>
<p>  data = file_to_check.read() 
</p>
<p>  return hashlib.md5(data).hexdigest()
</p>
<p>
</p>
<p>def parse_file(fn):
</p>
<p> , ,global GFiles
</p>
<p> , ,s=str(os.path.getsize(fn))+'%'#
</p>
<p> , ,GFiles.append(s+fn)
</p>
<p> , , , ,
</p>
<p>def parse_dir(sSrc):
</p>
<p> , ,global f_list 
</p>
<p> , ,for file in os.listdir(sSrc): 
</p>
<p> , , , ,# full pathname  
</p>
<p> , , , ,file=os.path.join(sSrc,file)   
</p>
<p> , , , ,if os.path.isdir(file): 
</p>
<p> , , , , , ,parse_dir(file) 
</p>
<p> , , , ,else: 
</p>
<p> , , , , , ,m = file.split('.')[-1] # извлечение расширения
</p>
<p> , , , , , ,m = m.lower()
</p>
<p> , , , , , ,if (m == ex):
</p>
<p> , , , , , , , ,parse_file(file)
</p>
<p> , , , , , , , ,
</p>
<p>#--------------------------------------------------
</p>
<p>path = os.getcwd()
</p>
<p>
</p>
<p>parse_dir(path)
</p>
<p>GFiles.sort()
</p>
<p>ScanSize(GFiles) #
</p>
<p>
</p>
<p>if co &#62; 0:
</p>
<p>   f = open('merg_'+ex+'.txt', 'w')
</p>
<p>   for i in LOut:
</p>
<p> , ,   f.write(i+'\n')
</p>
<p>   f.close()
</p>
<p>
</p>
<p>print('Done '+ex+' -&#62; '+str(co))
</p>
</section>
<section type="f">
<title><p>same_fb2.py</p></title>
<p>#!/bin/env python
</p>
<p>
</p>
<p># -*- coding: utf-8 -*-
</p>
<p>
</p>
<p>import sys, os
</p>
<p>
</p>
<p>from m_list import FindValue, PrintList, Books
</p>
<p>
</p>
<p>list = []
</p>
<p>
</p>
<p>
</p>
<p>def fb2zip(pa):
</p>
<p> , ,p = pa.split('/')
</p>
<p> , ,FindValue(p[-1],pa)
</p>
<p>
</p>
<p># -----------------
</p>
<p>
</p>
<p>
</p>
<p>def GetListFiles(PathForWork):
</p>
<p> , ,global list
</p>
<p> , ,for file in os.listdir(PathForWork):
</p>
<p> , , , ,path = os.path.join(PathForWork, file)
</p>
<p> , , , ,ex = path.split('.')
</p>
<p> , , , ,if not os.path.isdir(path): #
</p>
<p> , , , , , ,if ex[-1].lower() == 'fb2':
</p>
<p> , , , , , , , ,fb2zip(path)
</p>
<p> , , , , , ,else:
</p>
<p> , , , , , , , ,e = ex[-2]+ex[-1]
</p>
<p> , , , , , , , ,if e.lower() == 'fb2zip':
</p>
<p> , , , , , , , , , ,fb2zip(path)
</p>
<p> , , , ,else: #
</p>
<p> , , , , , ,GetListFiles(path) #
</p>
<p>
</p>
<p># -----------------
</p>
<p>
</p>
<p>def CompareList():
</p>
<p> , ,OldFile = ''
</p>
<p> , ,OldPath = ''
</p>
<p> , ,flag = False
</p>
<p>
</p>
<p> , ,for it in Books:
</p>
<p> , , , ,if (it[0] == OldFile):
</p>
<p> , , , , , ,if not flag :
</p>
<p> , , , , , , , ,flag = True
</p>
<p> , , , , , , , ,list.append(OldPath)
</p>
<p> , , , , , ,list.append(it[1])
</p>
<p> , , , ,else:
</p>
<p> , , , , , ,if flag:
</p>
<p> , , , , , , , ,flag = False
</p>
<p> , , , , , , , ,list.append('------------')
</p>
<p> , , , , , ,OldFile = it[0]
</p>
<p> , , , , , ,OldPath = it[1]
</p>
<p>
</p>
<p># -----------------
</p>
<p>
</p>
<p># Main:
</p>
<p>
</p>
<p>Mpath = os.getcwd()
</p>
<p>GetListFiles(Mpath)
</p>
<p>CompareList()
</p>
<p>
</p>
<p>if len(list) == 0:
</p>
<p> , ,print('Дубликатов нет.')
</p>
<p>else:
</p>
<p> , ,new_file = open(fn2,'w')
</p>
<p> , ,for i in list: #
</p>
<p> , , , ,new_file.write(i)
</p>
<p> , , , ,print i
</p>
<p> , ,print 'Done!'
</p>
<p> , ,new_file.close</p>
</section>
<section type="f">
<title><p>scan7i.py</p></title>
<p>#!/usr/bin/env python
</p>
<p># -*- coding: utf-8 -*-
</p>
<p>import sys, os
</p>
<p>import zipfile
</p>
<p>import datetime
</p>
<p>import xml.dom.minidom
</p>
<p>
</p>
<p># 7 avg 2021
</p>
<p># Запись списка книг в "небазу" (третья,2 версия)
</p>
<p>#--------------------------------------------------
</p>
<p>Books = []
</p>
<p>Errror = []
</p>
<p>siz = 0 # размер файла
</p>
<p>countFiles = 0
</p>
<p>book_title = ''
</p>
<p>stroka = ''
</p>
<p>
</p>
<p>replace_val = [('\\', '_'),('/', '_'),(':', '_'),('*', '_'),('?', '_'),('"', '_'),('&#60;', '_'), ('&#62;', '_'), ('|', '_')]
</p>
<p>#--------------------------------------------------
</p>
<p>def SaveList(fn, L, cco):
</p>
<p> , ,if cco &#62; 0:
</p>
<p> , , , ,f = open(fn, 'w')
</p>
<p> , , , ,for i in L:
</p>
<p> , , , , , ,f.write(i)
</p>
<p> , , , ,f.close()
</p>
<p>def SaveError(fn, L):
</p>
<p> , ,if len(L) &#62; 0:
</p>
<p> , , , ,f = open(fn, 'w')
</p>
<p> , , , ,for i in L:
</p>
<p> , , , , , ,f.write(str(i)+'\n')
</p>
<p> , , , ,f.close()
</p>
<p>#--------------------------------------------------
</p>
<p>#**********************************************************************
</p>
<p>
</p>
<p>def parse_fb2(fn):
</p>
<p> , ,global Books  
</p>
<p> , ,global stroka
</p>
<p> , ,global book_title 
</p>
<p> , , , ,  
</p>
<p> , ,if isinstance(fn, str):
</p>
<p>
</p>
<p> , , , ,fn = open(fn)
</p>
<p> , ,try:
</p>
<p> , , , ,dom = xml.dom.minidom.parse(fn)
</p>
<p> , , , ,
</p>
<p> , ,except:
</p>
<p> , , , ,print('Error in fb2:')
</p>
<p> , , , ,Errror.append(fn)
</p>
<p> , , , ,return False
</p>
<p> , ,else:
</p>
<p> , , , ,dom.normalize()
</p>
<p> , , , ,node1=dom.getElementsByTagName("description")[0]
</p>
<p> , , , ,titl=node1.getElementsByTagName("title-info")[0]
</p>
<p>##
</p>
<p> , , , ,book=titl.getElementsByTagName("book-title")[0]
</p>
<p> , , , ,book_title = book.childNodes[0].nodeValue
</p>
<p> , , , ,book_title = book_title.replace('|', '!')
</p>
<p> , , , ,s = book_title +'|'
</p>
<p> , , , ,
</p>
<p> , , , ,au = ''
</p>
<p> , , , ,try:
</p>
<p> , , , , , ,for auto in titl.getElementsByTagName("author"):
</p>
<p> , , , , , , , ,no1=auto.getElementsByTagName("last-name")[0]
</p>
<p> , , , , , , , ,au = au + no1.childNodes[0].nodeValue
</p>
<p> , , , , , , , ,no1=auto.getElementsByTagName("first-name")[0]
</p>
<p> , , , , , , , ,fi = no1.childNodes[0].nodeValue
</p>
<p> , , , , , , , ,au = au +  '.'+ fi[0]+'^' , , , , , ,   
</p>
<p> , , , , , ,au = au[:-1]
</p>
<p> , , , ,except:
</p>
<p> , , , , , ,au = "NoName."
</p>
<p> , , , ,s = s+au
</p>
<p> , , , ,stroka = s +'|0|'
</p>
<p> , , , ,return True
</p>
<p>
</p>
<p>#**********************************************************************
</p>
<p>#--------------------------------------------
</p>
<p>def parse_zip(adr):
</p>
<p> , ,z = zipfile.ZipFile(adr, 'r')
</p>
<p> , ,filelist = z.namelist()
</p>
<p> , ,filelist.sort()
</p>
<p> , ,for n in filelist:
</p>
<p> , , , , try:
</p>
<p> , , , , , ,if n[-4:] == ".fb2":
</p>
<p> , , , , , , , ,return parse_fb2(z.open(n))
</p>
<p> , , , , except:
</p>
<p> , , , , , ,print( "Errror:", n )
</p>
<p> , , , , , ,return False
</p>
<p>#--------------------------------------------------
</p>
<p>def replace(line, old_new_num):
</p>
<p> , ,for vals in old_new_num:
</p>
<p> , , , , , ,# распаковываем кортеж
</p>
<p> , , , , , ,old, new = vals
</p>
<p> , , , , , ,line = line.replace(old, new)
</p>
<p> , ,return line
</p>
<p>
</p>
<p>def my_rename(adr,ph, ex):
</p>
<p> , ,co = 0
</p>
<p>
</p>
<p> , ,book_ti = book_title[:20]
</p>
<p># \ / : * ? " &#60; &#62; |
</p>
<p> , ,book_ti = replace(book_ti, replace_val)
</p>
<p> , ,
</p>
<p> , ,a = '-' + book_ti + ex
</p>
<p> , ,while os.path.isfile(os.path.join(ph, a)):
</p>
<p> , , , ,co += 1
</p>
<p> , , , ,a = '-' + book_ti +str(co)+ ex
</p>
<p># , ,print(a)
</p>
<p> , ,os.rename(adr,os.path.join(ph, a))
</p>
<p> , ,if ex == '.fb2':
</p>
<p> , , , ,ex = 'f'
</p>
<p> , ,else:
</p>
<p> , , , ,ex = 'z'
</p>
<p> , ,if co &#62; 0:
</p>
<p> , , , ,ex = str(co)+ex
</p>
<p> , ,
</p>
<p> , ,Books.append(stroka +ex+ '|'+str(siz)+'\n')
</p>
<p> , ,
</p>
<p>def parse_file(adr,ph):
</p>
<p> , ,global siz # размер файла
</p>
<p> , ,global countFiles
</p>
<p> , ,flag = os.path.basename(adr)[0] != '-'
</p>
<p> , ,siz = os.path.getsize(adr)
</p>
<p> , ,m = adr.split(".")
</p>
<p> , ,if (m[-1] == "zip") and (m[-2] == "fb2"):
</p>
<p> , , , ,if flag and parse_zip(adr):
</p>
<p> , , , , , ,  countFiles += 1
</p>
<p> , , , , , ,  my_rename(adr,ph,'.fb2.zip')
</p>
<p> , ,elif (m[-1] == "fb2"):
</p>
<p> , , , ,if flag and parse_fb2(adr):
</p>
<p> , , , , , ,  countFiles += 1
</p>
<p> , , , , , ,  my_rename(adr,ph,'.fb2') , , , , , ,
</p>
<p> , , , ,
</p>
<p>def parse_dir(ph):
</p>
<p> , ,dirlist = os.listdir(ph)
</p>
<p> , ,dirlist.sort()
</p>
<p> , ,for i in dirlist:
</p>
<p> , , , ,adr = os.path.join(ph, i)
</p>
<p> , , , ,if os.path.isdir(adr):
</p>
<p> , , , , , ,parse_dir(adr)
</p>
<p> , , , ,else:
</p>
<p>#? , , , , , ,if os.path.getsize(i) &#62; 0:
</p>
<p> , , , , , , , ,parse_file(adr, ph)
</p>
<p>#? , , , ,else:
</p>
<p>#? , , , , , ,print("bad zip "+ i)
</p>
<p>#----------------------------------------
</p>
<p>
</p>
<p>path = os.getcwd()
</p>
<p> , ,  
</p>
<p>#----------------------------------------
</p>
<p>
</p>
<p>if os.path.isfile('NeBaza.txt'):
</p>
<p> , ,f = open('NeBaza.txt','r')
</p>
<p> , ,for i in f:
</p>
<p> , , , , , ,Books.append(i)
</p>
<p> , ,f.close()
</p>
<p>parse_dir(path)
</p>
<p>
</p>
<p>Books.sort()
</p>
<p>SaveList('NeBaza.txt', Books, countFiles )
</p>
<p>SaveError('Errror.txt', Errror)#
</p>
<p>print( 'Done!')
</p>
<p>print( 'Add '+ str(countFiles)+' files.')
</p>
<p>
</p>
</section>
</section>
<section type="d">
<title><p>12</p></title>
<section type="f">
<title><p>dead_books.py</p></title>
<p>#!/usr/bin/env python
</p>
<p># -*- coding: utf-8 -*-
</p>
<p>import sys, os
</p>
<p>import xml.dom.minidom
</p>
<p>import zipfile
</p>
<p>
</p>
<p># 31 Jul
</p>
<p># Ручная сортировка дубликатов в "небазе" (вторая версия)
</p>
<p>#--------------------------------------------------
</p>
<p>Books = []
</p>
<p>tree  = []
</p>
<p>Ltree = []
</p>
<p>LOut = []
</p>
<p>co = 0
</p>
<p>#--------------------------------------------------
</p>
<p>def SaveList(fn, Li): # запись списка в файл
</p>
<p> , , , ,f = open(fn, 'w')
</p>
<p> , , , ,for i in Li:
</p>
<p> , , , , , ,f.write(i)
</p>
<p> , , , ,f.close()
</p>
<p>#---------------------------------------
</p>
<p>replace_val = [('\\', '_'),('/', '_'),(':', '_'),('*', '_'),('?', '_'),('"', '_'),('&#60;', '_'), ('&#62;', '_'), ('|', '_')]
</p>
<p>def replace(line, old_new_num):
</p>
<p> , ,for vals in old_new_num:
</p>
<p> , , , , , ,# распаковываем кортеж
</p>
<p> , , , , , ,old, new = vals
</p>
<p> , , , , , ,line = line.replace(old, new)
</p>
<p> , ,return line
</p>
<p>#---------------------------------------
</p>
<p>def my_name(book_title):
</p>
<p> , ,book_ti = book_title[:20] # обрезание названия книги
</p>
<p> , ,book = replace(book_ti, replace_val) # удаление из названия запрещенных символов
</p>
<p> , ,return book
</p>
<p>#--------------------------------------- , ,
</p>
<p>def LoadFile(fn, Li): # Загрузка из файла в список
</p>
<p> , ,if os.path.isfile(fn):
</p>
<p> , , , ,f = open(fn,'r')
</p>
<p> , , , ,for i in f:
</p>
<p> , , , , , ,Li.append(i)
</p>
<p> , , , ,f.close()
</p>
<p> , ,else:
</p>
<p> , , , ,print('I need '+ fn)
</p>
<p> , , , ,exit()
</p>
<p>#++++++++++++++++++++++++++++++++++++++++++++++++++++++
</p>
<p>def FindInTree(s, i):
</p>
<p> , ,global tree
</p>
<p> , ,global Books
</p>
<p> , ,n = -1
</p>
<p> , ,for k in tree:
</p>
<p> , , , ,n += 1
</p>
<p> , , , ,if k.find(s) &#62; -1:
</p>
<p> , , , , , ,tree.pop(n)
</p>
<p> , , , , , ,Books.pop(i)
</p>
<p> , , , , , ,break
</p>
<p> , ,
</p>
<p>#---------------------------------------
</p>
<p>L=[]
</p>
<p>
</p>
<p>#********************************************************
</p>
<p>path = os.getcwd()
</p>
<p>LoadFile('NeBaza.txt', Books)
</p>
<p>#LoadFile('tree2.txt', tree)
</p>
<p>for i in range(len(Books), 0, -1): # удаление из списка
</p>
<p> , ,if (Books[i-1].find('|Y|')&#62;0) or (Books[i-1].find('|Z|')&#62;0):
</p>
<p># , , , ,print(Books[i-1])
</p>
<p> , , , ,Books.pop(i-1)  # ранее удаленных книг
</p>
<p>
</p>
<p>for i in Books:
</p>
<p> , ,m = i.split('|')
</p>
<p> , ,L.append(m[4].strip()+'|-'+my_name(m[0])+'\n')
</p>
<p>
</p>
<p>for i in range(len(L), 0, -1):
</p>
<p> , ,FindInTree(L[i-1].strip(), i-1)
</p>
<p>
</p>
<p>SaveList('net_v_base.txt',tree) , ,
</p>
<p>SaveList('dead_B.txt',Books) 
</p>
<p> , ,
</p>
<p>print( 'Done!')
</p>
</section>
<section type="f">
<title><p>dead_books2.2.py</p></title>
<p>#!/usr/bin/env python
</p>
<p># -*- coding: utf-8 -*-
</p>
<p>import sys, os
</p>
<p>import xml.dom.minidom
</p>
<p>import zipfile
</p>
<p>
</p>
<p># 31 Jul
</p>
<p># поиск книг содержащихся в небазе, но не существующих физически
</p>
<p>#--------------------------------------------------
</p>
<p>Books = []
</p>
<p>tree  = []
</p>
<p>Ltree = []
</p>
<p>LOut = []
</p>
<p>co = 0
</p>
<p>#--------------------------------------------------
</p>
<p>def SaveList(fn, Li): # запись списка в файл
</p>
<p> , ,if len(Li) &#62; 0:
</p>
<p> , , , ,f = open(fn, 'w')
</p>
<p> , , , ,for i in Li:
</p>
<p> , , , , , ,f.write(i)
</p>
<p> , , , ,f.close()
</p>
<p>#---------------------------------------
</p>
<p>replace_val = [('\\', '_'),('/', '_'),(':', '_'),('*', '_'),('?', '_'),('"', '_'),('&#60;', '_'), ('&#62;', '_'), ('|', '_')]
</p>
<p>def replace(line, old_new_num):
</p>
<p> , ,for vals in old_new_num:
</p>
<p> , , , , , ,# распаковываем кортеж
</p>
<p> , , , , , ,old, new = vals
</p>
<p> , , , , , ,line = line.replace(old, new)
</p>
<p> , ,return line
</p>
<p>#---------------------------------------
</p>
<p>def my_name(book_title):
</p>
<p> , ,book_ti = book_title[:20] # обрезание названия книги
</p>
<p> , ,book = replace(book_ti, replace_val) # удаление из названия запрещенных символов
</p>
<p> , ,return book
</p>
<p>#--------------------------------------- , ,
</p>
<p>def LoadFile(fn, Li): # Загрузка из файла в список
</p>
<p> , ,if os.path.isfile(fn):
</p>
<p> , , , ,f = open(fn,'r')
</p>
<p> , , , ,for i in f:
</p>
<p> , , , , , ,Li.append(i)
</p>
<p> , , , ,f.close()
</p>
<p> , ,else:
</p>
<p> , , , ,print('I need '+ fn)
</p>
<p> , , , ,exit()
</p>
<p>#+++++++++++++++++++++++++++++++++++++++
</p>
<p>def FindInTree(s, i):
</p>
<p> , ,global tree
</p>
<p> , ,global Books
</p>
<p> , ,n = -1
</p>
<p> , ,for k in tree:
</p>
<p> , , , ,n += 1
</p>
<p> , , , ,if k.find(s) &#62; -1:
</p>
<p> , , , , , ,tree.pop(n)
</p>
<p> , , , , , ,Books.pop(i)
</p>
<p> , , , , , ,break
</p>
<p>#---------------------------------------
</p>
<p>L = []
</p>
<p>ln = 0
</p>
<p>#---------------------------------------
</p>
<p>def parse_dir(ph):
</p>
<p> , ,global tree
</p>
<p> , ,dirlist = os.listdir(ph)
</p>
<p> , ,dirlist.sort()
</p>
<p> , ,for i in dirlist:
</p>
<p> , , , ,adr = os.path.join(ph, i)
</p>
<p> , , , ,if os.path.isdir(adr):
</p>
<p> , , , , , ,parse_dir(adr)
</p>
<p> , , , ,else:
</p>
<p> , , , , , ,hh = ph[ln:]
</p>
<p> , , , , , ,tree.append(hh+'|'+ str(os.path.getsize(adr))+'|'+i+ '\n')
</p>
<p>#********************************************************
</p>
<p>path = os.getcwd()
</p>
<p>ln = len(path) + 1
</p>
<p>
</p>
<p>LoadFile('NeBaza.txt', Books)
</p>
<p>parse_dir(path)
</p>
<p>for i in range(len(Books), 0, -1): # удаление из списка
</p>
<p> , ,if (Books[i-1].find('|Y|')&#62;0) or (Books[i-1].find('|Z|')&#62;0):
</p>
<p># , , , ,print(Books[i-1])
</p>
<p> , , , ,Books.pop(i-1)  # ранее удаленных книг
</p>
<p>
</p>
<p>for i in Books:
</p>
<p> , ,m = i.split('|')
</p>
<p> , ,L.append(m[4].strip()+'|-'+my_name(m[0])+'\n')
</p>
<p>
</p>
<p>for i in range(len(L), 0, -1):
</p>
<p> , ,FindInTree(L[i-1].strip(), i-1)
</p>
<p> , ,
</p>
<p>for i in range(len(tree), 0, -1):
</p>
<p> , ,s = tree[i-1].strip()
</p>
<p> , ,if (s[-1] != 'p') and (s[-1] != '2'):
</p>
<p># , , , ,print(tree[i-1])
</p>
<p> , , , ,tree.pop(i-1)
</p>
<p> , ,
</p>
<p>SaveList('net_v_base.txt',tree) , ,
</p>
<p>SaveList('dead_B.txt',Books) 
</p>
<p> , ,
</p>
<p>print( 'Done!')
</p>
</section>
<section type="f">
<title><p>dubl_auto.py</p></title>
<p>#!/usr/bin/env python
</p>
<p># -*- coding: utf-8 -*-
</p>
<p>import sys, os
</p>
<p>
</p>
<p># 19 Avg
</p>
<p># сортировка книг по авторам
</p>
<p>#--------------------------------------------------
</p>
<p>Books = []
</p>
<p>tree  = []
</p>
<p>LOut = [] # выходной список
</p>
<p>#--------------------------------------- , ,
</p>
<p>def LoadFile(fn, Li): # Загрузка из файла в список
</p>
<p> , ,if os.path.isfile(fn):
</p>
<p> , , , ,f = open(fn,'r')
</p>
<p> , , , ,for i in f:
</p>
<p> , , , , , ,Li.append(i)
</p>
<p> , , , ,f.close()
</p>
<p> , ,else:
</p>
<p> , , , ,print('I need '+ fn)
</p>
<p> , , , ,exit()
</p>
<p>#--------------------------------------- , ,
</p>
<p>def LoadFileM(fn, Li): # Загрузка из файла в список (модифицированно)
</p>
<p> , ,if os.path.isfile(fn):
</p>
<p> , , , ,f = open(fn,'r')
</p>
<p> , , , ,for i in f:
</p>
<p> , , , , , ,mmm = i.split('|')
</p>
<p> , , , , , ,# автор[1]; название[0]; размер файла[4]
</p>
<p> , , , , , ,Bo = mmm[1]+'|'+mmm[0]+'|'+mmm[4]
</p>
<p> , , , , , ,if mmm[1] != 'NoName.':  
</p>
<p> , , , , , , , ,Li.append(Bo)
</p>
<p> , , , ,f.close()
</p>
<p> , ,else:
</p>
<p> , , , ,print('I need '+ fn)
</p>
<p> , , , ,exit()
</p>
<p>
</p>
<p>#--------------------------------------------------
</p>
<p>def SaveList(fn, Li): # запись списка в файл
</p>
<p> , , , ,f = open(fn, 'w')
</p>
<p> , , , ,for i in Li:
</p>
<p> , , , , , ,f.write(i)
</p>
<p> , , , ,f.close()
</p>
<p>#**********************************************************************
</p>
<p>def my_sort(L2): # Поиск авторов
</p>
<p> , ,L3 = []  # Промежуточное хранилище
</p>
<p> , ,flag = False
</p>
<p> , ,n = -1
</p>
<p> , ,OldAu = ''
</p>
<p> , ,OldSt = ''
</p>
<p> , ,Cap = ''
</p>
<p> , ,for i in L2:
</p>
<p> , , , ,m = i.split('|')
</p>
<p> , , , ,n += 1
</p>
<p> , , , ,Cap = m[0] # автор
</p>
<p> , , , ,if (not flag) and (Cap == OldAu):
</p>
<p> , , , , , ,flag = True
</p>
<p> , , , , , ,L3.append(OldSt)
</p>
<p> , , , ,if flag:
</p>
<p> , , , , , ,if Cap == OldAu:
</p>
<p> , , , , , , , ,L3.append(i)
</p>
<p> , , , , , ,else:
</p>
<p> , , , , , , , ,flag = False
</p>
<p> , , , , , , , ,SaveInList(L3, OldAu)
</p>
<p> , , , , , , , ,L3.clear()
</p>
<p> , , , ,OldAu = Cap
</p>
<p> , , , ,OldSt = i
</p>
<p> , ,SaveInList(L3, OldAu) #
</p>
<p>#+++++++++++++++++++++++++++++++++++++++++++++
</p>
<p>replace_val = [('\\', '_'),('/', '_'),(':', '_'),('*', '_'),('?', '_'),('"', '_'),('&#60;', '_'), ('&#62;', '_'), ('|', '_')]
</p>
<p>def replace(line, old_new_num):
</p>
<p> , ,for vals in old_new_num:
</p>
<p> , , , , , ,# распаковываем кортеж
</p>
<p> , , , , , ,old, new = vals
</p>
<p> , , , , , ,line = line.replace(old, new)
</p>
<p> , ,return line
</p>
<p>#---------------------------------------
</p>
<p>def my_name(book_title):
</p>
<p> , ,book_ti = book_title.strip() # исправление ввести в остальные скрипты
</p>
<p> , ,book_ti = book_ti[:20] # обрезание названия книги
</p>
<p> , ,book = replace(book_ti, replace_val) # удаление из названия запрещенных символов
</p>
<p> , ,return book
</p>
<p>#---------------------------------------
</p>
<p>def ScanTree(s): # Поиск в дереве файлов по шаблону
</p>
<p> , ,global tree
</p>
<p> , ,c = -1
</p>
<p> , ,for i in tree:
</p>
<p> , , , ,c += 1
</p>
<p># , , , ,print(i)
</p>
<p># , , , ,print(s)
</p>
<p> , , , ,if i.find(s) &#62; -1:
</p>
<p> , , , , , ,tree.pop(c)
</p>
<p> , , , , , ,return i
</p>
<p> , ,return ' '
</p>
<p>
</p>
<p>#--------------------------------------------------
</p>
<p>def SameFolder(L3): # проверка - нахождение книг в одной папке
</p>
<p> , ,mmm = L3[0].split('|')
</p>
<p> , ,s = mmm[0]
</p>
<p> , ,for i in L3:
</p>
<p> , , , ,mmm = i.split('|')
</p>
<p> , , , ,if mmm[0] != s:
</p>
<p> , , , , , ,return False
</p>
<p> , ,return True
</p>
<p># ++++++++++++++++++++++++++++++++
</p>
<p>def SaveInList(L3, au): # Перезапись из промежуточного в окончательный список дубликатов 
</p>
<p> , ,if len(L3) &#62; 0:
</p>
<p> , , , ,c = -1
</p>
<p> , , , ,global LOut
</p>
<p>
</p>
<p> , , , ,for k in L3: #
</p>
<p> , , , , , ,c += 1
</p>
<p> , , , , , ,mmm = k.split('|')
</p>
<p> , , , , , ,nnn = mmm[2].strip()+'|-'+my_name(mmm[1])
</p>
<p> , , , , , ,s = ScanTree(nnn)
</p>
<p> , , , , , ,if s != ' ':
</p>
<p> , , , , , , , , , ,hhh = s.split('|')
</p>
<p> , , , , , , , , , ,L3[c] = hhh[0]+'|'+hhh[2]
</p>
<p> , , , ,if SameFolder(L3):
</p>
<p> , , , , , ,return
</p>
<p> , , , ,L3.sort()
</p>
<p> , , , ,LOut.append('-- '+au+' --\n')
</p>
<p> , , , ,for i in L3:
</p>
<p> , , , , , ,LOut.append(i)
</p>
<p>#************************** main ******************************
</p>
<p>LoadFileM('NeBaza3.txt', Books)
</p>
<p>LoadFile('tree2.txt', tree)
</p>
<p>
</p>
<p>Books.sort()
</p>
<p>my_sort(Books)
</p>
<p>
</p>
<p>SaveList('ccc.txt', LOut)
</p>
<p> 
</p>
<p>print( 'Done!')
</p>
</section>
<section type="f">
<title><p>tree.py</p></title>
<p>#!/usr/bin/env python
</p>
<p># -*- coding: utf-8 -*-
</p>
<p>import sys, os
</p>
<p>
</p>
<p># 27 Jul 2021
</p>
<p># 
</p>
<p>#--------------------------------------------------
</p>
<p>L = []
</p>
<p>ln = 0
</p>
<p>def parse_dir(ph):
</p>
<p> , ,global L
</p>
<p> , ,dirlist = os.listdir(ph)
</p>
<p> , ,dirlist.sort()
</p>
<p> , ,for i in dirlist:
</p>
<p> , , , ,adr = os.path.join(ph, i)
</p>
<p> , , , ,if os.path.isdir(adr):
</p>
<p> , , , , , ,parse_dir(adr)
</p>
<p> , , , ,else:
</p>
<p> , , , , , ,adr = adr[ln:]
</p>
<p> , , , , , ,L.append(adr+'\n')
</p>
<p>#----------------------------------------
</p>
<p>def SaveList(L):
</p>
<p> , , , ,f = open('tree.txt', 'w')
</p>
<p> , , , ,for i in L:
</p>
<p> , , , , , ,f.write(i)
</p>
<p> , , , ,f.close()
</p>
<p>#----------------------------------------
</p>
<p>path = os.getcwd()
</p>
<p>ln = len(path) + 1
</p>
<p>#----------------------------------------
</p>
<p>
</p>
<p>parse_dir(path)
</p>
<p>SaveList(L)
</p>
<p>print( 'Done!')
</p>
<p>
</p>
<p>
</p>
</section>
<section type="f">
<title><p>tree2.py</p></title>
<p>#!/usr/bin/env python
</p>
<p># -*- coding: utf-8 -*-
</p>
<p>import sys, os
</p>
<p>
</p>
<p># 3 avg
</p>
<p># 
</p>
<p>#--------------------------------------------------
</p>
<p>L = []
</p>
<p>ln = 0
</p>
<p>def parse_dir(ph):
</p>
<p> , ,global L
</p>
<p> , ,dirlist = os.listdir(ph)
</p>
<p> , ,dirlist.sort()
</p>
<p> , ,for i in dirlist:
</p>
<p> , , , ,adr = os.path.join(ph, i)
</p>
<p> , , , ,if os.path.isdir(adr):
</p>
<p> , , , , , ,parse_dir(adr)
</p>
<p> , , , ,else:
</p>
<p> , , , , , ,hh = ph[ln:]
</p>
<p> , , , , , ,L.append(hh+'|'+ str(os.path.getsize(adr))+'|'+i+ '\n')
</p>
<p>#----------------------------------------
</p>
<p>def SaveList(L):
</p>
<p> , , , ,f = open('tree2.txt', 'w')
</p>
<p> , , , ,for i in L:
</p>
<p> , , , , , ,f.write(i)
</p>
<p> , , , ,f.close()
</p>
<p>#----------------------------------------
</p>
<p>path = os.getcwd()
</p>
<p>ln = len(path) + 1
</p>
<p>#----------------------------------------
</p>
<p>
</p>
<p>parse_dir(path)
</p>
<p>SaveList(L)
</p>
<p>print( 'Done!')
</p>
<p>
</p>
<p>
</p>
</section>
</section>
<section type="d">
<title><p>16 Obedinenie</p></title>
<section type="f">
<title><p>fb2_list.py</p></title>
<p>#!/usr/bin/env python
</p>
<p># -*- codning: utf-8 -*-
</p>
<p>import sys, os
</p>
<p>import zipfile
</p>
<p>
</p>
<p># Извлечение из архивов в папке
</p>
<p># Изготовление списка книг в текущей папке
</p>
<p>#-----------------------------------------------
</p>
<p>List = []
</p>
<p>Count = 0
</p>
<p>def parse_zip(fn): # обработка zip
</p>
<p> , ,global path
</p>
<p> , ,global Count
</p>
<p> , ,z = zipfile.ZipFile(fn, 'r')
</p>
<p> , ,z.extractall(path)
</p>
<p> , ,Count += 1
</p>
<p>
</p>
<p>def parse_file(fn): #  обработка файла
</p>
<p> , ,m = fn.split(".")[-1]
</p>
<p> , ,if (m == "zip"): # если zip
</p>
<p> , , , ,parse_zip(fn)
</p>
<p> , , , ,
</p>
<p>def parse_dir(fn): # сканирование папки
</p>
<p> , ,dirlist = os.listdir(fn)
</p>
<p> , ,dirlist.sort()
</p>
<p> , ,for a in dirlist:
</p>
<p> , , , ,if os.path.getsize(a) &#62; 0:
</p>
<p> , , , , , , , ,parse_file(a)
</p>
<p>#-------------------------
</p>
<p>
</p>
<p>def SaveList():
</p>
<p> , ,f = open('list.txt', 'w', encoding="utf-8")
</p>
<p> , ,for i in List:
</p>
<p> , , , ,f.write(i)#   'cp1251' '\n'
</p>
<p> , ,f.close()
</p>
<p>
</p>
<p>def ScanDir(fn): # сканирование папки
</p>
<p> , ,dirlist = os.listdir(fn)
</p>
<p> , ,dirlist.sort()
</p>
<p> , ,for a in dirlist:
</p>
<p> , , , ,if not os.path.isdir(a):
</p>
<p> , , , , , ,a = a.lower()
</p>
<p> , , , , , ,m = a.split(".")[-1]
</p>
<p> , , , , , ,if (m == "fb2"): # , , , , , , , , or (m == "zip")
</p>
<p> , , , , , , , ,a  = os.path.join(fn, a)
</p>
<p> , , , , , , , ,List.append(a+'\n')
</p>
<p>#--------------------------------------------------
</p>
<p>
</p>
<p>path = os.getcwd()
</p>
<p>
</p>
<p>parse_dir(path) # сканирование текущей папки
</p>
<p>print('Файлов извлечено '+str(Count))
</p>
<p>
</p>
<p>ScanDir(path)
</p>
<p>SaveList()
</p>
<p>print('ok??')
</p>
</section>
<section type="f">
<title><p>join_fb2m2.py</p></title>
<p>#!/usr/bin/env python
</p>
<p># -*- coding: utf-8 -*-
</p>
<p>import sys, os
</p>
<p># 18.01.22
</p>
<p>#--------------------------------------------------
</p>
<p>
</p>
<p>def SaveList():
</p>
<p> , ,f = open('lib.fb2', 'w', encoding="utf-8")
</p>
<p> , ,for i in Books:
</p>
<p> , , , ,f.write(i)#   'cp1251' '\n'
</p>
<p> , ,f.close()
</p>
<p>
</p>
<p>Books = []
</p>
<p>conutBooks = 0
</p>
<p>LAllNotes = []
</p>
<p>'''
</p>
<p>def AddNotes(LNotes):
</p>
<p> , ,if len(LNotes) &#62; 0:
</p>
<p> , , , ,f = open('Notes'+str(conutBooks)+'.txt', 'w', encoding="utf-8")
</p>
<p> , , , ,for i in LNotes:
</p>
<p> , , , , , ,i = i.replace('id="n','id="'+ str(conutBooks)+ '_n')
</p>
<p> , , , , , ,f.write(i)
</p>
<p> , , , ,f.close()
</p>
<p>'''
</p>
<p>def AddNotes(LNotes):
</p>
<p> , ,if len(LNotes) &#62; 0:
</p>
<p> , , , ,for i in LNotes:
</p>
<p> , , , , , ,i = i.replace('id="n','id="'+ str(conutBooks)+ '_n')
</p>
<p> , , , , , ,LAllNotes.append(i)
</p>
<p>
</p>
<p>def addFb2(fn, first):
</p>
<p> , ,global Books
</p>
<p> , ,global conutBooks
</p>
<p> , ,LList = []
</p>
<p> , ,sBook_title = ''
</p>
<p> , ,bBook_title = False
</p>
<p> , ,bWait_notes = False
</p>
<p> , ,bNotes = False
</p>
<p> , ,LNotes = []
</p>
<p> , ,conutBooks += 1
</p>
<p>
</p>
<p> , ,if os.path.isfile(nfile):
</p>
<p> , , , ,with open(fn, encoding="utf8") as f:
</p>
<p> , , , , , ,LList = f.readlines()
</p>
<p> , , , ,for i in LList:
</p>
<p> , , , , , ,if bNotes:
</p>
<p> , , , , , , , ,if i.find('&#60;/body')&#62; -1:
</p>
<p> , , , , , , , , , ,AddNotes(LNotes)
</p>
<p> , , , , , , , , , ,break
</p>
<p> , , , , , , , ,else:
</p>
<p> , , , , , , , , , ,LNotes.append(i)
</p>
<p> , , , , , , , ,continue
</p>
<p> , , , , , ,if bWait_notes:
</p>
<p> , , , , , , , ,if i.find('&#60;section')&#62; -1:
</p>
<p> , , , , , , , , , ,bNotes = True
</p>
<p> , , , , , , , , , ,LNotes.append(i)
</p>
<p> , , , , , , , ,if i.find('&#60;binary')&#62; -1:
</p>
<p> , , , , , , , , , ,break
</p>
<p> , , , , , , , ,continue
</p>
<p> , , , , , ,if not first: # 
</p>
<p> , , , , , , , ,if bBook_title:
</p>
<p> , , , , , , , , , ,n = i.find('&#60;/book-title')
</p>
<p> , , , , , , , , , ,if ( n == -1):
</p>
<p> , , , , , , , , , , , ,sBook_title = sBook_title + ' ' + i.strip()
</p>
<p> , , , , , , , , , , , ,continue
</p>
<p> , , , , , , , , , ,else:
</p>
<p> , , , , , , , , , , , ,sBook_title = sBook_title + ' ' + i[:n]
</p>
<p> , , , , , , , , , , , ,bBook_title = False
</p>
<p> , , , , , , , , , , , ,
</p>
<p> , , , , , , , ,n = i.find('&#60;book-title')
</p>
<p> , , , , , , , ,if n &#62; -1:
</p>
<p> , , , , , , , , , ,sBook_title = i[n+12:]
</p>
<p> , , , , , , , , , ,n = sBook_title.find('&#60;/book-title')
</p>
<p> , , , , , , , , , ,if n &#62; -1:
</p>
<p> , , , , , , , , , , , ,sBook_title = sBook_title[:n]
</p>
<p> , , , , , , , , , , , ,bBook_title = False
</p>
<p> , , , , , , , , , ,else:
</p>
<p> , , , , , , , , , , , ,sBook_title = sBook_title + ' ' + i.strip()
</p>
<p> , , , , , , , , , , , ,bBook_title = True
</p>
<p> , , , , , , , , , , , ,continue
</p>
<p> , , , , , , , ,n = i.find('&#60;body')
</p>
<p> , , , , , , , ,if n &#62; -1:
</p>
<p> , , , , , , , , , ,i = i[n:]
</p>
<p> , , , , , , , , , ,n = i.find('&#62;')
</p>
<p> , , , , , , , , , ,i = i[n+1:]
</p>
<p> , , , , , , , , , ,
</p>
<p> , , , , , , , , , ,Books.append('\n*%%%%%%%* '+str(conutBooks)+'\n')
</p>
<p> , , , , , , , , , ,#print('%%%%%%%')
</p>
<p> , , , , , , , , , ,bb = sBook_title.strip()
</p>
<p> , , , , , , , , , ,#print(bb)
</p>
<p> , , , , , , , , , ,Books.append('&#60;p&#62;'+bb+'\n&#60;/p&#62;')
</p>
<p> , , , , , , , , , ,Books.append(i)
</p>
<p> , , , , , , , , , ,first = True
</p>
<p> , , , , , ,else:
</p>
<p> , , , , , , , ,n = i.find('&#60;/body')
</p>
<p> , , , , , , , ,if n &#62; -1:
</p>
<p> , , , , , , , , , ,i = i[:n]
</p>
<p> , , , , , , , , , ,Books.append(i)
</p>
<p> , , , , , , , , , ,#break
</p>
<p> , , , , , , , , , ,bWait_notes = True
</p>
<p> , , , , , , , ,else:
</p>
<p> , , , , , , , , , ,if i.find('&#60;a ')&#62;-1:
</p>
<p> , , , , , , , , , , , ,i = i.replace('href="#','href="#'+ str(conutBooks)+ '_')
</p>
<p> , , , , , , , , , ,Books.append(i)
</p>
<p>
</p>
<p>#--------------------------------------------------
</p>
<p>
</p>
<p>nfile = "list.txt"
</p>
<p>first = True
</p>
<p>if os.path.isfile(nfile):   # encoding='cp1251'
</p>
<p>   with open(nfile, encoding="utf8") as f:
</p>
<p> , ,   Li = f.readlines()
</p>
<p>   for i in Li:
</p>
<p> , ,   addFb2(i.strip(), first)
</p>
<p> , ,   first = False
</p>
<p> , ,   
</p>
<p>Books.append('&#60;/body&#62;\n')
</p>
<p>if len(LAllNotes) &#62; 0:
</p>
<p> , ,Books.append('&#60;body name="notes"&#62;\n')
</p>
<p> , ,Books.append('&#60;title&#62;&#60;p&#62;Примечания&#60;/p&#62;&#60;/title&#62;\n')
</p>
<p> , ,for i in LAllNotes:
</p>
<p> , , , ,Books.append(i)
</p>
<p> , ,Books.append('&#60;/body&#62;\n')
</p>
<p> , ,
</p>
<p>Books.append('&#60;/FictionBook&#62;\n')# 
</p>
<p>SaveList()   
</p>
<p>
</p>
<p>print( 'Done!')
</p>
<p>
</p>
<p>
</p>
<p>
</p>
<p>
</p>
</section>
</section>
<section type="d">
<title><p>Other</p></title>
<section type="f">
<title><p>count_fb_z.py</p></title>
<p>#!/usr/bin/env python
</p>
<p># -*- codning: utf-8 -*-
</p>
<p>import sys, os
</p>
<p>import zipfile
</p>
<p>import xml.dom.minidom
</p>
<p># Подсчет числа секций и числа символов в fb2
</p>
<p>#----------------------------------------------
</p>
<p>path = os.getcwd()
</p>
<p>
</p>
<p>count_s = 0
</p>
<p>count_t = 0
</p>
<p>count_b = 0
</p>
<p>#-------------------------------------
</p>
<p>def sect(el):
</p>
<p> , ,global count_s
</p>
<p> , ,global count_t
</p>
<p> , ,childList=el.childNodes
</p>
<p> , ,for child in childList:
</p>
<p> , , , ,if child.nodeName == 'p':
</p>
<p> , , , , , ,text = child.childNodes[0].nodeValue
</p>
<p> , , , , , ,if text != None:
</p>
<p> , , , , , , , ,count_t += len(text)
</p>
<p> , , , ,if child.nodeName == 'section':
</p>
<p> , , , , , ,count_s += 1
</p>
<p> , , , , , ,sect(child)
</p>
<p>#---------------------------------------
</p>
<p>def parse_fb2(fn):
</p>
<p> , ,global count_b , , 
</p>
<p> , ,dom = xml.dom.minidom.parse(fn);
</p>
<p> , ,dom.normalize()
</p>
<p>
</p>
<p> , ,n_body=dom.getElementsByTagName("body")[0]
</p>
<p> , ,sect(n_body)
</p>
<p> , ,fb=dom.getElementsByTagName("FictionBook")[0]
</p>
<p> , ,childList=fb.childNodes
</p>
<p> , ,for child in childList:
</p>
<p># , , print(child.nodeName)
</p>
<p> , , , , if child.nodeName == 'binary':
</p>
<p> , , , , , ,text = child.childNodes[0].nodeValue
</p>
<p> , , , , , ,if text != None:
</p>
<p> , , , , , , , ,count_b += len(text)
</p>
<p>
</p>
<p>def MyPrint(adr):
</p>
<p> , ,print(adr)
</p>
<p> , ,print('section '+str(count_s))
</p>
<p> , ,print('text '+str(count_t))
</p>
<p> , ,print('pic '+str(count_b))
</p>
<p> , ,print('size file '+ str(os.path.getsize(adr)))
</p>
<p>
</p>
<p>def parse_zip(adr):
</p>
<p> , ,z = zipfile.ZipFile(adr, 'r')
</p>
<p> , ,filelist = z.namelist()
</p>
<p> , ,filelist.sort()
</p>
<p> , ,for n in filelist:
</p>
<p> , , , ,if n[-4:] == ".fb2":
</p>
<p> , , , , , ,parse_fb2(z.open(n))
</p>
<p>
</p>
<p>def parse_file(adr):
</p>
<p> , ,if not os.path.isfile(adr):
</p>
<p> , , , ,print('File not exists')
</p>
<p> , , , ,return
</p>
<p> , ,m = adr.split(".")
</p>
<p> , ,if (m[-1] == "zip") and (m[-2] == "fb2"):
</p>
<p> , , , ,  parse_zip(adr)
</p>
<p> , ,elif (m[-1] == "fb2"):
</p>
<p> , , , ,  parse_fb2(adr)
</p>
<p> , ,
</p>
<p>
</p>
<p>while True:
</p>
<p> , ,qu = input('Введите ')
</p>
<p># , ,qu = '6.fb2.zip'
</p>
<p> , ,a = os.path.join(path, qu)
</p>
<p> , ,parse_file(a)
</p>
<p> , ,MyPrint(a) , , , , , ,
</p>
<p> , ,print('OK!!!')
</p>
</section>
<section type="f">
<title><p>delbylist.py</p></title>
<p>#!/usr/bin/env python
</p>
<p># -*- coding: utf-8 -*-
</p>
<p>import sys, os
</p>
<p>
</p>
<p># 2 авг
</p>
<p># 
</p>
<p>#--------------------------------------------------
</p>
<p>L = []
</p>
<p>co = 0
</p>
<p>#--------------------------------------- , ,
</p>
<p>def LoadFile(fn, Li): # Загрузка из файла в список
</p>
<p> , ,if os.path.isfile(fn):
</p>
<p> , , , ,f = open(fn,'r')
</p>
<p> , , , ,for i in f:
</p>
<p> , , , , , ,Li.append(i)
</p>
<p> , , , ,f.close()
</p>
<p> , ,else:
</p>
<p> , , , ,print('I need '+ fn)
</p>
<p> , , , ,exit()
</p>
<p>#--------------------------------------
</p>
<p>def myDelFile(L):
</p>
<p> , ,global co
</p>
<p> , ,for i in L:
</p>
<p> , , , ,n = i.strip()
</p>
<p> , , , ,if os.path.isfile(n):
</p>
<p> , , , , , ,os.remove(n)
</p>
<p> , , , , , ,co += 1
</p>
<p> , , , ,else:
</p>
<p> , , , , , ,print(n)
</p>
<p>#----------------------------------------
</p>
<p>path = os.getcwd()
</p>
<p>ln = len(path) + 1
</p>
<p>#----------------------------------------
</p>
<p>LoadFile('ddel.txt', L)
</p>
<p>myDelFile(L)
</p>
<p>print( 'Done '+ str(co))
</p>
<p>
</p>
<p>
</p>
</section>
<section type="f">
<title><p>dir_fb2.py</p></title>
<p>#!/usr/bin/env python
</p>
<p># -*- coding: utf-8 -*-
</p>
<p>import sys, os
</p>
<p># конвертация папки с файлами в структуру fb2
</p>
<p>#--------------------------------------------------
</p>
<p>List = []
</p>
<p>#---
</p>
<p>def SaveList(fn, L):
</p>
<p> , ,f = open(fn, 'w', encoding="utf-8")
</p>
<p> , ,for i in L:
</p>
<p> , , , ,f.write(i)
</p>
<p> , ,f.close()
</p>
<p>
</p>
<p>#**************************************************
</p>
<p>
</p>
<p>def my_str(s):
</p>
<p> , ,s=s.replace('\t',' , ,')  
</p>
<p> , ,s=s.replace('    ',' , ,')
</p>
<p> , ,s=s.replace('**','&#38;#62;')# вставьте вместо ** символ "больше"
</p>
<p> , ,s=s.replace('**','&#38;#60;')# вставьте вместо ** символ "меньше"
</p>
<p> #   s = s.rstrip
</p>
<p> , ,s = '&#60;p&#62;' + s + '&#60;/p&#62;\n'
</p>
<p> , ,return s
</p>
<p> , ,
</p>
<p>def parse_file(ph):
</p>
<p> , ,global List
</p>
<p> , ,si = os.path.getsize(ph)
</p>
<p> , ,if si &#62; 0:
</p>
<p> , , , ,List.append('&#60;section type="f"&#62;\n') , , , ,
</p>
<p> , , , ,List.append('&#60;title&#62;&#60;p&#62;' + os.path.basename(ph)+ '&#60;/p&#62;&#60;/title&#62;\n')
</p>
<p> , , , ,f =open(ph, encoding="utf-8")
</p>
<p> , , , ,Li=f.readlines()
</p>
<p> , , , ,for i in Li:
</p>
<p> , , , , , ,s = my_str(i)
</p>
<p> , , , , , ,List.append(s)
</p>
<p> , , , ,f.close()
</p>
<p> , , , ,List.append('&#60;/section&#62;\n')
</p>
<p> , ,   
</p>
<p>def parse_dir(ph):
</p>
<p> , ,global List
</p>
<p> , ,dirlist = os.listdir(ph)
</p>
<p> , ,if len(dirlist) &#62; 0:
</p>
<p> , , , ,List.append('&#60;section type="d"&#62;\n') , , , ,
</p>
<p> , , , ,List.append('&#60;title&#62;&#60;p&#62;' + os.path.basename(ph)+ '&#60;/p&#62;&#60;/title&#62;\n')
</p>
<p> , , , ,
</p>
<p>  # , ,  dirlist.sort()
</p>
<p> , , , ,for i in dirlist:
</p>
<p> , , , , , ,m = os.path.join(ph, i)
</p>
<p> , , , , , ,if os.path.isdir(m):
</p>
<p> , , , , , , , ,parse_dir(m)
</p>
<p> , , , , , ,else:
</p>
<p> , , , , , , , ,parse_file(m)
</p>
<p> , , , ,List.append('&#60;/section&#62;\n')
</p>
<p> 
</p>
<p>def GetHead(myFile):
</p>
<p> , ,global List
</p>
<p> , ,f =open(myFile, encoding="utf-8")
</p>
<p> , ,Li=f.readlines()
</p>
<p> , ,for i in Li:
</p>
<p> , , , ,List.append(i)
</p>
<p> , ,f.close()
</p>
<p>
</p>
<p>#----------------------------------------
</p>
<p>
</p>
<p>path = os.getcwd()
</p>
<p>folder = 'Arc'
</p>
<p>
</p>
<p>if not os.path.isdir(folder):
</p>
<p> , ,sys.exit(folder + ' - does not exist')
</p>
<p>myFolder = os.path.join(path, folder)
</p>
<p>myFile = os.path.join(myFolder, 'head.txt')
</p>
<p>if os.path.isfile(myFile):
</p>
<p> , ,GetHead(myFile)
</p>
<p>List.append('\n&#60;section type="d"&#62;\n')
</p>
<p>List.append('&#60;title&#62;&#60;p&#62;'+folder)
</p>
<p>List.append('&#60;/p&#62;&#60;/title&#62;\n')
</p>
<p>myFile = os.path.join(myFolder, 'list.txt')
</p>
<p>if os.path.isfile(myFile):
</p>
<p> , ,f =open(myFile, encoding="utf-8")
</p>
<p> , ,Li=f.readlines()
</p>
<p> , ,for i in Li:
</p>
<p> , , , ,i = i.strip()
</p>
<p> , , , ,if i == '':
</p>
<p> , , , , , ,continue
</p>
<p> , , , ,m = os.path.join(myFolder, i)
</p>
<p> , , , ,if os.path.isdir(m):
</p>
<p> , , , , , ,parse_dir(m)
</p>
<p> , , , ,else:
</p>
<p> , , , , , ,if os.path.isfile(m):
</p>
<p> , , , , , , , ,parse_file(m) , , , ,
</p>
<p> , ,f.close()
</p>
<p> 
</p>
<p>List.append('&#60;/section&#62;\n')
</p>
<p>List.append('&#60;/body&#62;')
</p>
<p>List.append('&#60;/FictionBook&#62;') 
</p>
<p>
</p>
<p>SaveList('fb.fb2', List)
</p>
<p>
</p>
<p>print( 'Done!')
</p>
<p>
</p>
<p>
</p>
</section>
<section type="f">
<title><p>fb2err_file.py</p></title>
<p>#!/usr/bin/env python
</p>
<p># -*- codning: utf-8 -*-
</p>
<p>import sys, os
</p>
<p>
</p>
<p># проверка структуры файла fb2
</p>
<p>#----------------------------------------------
</p>
<p>file  = 'mesto_pod_solncem.fb2'
</p>
<p>count = 0 #  счетчик строк
</p>
<p>flag = False # признак анализа тега
</p>
<p>S = '' # место для обработанного тега
</p>
<p>Tag = '' # место для тега
</p>
<p>L = [] # стек
</p>
<p>'''
</p>
<p>with open(file, encoding="utf8") as f:
</p>
<p> , ,LList = f.readlines()
</p>
<p>for i in LList:
</p>
<p> , ,count += 1
</p>
<p> , ,if i.find('section') &#62; -1:
</p>
<p> , , , ,print(count)
</p>
<p> , , , ,print(i)
</p>
<p>f.close()
</p>
<p>'''
</p>
<p>count = 0 #  счетчик строк
</p>
<p>
</p>
<p>f = open(file, 'rb') # комментарий ниже
</p>
<p>d = f.read()
</p>
<p>for n in d:
</p>
<p> , ,if n == 10: # символ завершения строки
</p>
<p> , , , ,count += 1 # + в счетчик строк
</p>
<p> , ,elif chr(n) == '&#60;': # начало тега
</p>
<p> , , , ,flag = True
</p>
<p> , , , ,Tag = '' # подготовка места для тега
</p>
<p> , ,else:
</p>
<p> , , , ,if flag: # читаем тег
</p>
<p> , , , , , ,if chr(n) == '&#62;': # провека на конец тега, если да:
</p>
<p> , , , , , , , ,S = Tag.split(' ')[0] # отбрасывание возможных параметров
</p>
<p> , , , , , , , ,flag = False
</p>
<p> , , , , , , , ,if S[0] == '/': # проверка на закрывающий тег
</p>
<p> , , , , , , , , , ,S = S[1:] # удаление слеша
</p>
<p> , , , , , , , , , ,Lo = L.pop() # чтение из стека
</p>
<p> , , , , , , , , , ,if Lo[0] != S: # сообщение об ошибке
</p>
<p> , , , , , , , , , , , ,print('Teg = "'+Lo[0]+'" begin in str = '+ str(Lo[1]+1))
</p>
<p> , , , , , , , , , , , ,print('Не соответствует')
</p>
<p> , , , , , , , , , , , ,print('Teg ="' +S+ '"end in str = '+ str(count +1))
</p>
<p> , , , , , , , , , , , ,f.close()
</p>
<p> , , , , , , , , , , , ,sys.exit()
</p>
<p> , , , , , , , ,else:
</p>
<p> , , , , , , , , if Tag[-1] != '/': # обработка одинарных тегов
</p>
<p> , , , , , , , , , , Lo = [S, count] # подготовка для записи в стек
</p>
<p> , , , , , , , , , , L.append(Lo) # запись в стек
</p>
<p> , , , , , ,else:
</p>
<p> , , , , , , , ,Tag = Tag + chr(n) # добавление символа к тегу
</p>
<p>f.close()
</p>
<p>
</p>
<p>print('OK!!!') # сообщение об удачной проверке.
</p>
</section>
<section type="f">
<title><p>rename2number.py</p></title>
<p>#!/usr/bin/env python
</p>
<p># -*- coding: utf-8 -*-
</p>
<p>import sys, os
</p>
<p># 7 avg
</p>
<p># Переименование всех файлов в цифру
</p>
<p>#---------------------------------------
</p>
<p>count = 0
</p>
<p>pref  = '' # при желании вставить префикс к имени файла
</p>
<p>#---------------------------------------
</p>
<p>def rename_fb2(old, ph):
</p>
<p> , ,global count
</p>
<p> , ,count +=1
</p>
<p># вставить проверку существования файла с выбором следующего имени файла
</p>
<p> , ,os.rename(old,os.path.join(ph, pref + str(count)+'.fb2'))
</p>
<p>#---------------------------------------
</p>
<p>def rename_zip(old, ph):
</p>
<p> , ,global count
</p>
<p> , ,count +=1
</p>
<p># вставить проверку существования файла с выбором следующего имени файла
</p>
<p> , ,os.rename(old,os.path.join(ph, pref + str(count)+'.fb2.zip'))
</p>
<p>
</p>
<p>#---------------------------------------
</p>
<p>def rename_file(adr, ph):
</p>
<p> , ,m = adr.split(".")
</p>
<p> , ,if (m[-1] == "zip") and (m[-2] == "fb2"):
</p>
<p> , , , ,  rename_zip(adr, ph)
</p>
<p> , ,elif (m[-1] == "fb2"):
</p>
<p> , , , ,  rename_fb2(adr, ph)
</p>
<p>#---------------------------------------
</p>
<p>def scan_dir(ph):
</p>
<p> , ,global L
</p>
<p> , ,dirlist = os.listdir(ph)
</p>
<p> , ,dirlist.sort()
</p>
<p> , ,for i in dirlist:
</p>
<p> , , , ,adr = os.path.join(ph, i)
</p>
<p> , , , ,if os.path.isdir(adr):
</p>
<p> , , , , , ,scan_dir(adr)
</p>
<p> , , , ,else:
</p>
<p> , , , , , ,rename_file(adr, ph)
</p>
<p>
</p>
<p>#********************************************************
</p>
<p>path = os.getcwd()
</p>
<p>scan_dir(path)
</p>
<p> , ,
</p>
<p>print( 'Done!')
</p>
</section>
</section>
<section type="f">
<title><p>script_con.txt</p></title>
<p>
</p>
<p>3. Поехали
</p>
<p>в папке "3":
</p>
<p>
</p>
<p>* spas2.py - скрипт замены отступов точками
</p>
<p>* _my_zip.py - Упаковка файлов fb2 в архивы zip
</p>
<p>
</p>
<p>?? упорядоченный список имен файлов книг
</p>
<p>
</p>
<p>5. Пасьянс из fb2
</p>
<p>в папке "5": 
</p>
<p>* main_ok.py - раскладка файлов fb2 по папкам
</p>
<p>
</p>
<p>6. Ремонт fb2
</p>
<p>в папке "6":
</p>
<p>1. * fb2err4.py - проверка структуры файла fb2
</p>
<p>2. * fb2errors.py - составление списка книг с повреждением структуры (проверяется заданная папка и вложения)
</p>
<p>3. * moveIn.py - перемещение файлов по списку в рабочую папку
</p>
<p>4. * moveOut.py - перемещение файлов по списку из рабочей папки по местам жительства
</p>
<p>5. * un_zip.py - распаковка
</p>
<p>
</p>
<p>7. Вне плана
</p>
<p>в папке "7":
</p>
<p>0. utf8-1251.py - перекодировка файла (нужен для скрипта str2parag.py)
</p>
<p>1. str2parag.py - сборка абзацев из разрозненных строк
</p>
<p>2. j_par.py - Объединение абзацев (версия 10.10.21)
</p>
<p>3. perenos.py - Объединение абзацев разде-
</p>
<p> , , , , , ,   |# разделенных переносами
</p>
<p>
</p>
<p>8. Image
</p>
<p>В папке "8 Images":
</p>
<p>* base64_pic.py - получение рисунка из fb2;
</p>
<p>* del_pic.py - удаление из fb2.zip всех рисунков
</p>
<p>* pic_base64.py - кодирование рисунка для вставки в fb2
</p>
<p>
</p>
<p>9. Без базы
</p>
<p>Приложение: Файл "ganres.py" - считаю не актуальным и выкладывать не буду
</p>
<p>
</p>
<p>10. Сканирование библиотеки
</p>
<p>
</p>
<p>В папке "10":  поиск файлов одинаковых по размеру и содержимому
</p>
<p>* Mer.py - # поиск одинаковых файлов 'zip'#'fb2'#'txt'#'mp4'#'gif'#'jpg'
</p>
<p>* del_empty_dir.py - Удаление пустых папок
</p>
<p>* scan7i.py -
</p>
<p>scan_lib.py Скрипт для записи библиотеки в "небазу"
</p>
<p>
</p>
<p>12. Использование 2 ( набор скриптов для поиска двойников)
</p>
<p>tree.py изготовление файла содержащего все адреса файлов в текущей папке
</p>
<p>dubl_books.py Ручная сортировка дубликатов в "небазе" (вторая версия)
</p>
<p>
</p>
<p>13. Трупы в библиотеке
</p>
<p>deadBooks.py поиск книг содержащихся в небазе, но не существующих физически
</p>
<p>MarkDelBook.py изменение оценки на метку "удаленная книга"
</p>
<p>
</p>
<p>14. Сортировка по авторам
</p>
<p>sortbyauthor.py сортировка книг по авторам
</p>
<p>
</p>
<p>16. Объединение
</p>
<p>в папке "16 Obedinenie":
</p>
<p>* fb2_list.py # Извлечение из архивов в папке # Изготовление списка книг в текущей папке
</p>
<p>* join_fb2.py # объединение fb2 файлов перечисленных в файле list.txt
</p>
<p>
</p>
<p>-------------------------------------------
</p>
<p>
</p>
<p>В папке "Other":
</p>
<p>count_fb_z.py - Подсчет числа секций и числа символов в fb2
</p>
<p>* delbylist.py - удаление файлов по списку заданному в файле 'delfiles.txt' !Внимание! применять осмысленно!
</p>
<p>* rename2number.py - захотелось переименовать файлы с книгами в виде "1.fb2; 2.fb2; ... 203456.fb2" !Внимание! применять осмысленно!
</p>
<p>* dir_fb2.py - преобразование заданной папки и ее содержимого в файл fb2
</p>
<p>
</p>
</section>
</section>
</body></FictionBook>