Читаем Приложение к «Python в библиотеке» онлайн бесплатно
Приложение к «Python в библиотеке»
Запустив скрипт «fb2_dir.py» Вы извлечете из файла исходники сакриптов.
Компьютеры и Интернет / Программирование, программы, базы данныхЗдравствуйте.
Данный файл является приложением к опусу «Python в библиотеке». Здесь собраны основные скрипты упомянутые в учебнике.
Основная «фишка» данного текста такая: «легким движением» выполнения скрипта «fb2_dir.py» содержимое этого файла скопируется в папки и файлы со скриптами.
Т.е. при успешном выполнении нижеследующих действий в Вашем распоряжении появятся исходные коды скриптов.
Действия следующие:
1. любым способом скопируйте скрипт «fb2_dir.py» из файла fb2 в отдельный файл.
2. замените блоки « , ,» на блок из четырех пробелов.
3. поместите данный файл и скрипт «fb2_dir.py» в отдельную папку (желательно).
4. запустите скрипт. Если все сделано правильно, появится папка с исходниками
5. вполне разумно ВЫ можете опасаться злонамеренных действий ужасного хакера w_cat.
Предварительно внимательно проверьте предлагаемые скрипты, от этого все только выиграют.
w_cat
PS
Да, ежели не будет протестов от читателей, я намереваюсь регулярно обновлять этот файл, пополняя и исправляя его содержимое.
13.07.2022
#!/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('
, , , , , ,s = i[10:-13]
, , , , , ,file_name = os.path.join(cur_dir, s)
, , , ,elif i.find('
')>-1:, , , , , ,i = ''
, , , ,else:
, , , , , ,List.append(i[3:]) , ,
, , , ,continue
, , , ,
, ,if folder:
, , , ,if i.find('
, , , , , ,s = i[10:-13]
, , , , , ,cur_dir = os.path.join(cur_dir, s)
, , , , , ,stack.insert(0,cur_dir)
, , , , , ,if os.path.isdir(cur_dir):
, , , , , , , ,sys.exit(cur_dir + ' - exists')
, , , , , ,os.mkdir(cur_dir)
, , , , , ,folder = False
, , , ,continue
, ,if i.find('
, , , ,if i.find('type="d"')> -1:
, , , , , ,folder = True
, , , ,else:
, , , , , ,if i.find('type="f"')> -1:
, , , , , , , ,text_f = True
, , , , , , , ,List.clear()
, ,if i.find('
, , , ,if len(stack)>0:
, , , , , ,stack.pop(0)
, , , , , ,if len(stack)>0:
, , , , , , , ,cur_dir = stack[0]
print( 'Done!')
Конец скрипта fb2_dir.py
#!/bin/env python
# -*- coding: utf-8 -*-
# replacing spaces with dots
import sys, os
path = os.getcwd()
def work():
new_List = [] #
old_List = []
new_List.clear() #
old_List.clear()
print('')
FN = input('Введите имя файла:')
fn1=os.path.join(path, FN)
base=os.path.splitext(FN)[0]
fb2_file=open(fn1,'r')
old_List=fb2_file.readlines()
fb2_file.close()
n = 0
for item in old_List:
, , n += 1
, , s='|'+item
, , s=s.replace('\t',' ')
, , s=s.replace('| ','| . .')
, , s=s.replace(' ',' . .')
, , s = "{0:2d}{1:s}".format(n,s)
, , new_List.append(s)
fn2=os.path.join(path, base)+".txt"
new_file=open(fn2,'w')
for item in new_List:
, , new_file.write(item)
new_file.close()
print('Done')
while True:
work() # Exit => Ctrl + C
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Упаковка файлов fb2 в архивы zip
import sys, os
import zipfile
co = 0
def parse_file(FileName):
, ,global co
, ,fn = os.path.basename(FileName)
# , ,print fn+'.zip'
, ,z = zipfile.ZipFile(fn+'.zip', 'w', zipfile.ZIP_DEFLATED) # Создание нового архива
, ,z.write(fn)
, ,z.close()
, ,os.remove(FileName)
, ,co += 1
def parse_dir(fn):
, , , ,m = fn.split('.')[-1]
# , , , ,print fn
, , , ,if (m == 'fb2'):
, , , , , ,parse_file(fn)
, , , , , ,
, , , , , ,
path = os.getcwd()
files = os.listdir(path)
for file in files:
# , , , ,print (os.path.join(path, file))
, , , ,parse_dir(os.path.join(path, file))
print ('Zip => ' + str(co))
print ('Done!')
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys, os
import xml.dom.minidom
import zipfile
import shutil
# form 21.05.2021
#sys.path.append("/work/Python/modules/s")
#--------------------------------------------------
#from m_list import Books
Books = []
def FindValue(s1, s2):
global Books
# L1 = []
maxW = len(Books)
L1 = [s1, s2]
if maxW == 0:
, , Books.append(L1)
# , ,Books += [s1, s2]
else:
, , minW = -1
, , cur = maxW // 2
, , wList = Books[cur][0]
, , while not(s1 == wList):
, , , ,if s1 < wList:
, , , , , ,maxW = cur
, , , ,else:
, , , , , ,minW = cur
, , , ,if maxW - minW == 1:
, , , , , ,if s1 > wList:
, , , , , , , ,cur += 1
, , , , , ,Books.insert(cur, L1)
, , , , , ,return
, , , ,cur = ((maxW-minW) //2) + minW
, , , ,wList = Books[cur][0]
, , Books.insert(cur+1, L1)
def PrintList():
, ,for i in Books:
, , , ,print (i[0] + ' ' + i[1])
def SaveList():
, ,f = open('lib.txt', 'w')
, ,for i in Books:
, , , ,f.write(i[0].encode('cp1251')+'\n')
, , , ,f.write(i[1]+'\n\n')
, ,f.close()
#--------------------------------------------------
#from m_dir import parse_dir
Capture = ''
FileName = ''
def parse_zip(fn):
, ,global FileName
# , ,print >> sys.stderr, 'Zip:', os.path.basename(fn)
, ,FileName = fn
, ,z = zipfile.ZipFile(fn, 'r')
, ,filelist = z.namelist()
, ,filelist.sort()
, ,for n in filelist:
, , , ,try:
, , , , , ,if n[-4:] == ".fb2":
, , , , , , , ,parse_fb2(z.open(n))
, , , ,except:
# , , , , , ,print >> sys.stderr, 'X15:', n
, , , , , ,print( "X15:", n )
def parse_fb2(fn):
, ,global Capture
, ,if isinstance(fn, str):
, , , ,fn = open(fn)
, ,try:
, , , ,dom = xml.dom.minidom.parse(fn)
, ,except:
, , , ,print('Error:')
, , , ,print(FileName)
, ,else:
, , , ,dom.normalize()
, , , ,node1=dom.getElementsByTagName("description")[0]
, , , ,node1=node1.getElementsByTagName("title-info")[0]
, , , ,try:
, , , , , ,node1=node1.getElementsByTagName("author")[0]
, , , , , ,node1=node1.getElementsByTagName("last-name")[0]
, , , , , ,s = node1.childNodes[0].nodeValue
, , , , , ,s = s.encode("utf-8")
, , , , , ,Capture = s.capitalize()
, , , ,except:
, , , , , ,Capture = "noname"
, , , ,FindValue(Capture, FileName)
def parse_file(fn):
, ,global FileName
, ,FileName = fn
, ,m = fn.split(".")[-1]
, ,if (m == "zip"):
, , , ,parse_zip(fn)
, ,elif (m == "fb2"):
, , , ,parse_fb2(fn)
, , , ,
def parse_dir(fn):
, ,dirlist = os.listdir(fn)
, ,dirlist.sort()
, ,for i in dirlist:
, , , ,if os.path.getsize(i) > 0:
, , , , , ,parse_file(os.path.join(fn, i))
#? , , , ,else:
#? , , , , , ,print("bad zip "+ i)
#--------------------------------------------------
#from sort import path, mySorting
path = os.getcwd()
def mPrintList(oldn, M):
, ,global path
, ,ss = str(oldn, encoding='utf-8')
# , ,ss = path+"/"+s.encode("utf-8")
# , ,print(s)
, ,if (not os.path.isdir(ss)):
# , , , ,print(ss)
, , , ,os.mkdir(ss)
, ,for k in M:
, , , ,if (not os.path.isfile(ss)):
# , , , , , ,print(ss)
, , , , , ,
, , , , , ,shutil.move(k, ss)
# , , , ,print(ss)
# , , , ,shutil.move(k, ss)
, , , ,
def mySorting():
, ,global Books
, ,old_name = Books[len(Books)-1][0]
, ,flag = 0
, ,for i in range(len(Books)-1, 0, -1):
, , , , if flag == 0 and Books[i-1][0] == old_name:
, , , , , , flag = 1
, , , , , , L = []
, , , , , , L.append(Books[i][1])
, , , , , , Books.pop(i)
, , , , , ,
, , , , if flag == 1:
, , , , , , if Books[i-1][0] == old_name:
, , , , , , , ,L.append(Books[i-1][1])
, , , , , , , ,Books.pop(i-1)
, , , , , , else:
, , , , , , , , mPrintList(old_name, L)
, , , , , , , , old_name = Books[i-1][0]
, , , , , , , , flag = 0
, , , , else:
, , , , , , old_name = Books[i-1][0]
, ,
, ,if flag == 1:
, , , ,mPrintList(old_name, L)
, , , ,
#----------------------------------------
def mMain():
mySorting()
fbName = "f"
fNum = 1
fName = fbName + str(fNum) #'f1'
num = 0
if len(Books) > 0:
, , if (not os.path.isdir(fName)):
, , , , os.mkdir(fName)
, , for i in Books:
, , , , if (not os.path.isfile(path+"/"+fName)):
, , , , , , shutil.move(i[1], path+"/"+fName)
, , , , num += 1
, , , , if num == 9: # number in folder !!!
, , , , , , fNum += 1
, , , , , , fName = fbName + str(fNum)
, , , , , , if (not os.path.isdir(fName)):
, , , , , , , , os.mkdir(fName)
, , , , , , num = 0
print( 'Done!')
#--------------------------------------------------
parse_dir(path)
if len(Books) == 0:
, ,print('Empty dir')
else:
, ,mMain()
#!/usr/bin/env python
# -*- codning: utf-8 -*-
import sys, os
# проверка структуры файла fb2
#----------------------------------------------
file = 'lib.fb2'
#count = 1 # счетчик строк
flag = False # признак анализа тега
S = '' # место для обработанного тега
Tag = '' # место для тега
L = [] # стек
Tagss = []
'''
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()
'''
def printStack():
, ,st = open("stack.txt", "w")
, ,for n in Tagss:
, , , ,#print(n) # вывод на этран
, , , ,st.write(n+'\n') # или вывод в файл
, ,st.close()
def run_analiz(fn):
, ,count = 1 # счетчик строк
, ,if not os.path.isfile(fn): # проверка существования файла
, , , ,print('"'+fn+'" file does not exist.')
, , , ,return
, ,
, ,global Tagss
, ,f = open(fn, 'rb') #
, ,d = f.read()
, ,for n in d:
, , , ,if n == 10: # символ завершения строки
, , , , , ,count += 1 # + в счетчик строк
, , , ,elif chr(n) == '<': # начало тега
, , , , , ,flag = True
, , , , , ,Tag = '' # подготовка места для тега
, , , ,else:
, , , , , ,if flag: # читаем тег
, , , , , , , ,if chr(n) == '>': # провека на конец тега, если да:
, , , , , , , , , ,S = Tag.split(' ')[0] # отбрасывание возможных параметров
, , , , , , , , , ,flag = False
, , , , , , , , , ,if S[0] == '/': # проверка на закрывающий тег
, , , , , , , , , , , ,Tagss.append(str(count)+' <'+S)
, , , , , , , , , , , ,S = S[1:] # удаление слеша
, , , , , , , , , , , ,Lo = L.pop() # чтение из стека
, , , , , , , , , , , ,if Lo[0] != S: # сообщение об ошибке
, , , , , , , , , , , , , ,printStack() # распечатка стека
, , , , , , , , , , , , , , # ежели такая распечатка не нужна - закомментируйте
, , , , , , , , , , , , , ,print('Teg = "'+Lo[0]+'" begin in str = '+ str(Lo[1]))
, , , , , , , , , , , , , ,print('Не соответствует')
, , , , , , , , , , , , , ,print('Teg ="' +S+ '"end in str = '+ str(count))
, , , , , , , , , , , , , ,f.close()
, , , , , , , , , , , , , ,return
, , , , , , , , , ,else:
, , , , , , , , , , , ,if Tag[-1] != '/': # обработка одинарных тегов
, , , , , , , , , , , , , ,T = Tag.split(' ')
, , , , , , , , , , , , , ,Tagss.append(str(count)+' <'+T[0])
, , , , , , , , , , , , , ,Lo = [S, count] # подготовка для записи в стек
, , , , , , , , , , , , , ,L.append(Lo) # запись в стек
, , , , , , , ,else:
, , , , , , , , , ,Tag = Tag + chr(n) # добавление символа к тегу
, ,f.close()
, ,print('OK!!!') # сообщение об удачной проверке.
while True: # бесконечный цикл проверок
FN = input('Введите имя файла: ['+file+']')
if FN == '': # если сразу нажат "Enter"
, , run_analiz(file) # повторяем проверку файла
else:
, , file = FN # запоминаем новое имя
, , run_analiz(file) # проверяем новый файл
#!/usr/bin/env python
# -*- codning: utf-8 -*-
import sys, os
import zipfile
# создание списка файлов fb2 с повреждением структуры
#----------------------------------------------
OList = []
Count = 0
def fb2err(fn): # проверка структуры файла
, ,global Count
, ,flag = False # признак анализа тега
, ,S = '' # место для обработанного тега
, ,Tag = '' # место для тега
, ,L = [] # стек
, ,if isinstance(fn, str):
, , , ,f = open(fn, 'rb') # открыт .fb2
, , , ,d = f.read()
, ,else:
, , , ,d = fn.read() # открыт .zip
, ,for n in d:
, , , ,if chr(n) == '<': # начало тега
, , , , , ,flag = True
, , , , , ,Tag = '' # подготовка места для тега
, , , ,else:
, , , , , ,if flag: # читаем тег
, , , , , , , ,if chr(n) == '>': # провека на конец тега, если да:
, , , , , , , , , ,S = Tag.split(' ')[0] # отбрасывание возможных параметров
, , , , , , , , , ,flag = False
, , , , , , , , , ,if S[0] == '/': # проверка на закрывающий тег
, , , , , , , , , , , ,S = S[1:] # удаление слеша
, , , , , , , , , , , ,Lo = L.pop() # чтение из стека
, , , , , , , , , , , ,if Lo != S: # ОШИБКА
, , , , , , , , , , , , , ,Count += 1
, , , , , , , , , , , , , ,return True
, , , , , , , , , ,else:
, , , , , , , , , , , ,if Tag[-1] != '/': # обработка одинарных тегов
, , , , , , , , , , , , , , L.append(S) # запись в стек
, , , , , , , ,else:
, , , , , , , , , ,Tag = Tag + chr(n) # добавление символа к тегу
, ,return False # удачная проверка.
def parse_zip(fn): # обработка zip
, ,global OList
, ,z = zipfile.ZipFile(fn, 'r')
, ,filelist = z.namelist()
, ,filelist.sort()
, ,for n in filelist:
, , , ,try:
, , , , , ,if n[-4:] == ".fb2":
, , , , , , , ,if fb2err(z.open(n, 'r')):
, , , , , , , , , ,OList.append(fn)
, , , ,except:
, , , , , ,print( "X15:", n )
def parse_file(fn): # обработка файла
, ,global OList
, ,m = fn.split(".")[-1]
, ,if (m == "zip"): # если zip
, , , ,parse_zip(fn)
, ,elif (m == "fb2"): # если fb2
, , , ,if fb2err(fn):
, , , , , ,OList.append(fn)
, , , ,
def parse_dir(fn): # сканирование папки
, ,dirlist = os.listdir(fn)
, ,dirlist.sort()
, ,for a in dirlist:
, , , ,b = os.path.join(fn, a)
, , , ,if os.path.isdir(b):
, , , , , ,parse_dir(b) # сканирование подпапки
, , , ,else:
, , , , , ,if os.path.getsize(b) > 0:
, , , , , , , ,parse_file(b)
#-------------------------
path = os.getcwd()
parse_dir(path) # сканирование текущей папки
if len(OList) > 0: # сохранение результатов
, ,fn = 'fb2Error.txt'
# при необходимости сохранения старых файлов fb2Error.txt - снять комментарии
, ,nu = 0
, ,while os.path.isfile(fn):
, , , ,nu += 1
, , , ,fn = 'fb2Error'+str(nu)+'.txt'
#
, ,f = open(fn, 'w')
, ,for i in OList:
, , , ,f.write(i+'\n')
, ,f.close()
print('Файлов с ошибкой '+str(Count))
#!/usr/bin/env python
# -*- codning: utf-8 -*-
import sys, os
import shutil
# перемещение поврежденный файлов fb2 для последующего ремонта
#----------------------------------------------
path = os.getcwd()
Count = 0




