Коллекции загружаются
Написала программку для поиска в каноне упоминаний разных пятых лебедей.
Выкладываю сюда код, для выхода из замкнутого круга "пишу фигню, осознаю что фигня, понимаю, сколько надо улучшать, лежу раздавленная". Код, что бы я ни думала, закончен. Он работает. Берет настройки из одного файла, ищет в лежащем поблизости тексте канона, и выводит отрывки в другой. И его НЕ надо переписывать так, чтоб он фильтровал опечатки, узанвал главы и выводил и их тоже в результат. Можно, но не обязательно, он закончен, и готов. И для красоты кода его не обязательно переписывать, он и так работает. Можно расслабиться, выдохнуть и отсовокупиться от себя. Вот в какой форме выложила, в такой пусть и существует, ни символа не менять. Да, ученический, так и положено, учусь. 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
2 |
И файл настроек нужный рядом 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: Это было за обедом. Гарри только что закончил рассказыват *** |
Так, два часа оно провисело, ачивка есть.
Теперь осталось за неделю не удалить, и вообще молодец буду. |
Вы сломали мне мозг...
|