↓
 ↑
Регистрация
Имя/email

Пароль

 
Войти при помощи
Грызун
10 октября 2023
Aa Aa
Написала программку для поиска в каноне упоминаний разных пятых лебедей.
Выкладываю сюда код, для выхода из замкнутого круга "пишу фигню, осознаю что фигня, понимаю, сколько надо улучшать, лежу раздавленная". Код, что бы я ни думала, закончен.
Он работает. Берет настройки из одного файла, ищет в лежащем поблизости тексте канона, и выводит отрывки в другой.
И его НЕ надо переписывать так, чтоб он фильтровал опечатки, узанвал главы и выводил и их тоже в результат. Можно, но не обязательно, он закончен, и готов. И для красоты кода его не обязательно переписывать, он и так работает. Можно расслабиться, выдохнуть и отсовокупиться от себя. Вот в какой форме выложила, в такой пусть и существует, ни символа не менять. Да, ученический, так и положено, учусь.

import json

def ainb(a,b):
a=a.strip()
a=a.upper()
print(a)
pass


def get_dict(lines, commands):
# lines=list(filter(None, lines))
result_dict=
for com in commands:
try: lines.index(com)
except ValueError:
# print ("input error: in set.txt is no "+com)
pass
# ne rabotaet vuvod soobsheniya!

command=commands[0]
for (pos_line, line) in enumerate(lines):
# cловарь "команда":["знач10","знач2","знач3"]
for c in commands:
if c in line:
command=c
line=line[len(c):].strip()
if len(line)>0:
if command in result_dict:
if type(result_dict[command])==list:
result_dict[command].append(line)
else:
result_dict[command]=[result_dict[command]]
result_dict[command].append(line)
else:
result_dict[command]=line

# print(result_dict)
return result_dict



def get_settings_lines():

s = open('set.txt')
settings_lines = list(map(str.strip,s.readlines()))
# приписать сюда проверку и сообщение об ошибке
commands=[
'ФАЙЛЫ:',
'КЛЮЧИ:',
'РАДИУС СЛИПАНИЯ:',
'РАДИУС ОБРАМЛЕНИЯ:',
'КОРРЕКТИРОВКИ:']
minor_commands=[
'file:',
'place:',
'text_begin:',
'text_end:',
'comment:']
global settings
settings=get_dict(settings_lines, commands)

if settings[ 'КОРРЕКТИРОВКИ:'][-1] !=' ***':settings['КОРРЕКТИРОВКИ:'].append('***')
x=0
for i in range(settings[ 'КОРРЕКТИРОВКИ:'].count('***')):
nexxxt = settings[ 'КОРРЕКТИРОВКИ:'].index('***',x)
y = get_dict(settings[ 'КОРРЕКТИРОВКИ:'] [x:nexxxt],minor_commands)
settings[ 'КОРРЕКТИРОВКИ:'][x:nexxxt] =
settings[ 'КОРРЕКТИРОВКИ:'][x]=y
x = x+1
# x ->i??


# приведение типов для использования:
settings[ 'КЛЮЧИ:']=list(map(str.upper,settings['КЛЮЧИ:']))
settings[ 'РАДИУС СЛИПАНИЯ:']=int(settings['РАДИУС СЛИПАНИЯ:'])
settings[ 'РАДИУС ОБРАМЛЕНИЯ:']=int(settings['РАДИУС ОБРАМЛЕНИЯ:'])
for k in settings[ 'КОРРЕКТИРОВКИ:']:
if not 'comment:' in k:
k['comment:']=''


#main
get_settings_lines()

output_file = open('out'+str(settings['КЛЮЧИ:'])+'.txt','w')
log_file = open('log'+str(settings['КЛЮЧИ:'])+'.txt','w')

for cur_file in settings['ФАЙЛЫ:']:
sours_file = open(cur_file)
paragraphs= sours_file.readlines()

#poisk klychey
markers=
# markers=[[-1,'bla-bla-bla',-1]]
# #[start_index, comment, end_index]
for (par_index, par) in enumerate(paragraphs):
for key in settings['КЛЮЧИ:']:
if key in par.upper():
if len(markers)==0:
markers.append([par_index,'',par_index])
else:
delta = par_index - markers[-1][2]
if delta > settings['РАДИУС СЛИПАНИЯ:']*2:
markers.append([par_index,'',par_index])
else:
markers[-1][2] = par_index
break #на случай нескольких ключей в абзаце
#применение корректировок:
for kor in settings['КОРРЕКТИРОВКИ:']:
if kor['file:']==cur_file:
begin = int(kor[ 'place:'][0:kor[ 'place:'].index('-')])
end = int(kor[ 'place:'][kor[ 'place:'].index('-')+1:kor['place:'].index('/')])
for p in range(min(len(paragraphs)-begin,begin)):
if kor['text_begin:'] in paragraphs[begin+p]:
markers.append([begin+p, kor['comment:'], -1])
break;
if kor['text_begin:'] in paragraphs[begin-p]:
markers.append([begin-p, kor['comment:'], -1])
break;
markers[-1][2]=end
for p in range(min(len(paragraphs)-end,end)):
if kor['text_end:'] in paragraphs[end+p]:
markers[-1][2]=end+p
break;
if kor['text_end:'] in paragraphs[end-p]:
markers[-1][2]=end-p
break;
#усушка и утруска двух списокв: по ключам и жестко заданных отрывков:
markers.sort()
for m in range(len(markers)):
# если два отрывка пересекаются, то слить
# если [m][0] лежит между левой и правой границей прошлого, то общая точка есть
if markers[m-1][2]>=markers[m][0] and markers[m][0]>=markers[m-1][0]:
markers[m][0]=min(markers[m][0],markers[m-1][0])
markers[m][2]=max(markers[m][2],markers[m-1][2])
markers[m][1]=markers[m][1]+markers[m-1][1]
markers[m-1]=[-1,'',-1]
print ('=',len(markers))
markers.sort()
# если есть что чистить -- подчистка выбывших в прошлом цикле
if len(markers)>0:
while markers[0][0]==-1:del markers[0];
print ('==',len(markers))

# log_file.write(str(markers)+'\n')
# log_file.flush()
# разметка завершена, начинается вывод результатов:
output_file.write('results:%d in %s\n' %(len(markers),cur_file))
log_file.write('results:%d in %s\n' %(len(markers),cur_file))
# json.dump(settings, log_file,ensure_ascii=False,indent=3)
log_file.flush()
# print('tra-ta-ta!2')
for (o_index, o) in enumerate(markers):
# print('tra-ta-ta!2',o_index,'\n')
output_file.write('\nresult:%d/%d\n' % (o_index,len(markers)))
output_file.write('Описание:'+o[1]+'\n')
log_file.write('file:'+cur_file+'\n')
# log_file.write('\nresult:%d/%d\n' % (o_index,len(markers)))

start_index=max(0 , o[0]-settings['РАДИУС ОБРАМЛЕНИЯ:'])
end_index=min(len(paragraphs), o[2]+settings['РАДИУС ОБРАМЛЕНИЯ:'])
# print(type(end_index-start_index-1))
output_file.write('place:%d/%d\n' %(start_index, len(paragraphs)))
log_file.write('place:%d-%d/%d\n' %(o[0],o[2], len(paragraphs)))
output_file.write('len:%d\n' % (end_index-start_index+1))
# log_file.write('len:%d\n' % (end_index-start_index+1))
log_file.write('comment:'+o[1]+'\n')
log_file.write('text_begin:' + paragraphs[int(o[0])][0:60].strip()+'\n')
log_file.write('text_end:' + paragraphs[o[2]][0:60].strip()+'\n')
log_file.write('***'+'\n')
log_file.flush()
for i in paragraphs[start_index:end_index+1]:
output_file.write(i)
for key in settings['КЛЮЧИ:']:
if key in i.upper():
output_file.write('('+key+')')
output_file.write('\n')
output_file.write('***')

output_file.write('**\n\n')
output_file.flush()
log_file.flush()
sours_file.close()
print('file!')

output_file.close()
log_file.close()


print('The END')
10 октября 2023
4 комментария
И файл настроек нужный рядом set.txt
ФАЙЛЫ:
семикнижие.txt
КЛЮЧИ:
Минерва
макгонагал
мак-гонанал
РАДИУС СЛИПАНИЯ:
3
РАДИУС ОБРАМЛЕНИЯ:
2
КОРРЕКТИРОВКИ:
file:семикнижие.txt
place:77-150/39386
comment:первое появление, разговор с Дамблдором на Тисовой
text_begin: — Странно видеть вас здесь, профессор МакГонагалл.

text_end: — Надеюсь увидеть вас в самое ближайшее время, профессор
***
file:семикнижие.txt
place:483-491/39386
comment:подпись в письме из Хогвартса
text_begin: ШКОЛА ЧАРОДЕЙСТВА И ВОЛШЕБСТВА «ХОГВАРТС»

text_end: Искренне Ваша, Минерва МакГонагалл, заместитель директора
***
file:семикнижие.txt
place:1171-1205/39386
comment:сопровождение к распределению
text_begin: Дверь распахнулась. За ней стояла высокая черноволосая во
text_end: — Я вернусь сюда, когда все будут готовы к встрече с вами
***
file:семикнижие.txt
place:1198-1205/39386
comment: вывод учеников в зал на распределение
text_begin: — Идите отсюда, — произнес строгий голос.
text_end: Гарри услышал какой-то звук и, опустив устремленный в пот
***
file:семикнижие.txt
place:1247-1266/39386
comment:распределение
text_begin: Профессор МакГонагалл шагнула вперед, в руках она держала
text_end: Гарри вдруг представил, как он сидит на табурете с шляпой
***
file:семикнижие.txt
place:1292-1292/39386
comment:упоминание - унесла Шляпу
text_begin: — Отлично, Рон, просто превосходно, — с важным видом похв
text_end: — Отлично, Рон, просто превосходно, — с важным видом похв
***
file:семикнижие.txt
place:1323-1323/39386
comment:упоминание "профессор МакГонагалл беседовала с профессором Дамблдором"
text_begin: Гарри согрелся, размяк и ощутил, что у него начинают слип
text_end: Гарри согрелся, размяк и ощутил, что у него начинают слип
***
file:семикнижие.txt
place:1391-1394/39386
comment:Первый урок
text_begin: А вот профессор МакГонагалл была совсем другой. Гарри был
text_end: Потом профессор МакГонагалл продиктовала им несколько оче
***
file:семикнижие.txt
place:1401-1402/39386
comment:сравнения со Снейпом
text_begin: — Хотел бы я, чтобы МакГонагалл всегда заступалась за нас
text_end: Профессор МакГонагалл была деканом факультета Гриффиндор,
***
file:семикнижие.txt
place:1415-1415/39386
comment:Сравнение Снейпа с Макогнангл
text_begin: Снегг говорил почти шепотом, но ученики отчетливо слышали
text_end: Снегг говорил почти шепотом, но ученики отчетливо слышали
***
file:семикнижие.txt
place:1494-1498/39386
comment:Появление напоминалки на завтраке
text_begin: Гарри и Рон одновременно вскочили на ноги. Не то чтобы им
text_end: — Я просто хотел посмотреть, профессор, — невинным голосо
***
file:семикнижие.txt
place:1542-1578/39386
comment:Инцидент с напоминалкой
text_begin: Сердце его рухнуло в пятки быстрее, чем он пикировал к зе
text_end: Это было за обедом. Гарри только что закончил рассказыват
***
Показать полностью
Так, два часа оно провисело, ачивка есть.
Теперь осталось за неделю не удалить, и вообще молодец буду.
Вы сломали мне мозг...
Luz Noceda
Вы сломали мне мозг...
А чем именно, теряюсь в догадках?
ПОИСК
ФАНФИКОВ









Закрыть
Закрыть
Закрыть