Arch

read_me.txt

Здравствуйте.

Данный файл является приложением к опусу «Python в библиотеке». Здесь собраны основные скрипты упомянутые в учебнике.

Основная «фишка» данного текста такая: «легким движением» выполнения скрипта «fb2_dir.py» содержимое этого файла скопируется в папки и файлы со скриптами.

Т.е. при успешном выполнении нижеследующих действий в Вашем распоряжении появятся исходные коды скриптов.

Действия следующие:

1. любым способом скопируйте скрипт «fb2_dir.py» из файла fb2 в отдельный файл.

2. замените блоки « , ,» на блок из четырех пробелов.

3. поместите данный файл и скрипт «fb2_dir.py» в отдельную папку (желательно).

4. запустите скрипт. Если все сделано правильно, появится папка с исходниками

5. вполне разумно ВЫ можете опасаться злонамеренных действий ужасного хакера w_cat.

Предварительно внимательно проверьте предлагаемые скрипты, от этого все только выиграют.

w_cat

PS

Да, ежели не будет протестов от читателей, я намереваюсь регулярно обновлять этот файл, пополняя и исправляя его содержимое.

13.07.2022

fb2_dir.py

#!/usr/bin/env python

# -*- coding: utf-8 -*-

import sys, os

# преобразование файла fb2 в каталог с папками и файлами

#--------------------------------------------------

stack = []

List = []

#---

def SaveList(fn, L):

, ,f = open(fn, 'w', encoding="utf-8")

, ,for i in L:

, , , ,f.write(my_str(i))

, ,f.close()

def my_str(s):

, ,s=s.replace(' , ,',' ')

, ,s=s.replace('>','**')# вставьте вместо ** символ "больше"

, ,s=s.replace('<','**')# вставьте вместо ** символ "меньше"

, ,return s

#----------------------------------------

path = os.getcwd()

cur_dir = path

fb2_file = 'fb.fb2'

if not os.path.isfile(fb2_file):

, ,sys.exit(fb2_file + ' - does not exist')

folder = False

text_f = False

Other = False

f =open(fb2_file, encoding="utf-8")

Li=f.readlines()

for i in Li:

, ,if Other:

, , , ,if i.find('

, , , , , ,Other = False

, , , ,continue

, ,if text_f:

, , , ,if i.find('

, , , , , ,text_f = False

, , , , , ,SaveList(file_name, List)

, , , ,elif i.find('')==0: </p> <p> , , , , , ,s = i[10:-13] </p> <p> , , , , , ,file_name = os.path.join(cur_dir, s) </p> <p> , , , ,elif i.find('</p>')>-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('<title>')==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('<section')==0: </p> <p> , , , ,if i.find('type="d"')> -1: </p> <p> , , , , , ,folder = True </p> <p> , , , ,else: </p> <p> , , , , , ,if i.find('type="f"')> -1: </p> <p> , , , , , , , ,text_f = True </p> <p> , , , , , , , ,List.clear() </p> <p> </p> <p> , ,if i.find('</section')==0: </p> <p> , , , ,if len(stack)>0: </p> <p> , , , , , ,stack.pop(0) </p> <p> , , , , , ,if len(stack)>0: </p> <p> , , , , , , , ,cur_dir = stack[0] </p> <p> </p> <p>print( 'Done!') </p> <p> Конец скрипта fb2_dir.py </p> <p> </p> </section> <section> <h3 id='4'><span>3</span></h3> <section> <h3 id='5'><span>spas2.py</span></h3> <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 => Ctrl + C </p> </section> <section> <h3 id='6'><span>_my_zip.py</span></h3> <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 => ' + str(co)) </p> <p>print ('Done!') </p> </section> </section> <section> <h3 id='7'><span>5</span></h3> <section> <h3 id='8'><span>main_ok.py</span></h3> <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 < wList: </p> <p> , , , , , ,maxW = cur </p> <p> , , , ,else: </p> <p> , , , , , ,minW = cur </p> <p> , , , ,if maxW - minW == 1: </p> <p> , , , , , ,if s1 > 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 >> 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 >> 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) > 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) > 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> <h3 id='9'><span>6</span></h3> <section> <h3 id='10'><span>fb2err4.py</span></h3> <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') > -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) == '<': # начало тега </p> <p> , , , , , ,flag = True </p> <p> , , , , , ,Tag = '' # подготовка места для тега </p> <p> , , , ,else: </p> <p> , , , , , ,if flag: # читаем тег </p> <p> , , , , , , , ,if chr(n) == '>': # провека на конец тега, если да: </p> <p> , , , , , , , , , ,S = Tag.split(' ')[0] # отбрасывание возможных параметров </p> <p> , , , , , , , , , ,flag = False </p> <p> , , , , , , , , , ,if S[0] == '/': # проверка на закрывающий тег </p> <p> , , , , , , , , , , , ,Tagss.append(str(count)+' <'+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)+' <'+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> <h3 id='11'><span>fb2errors.py</span></h3> <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) == '<': # начало тега </p> <p> , , , , , ,flag = True </p> <p> , , , , , ,Tag = '' # подготовка места для тега </p> <p> , , , ,else: </p> <p> , , , , , ,if flag: # читаем тег </p> <p> , , , , , , , ,if chr(n) == '>': # провека на конец тега, если да: </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) > 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) > 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> <h3 id='12'><span>moveIn.py</span></h3> <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> <h3 id='13'><span>moveOut.py</span></h3> <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> <h3 id='14'><span>un_zip.py</span></h3> <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) > 0: </p> <p> , , , , , , , ,parse_file(a) </p> <p>#------------------------- </p> <p> </p> <p>parse_dir(path) # сканирование текущей папки </p> <p>print('Файлов извлечено '+str(Count)) </p> </section> </section> <section> <h3 id='15'><span>7</span></h3> <section> <h3 id='16'><span>j_par.py</span></h3> <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 >= 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 > 1071 and m < 1104) or m == 44: # от "а" до "я" + "," </p> <p> , , , ,if i+1 >= 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 > 1071 and m < 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> <h3 id='17'><span>perenos.py</span></h3> <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 > 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 > 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> <h3 id='18'><span>str2parag.py</span></h3> <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 > 223) and (n < 256)) or (n==44) or (n==45) </p> <p>def RusBukva2(n): # обработка буквы «после» </p> <p> , ,return ((n > 223) and (n < 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 > 191) and (m < 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> <h3 id='19'><span>utf8-1251.py</span></h3> <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> <h3 id='20'><span>8 Images</span></h3> <section> <h3 id='21'><span>base64_pic.py</span></h3> <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) == '<': </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) == '<': # начало тега </p> <p> , , , , , , </p> <p> , , , , , ,flag = True </p> <p> , , , , , ,Tag = '' </p> <p> , , , ,else: </p> <p> , , , , , ,if flag: </p> <p> , , , , , , , ,if chr(n) == '>': </p> <p> , , , , , , , , , , </p> <p> , , , , , , , , , ,flag = False </p> <p> , , , , , , , , , ,if Tag.find('binary')> -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> <h3 id='22'><span>del_pic.py</span></h3> <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('<binary')>=0): </p> <p> , , , , , , , ,if (i.find(cover)>=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('</binary')>=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> <h3 id='23'><span>pic_base64.py</span></h3> <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('<binary id="'+fn+'" content-type="image/jpg">'+'\n') </p> <p> , ,f.write(base64_message+'\n') </p> <p> , ,f.write('</binary>'+'\n\n') </p> <p> , ,f.close() </p> <p># осталось сделать: </p> <p># 1. определение типа файла </p> <p># , ,и изменение content-type в соответствии с типом. </p> <p># 2. упаковку группы файлов. </p> </section> </section> <section> <h3 id='24'><span>10</span></h3> <section> <h3 id='25'><span>del_empty_dir.py</span></h3> <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> <h3 id='26'><span>Mer.py</span></h3> <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) > 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) > 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) > 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 > 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+' -> '+str(co)) </p> </section> <section> <h3 id='27'><span>same_fb2.py</span></h3> <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> <h3 id='28'><span>scan7i.py</span></h3> <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 = [('\\', '_'),('/', '_'),(':', '_'),('*', '_'),('?', '_'),('"', '_'),('<', '_'), ('>', '_'), ('|', '_')] </p> <p>#-------------------------------------------------- </p> <p>def SaveList(fn, L, cco): </p> <p> , ,if cco > 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) > 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># \ / : * ? " < > | </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 > 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) > 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> <h3 id='29'><span>12</span></h3> <section> <h3 id='30'><span>dead_books.py</span></h3> <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 = [('\\', '_'),('/', '_'),(':', '_'),('*', '_'),('?', '_'),('"', '_'),('<', '_'), ('>', '_'), ('|', '_')] </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) > -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|')>0) or (Books[i-1].find('|Z|')>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> <h3 id='31'><span>dead_books2.2.py</span></h3> <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) > 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 = [('\\', '_'),('/', '_'),(':', '_'),('*', '_'),('?', '_'),('"', '_'),('<', '_'), ('>', '_'), ('|', '_')] </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) > -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|')>0) or (Books[i-1].find('|Z|')>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> <h3 id='32'><span>dubl_auto.py</span></h3> <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 = [('\\', '_'),('/', '_'),(':', '_'),('*', '_'),('?', '_'),('"', '_'),('<', '_'), ('>', '_'), ('|', '_')] </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) > -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) > 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> <h3 id='33'><span>tree.py</span></h3> <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> <h3 id='34'><span>tree2.py</span></h3> <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> <h3 id='35'><span>16 Obedinenie</span></h3> <section> <h3 id='36'><span>fb2_list.py</span></h3> <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) > 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> <h3 id='37'><span>join_fb2m2.py</span></h3> <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) > 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) > 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('</body')> -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('<section')> -1: </p> <p> , , , , , , , , , ,bNotes = True </p> <p> , , , , , , , , , ,LNotes.append(i) </p> <p> , , , , , , , ,if i.find('<binary')> -1: </p> <p> , , , , , , , , , ,break </p> <p> , , , , , , , ,continue </p> <p> , , , , , ,if not first: # </p> <p> , , , , , , , ,if bBook_title: </p> <p> , , , , , , , , , ,n = i.find('</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('<book-title') </p> <p> , , , , , , , ,if n > -1: </p> <p> , , , , , , , , , ,sBook_title = i[n+12:] </p> <p> , , , , , , , , , ,n = sBook_title.find('</book-title') </p> <p> , , , , , , , , , ,if n > -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('<body') </p> <p> , , , , , , , ,if n > -1: </p> <p> , , , , , , , , , ,i = i[n:] </p> <p> , , , , , , , , , ,n = i.find('>') </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('<p>'+bb+'\n</p>') </p> <p> , , , , , , , , , ,Books.append(i) </p> <p> , , , , , , , , , ,first = True </p> <p> , , , , , ,else: </p> <p> , , , , , , , ,n = i.find('</body') </p> <p> , , , , , , , ,if n > -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('<a ')>-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('</body>\n') </p> <p>if len(LAllNotes) > 0: </p> <p> , ,Books.append('<body name="notes">\n') </p> <p> , ,Books.append('<title><p>Примечания</p>\n')

, ,for i in LAllNotes:

, , , ,Books.append(i)

, ,Books.append('\n')

, ,

Books.append('\n')#

SaveList()

print( 'Done!')

Other

count_fb_z.py

#!/usr/bin/env python

# -*- codning: utf-8 -*-

import sys, os

import zipfile

import xml.dom.minidom

# Подсчет числа секций и числа символов в fb2

#----------------------------------------------

path = os.getcwd()

count_s = 0

count_t = 0

count_b = 0

#-------------------------------------

def sect(el):

, ,global count_s

, ,global count_t

, ,childList=el.childNodes

, ,for child in childList:

, , , ,if child.nodeName == 'p':

, , , , , ,text = child.childNodes[0].nodeValue

, , , , , ,if text != None:

, , , , , , , ,count_t += len(text)

, , , ,if child.nodeName == 'section':

, , , , , ,count_s += 1

, , , , , ,sect(child)

#---------------------------------------

def parse_fb2(fn):

, ,global count_b , ,

, ,dom = xml.dom.minidom.parse(fn);

, ,dom.normalize()

, ,n_body=dom.getElementsByTagName("body")[0]

, ,sect(n_body)

, ,fb=dom.getElementsByTagName("FictionBook")[0]

, ,childList=fb.childNodes

, ,for child in childList:

# , , print(child.nodeName)

, , , , if child.nodeName == 'binary':

, , , , , ,text = child.childNodes[0].nodeValue

, , , , , ,if text != None:

, , , , , , , ,count_b += len(text)

def MyPrint(adr):

, ,print(adr)

, ,print('section '+str(count_s))

, ,print('text '+str(count_t))

, ,print('pic '+str(count_b))

, ,print('size file '+ str(os.path.getsize(adr)))

def parse_zip(adr):

, ,z = zipfile.ZipFile(adr, 'r')

, ,filelist = z.namelist()

, ,filelist.sort()

, ,for n in filelist:

, , , ,if n[-4:] == ".fb2":

, , , , , ,parse_fb2(z.open(n))

def parse_file(adr):

, ,if not os.path.isfile(adr):

, , , ,print('File not exists')

, , , ,return

, ,m = adr.split(".")

, ,if (m[-1] == "zip") and (m[-2] == "fb2"):

, , , , parse_zip(adr)

, ,elif (m[-1] == "fb2"):

, , , , parse_fb2(adr)

, ,

while True:

, ,qu = input('Введите ')

# , ,qu = '6.fb2.zip'

, ,a = os.path.join(path, qu)

, ,parse_file(a)

, ,MyPrint(a) , , , , , ,

, ,print('OK!!!')

delbylist.py

#!/usr/bin/env python

# -*- coding: utf-8 -*-

import sys, os

# 2 авг

#

#--------------------------------------------------

L = []

co = 0

#--------------------------------------- , ,

def LoadFile(fn, Li): # Загрузка из файла в список

, ,if os.path.isfile(fn):

, , , ,f = open(fn,'r')

, , , ,for i in f:

, , , , , ,Li.append(i)

, , , ,f.close()

, ,else:

, , , ,print('I need '+ fn)

, , , ,exit()

#--------------------------------------

def myDelFile(L):

, ,global co

, ,for i in L:

, , , ,n = i.strip()

, , , ,if os.path.isfile(n):

, , , , , ,os.remove(n)

, , , , , ,co += 1

, , , ,else:

, , , , , ,print(n)

#----------------------------------------

path = os.getcwd()

ln = len(path) + 1

#----------------------------------------

LoadFile('ddel.txt', L)

myDelFile(L)

print( 'Done '+ str(co))

dir_fb2.py

#!/usr/bin/env python

# -*- coding: utf-8 -*-

import sys, os

# конвертация папки с файлами в структуру fb2

#--------------------------------------------------

List = []

#---

def SaveList(fn, L):

, ,f = open(fn, 'w', encoding="utf-8")

, ,for i in L:

, , , ,f.write(i)

, ,f.close()

#**************************************************

def my_str(s):

, ,s=s.replace('\t',' , ,')

, ,s=s.replace(' ',' , ,')

, ,s=s.replace('**','>')# вставьте вместо ** символ "больше"

, ,s=s.replace('**','<')# вставьте вместо ** символ "меньше"

# s = s.rstrip

, ,s = '

' + s + '

\n'

, ,return s

, ,

def parse_file(ph):

, ,global List

, ,si = os.path.getsize(ph)

, ,if si > 0:

, , , ,List.append('

\n') , , , ,

, , , ,List.append('<p>' + os.path.basename(ph)+ '</p>\n')

, , , ,f =open(ph, encoding="utf-8")

, , , ,Li=f.readlines()

, , , ,for i in Li:

, , , , , ,s = my_str(i)

, , , , , ,List.append(s)

, , , ,f.close()

, , , ,List.append('

\n')

, ,

def parse_dir(ph):

, ,global List

, ,dirlist = os.listdir(ph)

, ,if len(dirlist) > 0:

, , , ,List.append('

\n') , , , ,

, , , ,List.append('<p>' + os.path.basename(ph)+ '</p>\n')

, , , ,

# , , dirlist.sort()

, , , ,for i in dirlist:

, , , , , ,m = os.path.join(ph, i)

, , , , , ,if os.path.isdir(m):

, , , , , , , ,parse_dir(m)

, , , , , ,else:

, , , , , , , ,parse_file(m)

, , , ,List.append('

\n')

def GetHead(myFile):

, ,global List

, ,f =open(myFile, encoding="utf-8")

, ,Li=f.readlines()

, ,for i in Li:

, , , ,List.append(i)

, ,f.close()

#----------------------------------------

path = os.getcwd()

folder = 'Arc'

if not os.path.isdir(folder):

, ,sys.exit(folder + ' - does not exist')

myFolder = os.path.join(path, folder)

myFile = os.path.join(myFolder, 'head.txt')

if os.path.isfile(myFile):

, ,GetHead(myFile)

List.append('\n

\n')

List.append('<p>'+folder) </p> <p>List.append('</p>\n')

myFile = os.path.join(myFolder, 'list.txt')

if os.path.isfile(myFile):

, ,f =open(myFile, encoding="utf-8")

, ,Li=f.readlines()

, ,for i in Li:

, , , ,i = i.strip()

, , , ,if i == '':

, , , , , ,continue

, , , ,m = os.path.join(myFolder, i)

, , , ,if os.path.isdir(m):

, , , , , ,parse_dir(m)

, , , ,else:

, , , , , ,if os.path.isfile(m):

, , , , , , , ,parse_file(m) , , , ,

, ,f.close()

List.append('

\n')

List.append('')

List.append('')

SaveList('fb.fb2', List)

print( 'Done!')

fb2err_file.py

#!/usr/bin/env python

# -*- codning: utf-8 -*-

import sys, os

# проверка структуры файла fb2

#----------------------------------------------

file = 'mesto_pod_solncem.fb2'

count = 0 # счетчик строк

flag = False # признак анализа тега

S = '' # место для обработанного тега

Tag = '' # место для тега

L = [] # стек

'''

with open(file, encoding="utf8") as f:

, ,LList = f.readlines()

for i in LList:

, ,count += 1

, ,if i.find('section') > -1:

, , , ,print(count)

, , , ,print(i)

f.close()

'''

count = 0 # счетчик строк

f = open(file, '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] == '/': # проверка на закрывающий тег

, , , , , , , , , ,S = S[1:] # удаление слеша

, , , , , , , , , ,Lo = L.pop() # чтение из стека

, , , , , , , , , ,if Lo[0] != S: # сообщение об ошибке

, , , , , , , , , , , ,print('Teg = "'+Lo[0]+'" begin in str = '+ str(Lo[1]+1))

, , , , , , , , , , , ,print('Не соответствует')

, , , , , , , , , , , ,print('Teg ="' +S+ '"end in str = '+ str(count +1))

, , , , , , , , , , , ,f.close()

, , , , , , , , , , , ,sys.exit()

, , , , , , , ,else:

, , , , , , , , if Tag[-1] != '/': # обработка одинарных тегов

, , , , , , , , , , Lo = [S, count] # подготовка для записи в стек

, , , , , , , , , , L.append(Lo) # запись в стек

, , , , , ,else:

, , , , , , , ,Tag = Tag + chr(n) # добавление символа к тегу

f.close()

print('OK!!!') # сообщение об удачной проверке.

rename2number.py

#!/usr/bin/env python

# -*- coding: utf-8 -*-

import sys, os

# 7 avg

# Переименование всех файлов в цифру

#---------------------------------------

count = 0

pref = '' # при желании вставить префикс к имени файла

#---------------------------------------

def rename_fb2(old, ph):

, ,global count

, ,count +=1

# вставить проверку существования файла с выбором следующего имени файла

, ,os.rename(old,os.path.join(ph, pref + str(count)+'.fb2'))

#---------------------------------------

def rename_zip(old, ph):

, ,global count

, ,count +=1

# вставить проверку существования файла с выбором следующего имени файла

, ,os.rename(old,os.path.join(ph, pref + str(count)+'.fb2.zip'))

#---------------------------------------

def rename_file(adr, ph):

, ,m = adr.split(".")

, ,if (m[-1] == "zip") and (m[-2] == "fb2"):

, , , , rename_zip(adr, ph)

, ,elif (m[-1] == "fb2"):

, , , , rename_fb2(adr, ph)

#---------------------------------------

def scan_dir(ph):

, ,global L

, ,dirlist = os.listdir(ph)

, ,dirlist.sort()

, ,for i in dirlist:

, , , ,adr = os.path.join(ph, i)

, , , ,if os.path.isdir(adr):

, , , , , ,scan_dir(adr)

, , , ,else:

, , , , , ,rename_file(adr, ph)

#********************************************************

path = os.getcwd()

scan_dir(path)

, ,

print( 'Done!')

script_con.txt

3. Поехали

в папке "3":

* spas2.py - скрипт замены отступов точками

* _my_zip.py - Упаковка файлов fb2 в архивы zip

?? упорядоченный список имен файлов книг

5. Пасьянс из fb2

в папке "5":

* main_ok.py - раскладка файлов fb2 по папкам

6. Ремонт fb2

в папке "6":

1. * fb2err4.py - проверка структуры файла fb2

2. * fb2errors.py - составление списка книг с повреждением структуры (проверяется заданная папка и вложения)

3. * moveIn.py - перемещение файлов по списку в рабочую папку

4. * moveOut.py - перемещение файлов по списку из рабочей папки по местам жительства

5. * un_zip.py - распаковка

7. Вне плана

в папке "7":

0. utf8-1251.py - перекодировка файла (нужен для скрипта str2parag.py)

1. str2parag.py - сборка абзацев из разрозненных строк

2. j_par.py - Объединение абзацев (версия 10.10.21)

3. perenos.py - Объединение абзацев разде-

, , , , , , |# разделенных переносами

8. Image

В папке "8 Images":

* base64_pic.py - получение рисунка из fb2;

* del_pic.py - удаление из fb2.zip всех рисунков

* pic_base64.py - кодирование рисунка для вставки в fb2

9. Без базы

Приложение: Файл "ganres.py" - считаю не актуальным и выкладывать не буду

10. Сканирование библиотеки

В папке "10": поиск файлов одинаковых по размеру и содержимому

* Mer.py - # поиск одинаковых файлов 'zip'#'fb2'#'txt'#'mp4'#'gif'#'jpg'

* del_empty_dir.py - Удаление пустых папок

* scan7i.py -

scan_lib.py Скрипт для записи библиотеки в "небазу"

12. Использование 2 ( набор скриптов для поиска двойников)

tree.py изготовление файла содержащего все адреса файлов в текущей папке

dubl_books.py Ручная сортировка дубликатов в "небазе" (вторая версия)

13. Трупы в библиотеке

deadBooks.py поиск книг содержащихся в небазе, но не существующих физически

MarkDelBook.py изменение оценки на метку "удаленная книга"

14. Сортировка по авторам

sortbyauthor.py сортировка книг по авторам

16. Объединение

в папке "16 Obedinenie":

* fb2_list.py # Извлечение из архивов в папке # Изготовление списка книг в текущей папке

* join_fb2.py # объединение fb2 файлов перечисленных в файле list.txt

-------------------------------------------

В папке "Other":

count_fb_z.py - Подсчет числа секций и числа символов в fb2

* delbylist.py - удаление файлов по списку заданному в файле 'delfiles.txt' !Внимание! применять осмысленно!

* rename2number.py - захотелось переименовать файлы с книгами в виде "1.fb2; 2.fb2; ... 203456.fb2" !Внимание! применять осмысленно!

* dir_fb2.py - преобразование заданной папки и ее содержимого в файл fb2

Загрузка...