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('</section')==0:
, , , , , ,Other = False
, , , ,continue
, ,if text_f:
, , , ,if i.find('</section')==0:
, , , , , ,text_f = False
, , , , , ,SaveList(file_name, List)
, , , ,elif i.find('<title>')==0:
, , , , , ,s = i[10:-13]
, , , , , ,file_name = os.path.join(cur_dir, s)
, , , ,elif i.find('</p>')>-1:
, , , , , ,i = ''
, , , ,else:
, , , , , ,List.append(i[3:]) , ,
, , , ,continue
, , , ,
, ,if folder:
, , , ,if i.find('<title>')==0:
, , , , , ,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('<section')==0:
, , , ,if i.find('type="d"')> -1:
, , , , , ,folder = True
, , , ,else:
, , , , , ,if i.find('type="f"')> -1:
, , , , , , , ,text_f = True
, , , , , , , ,List.clear()
, ,if i.find('</section')==0:
, , , ,if len(stack)>0:
, , , , , ,stack.pop(0)
, , , , , ,if len(stack)>0:
, , , , , , , ,cur_dir = stack[0]
print( 'Done!')
Конец скрипта fb2_dir.py
3
spas2.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
_my_zip.py
#!/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!')
5
main_ok.py
#!/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(