Читаем Приложение к «Python в библиотеке» онлайн бесплатно


Приложение к «Python в библиотеке»

Запустив скрипт «fb2_dir.py» Вы извлечете из файла исходники сакриптов.

w cat

Компьютеры и Интернет / Программирование, программы, базы данных
<p>Arch</p><p>read_me.txt</p>

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

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

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

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

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

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

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

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

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

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

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

w_cat

PS

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

13.07.2022

<p>fb2_dir.py</p>

#!/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:

, , , , , ,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('')==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('

, , , ,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

<p>3</p><p>spas2.py</p>

#!/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

<p>_my_zip.py</p>

#!/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!')

<p>5</p><p>main_ok.py</p>

#!/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()

<p>6</p><p>fb2err4.py</p>

#!/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) # проверяем новый файл

<p>fb2errors.py</p>

#!/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))

<p>moveIn.py</p>

#!/usr/bin/env python

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

import sys, os

import shutil

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

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

path = os.getcwd()

Count = 0

Похожие книги

Другие книги w cat