7 лет на сайте
22 ноября 2024 |
|
6 лет на сайте
22 ноября 2023 |
|
5 лет на сайте
22 ноября 2022 |
|
4 года на сайте
22 ноября 2021 |
|
3 года на сайте
22 ноября 2020 |
Грызун
10 октября 2023
Коллекции загружаются
Написала программку для поиска в каноне упоминаний разных пятых лебедей.
Выкладываю сюда код, для выхода из замкнутого круга "пишу фигню, осознаю что фигня, понимаю, сколько надо улучшать, лежу раздавленная". Код, что бы я ни думала, закончен. Он работает. Берет настройки из одного файла, ищет в лежащем поблизости тексте канона, и выводит отрывки в другой. И его НЕ надо переписывать так, чтоб он фильтровал опечатки, узанвал главы и выводил и их тоже в результат. Можно, но не обязательно, он закончен, и готов. И для красоты кода его не обязательно переписывать, он и так работает. Можно расслабиться, выдохнуть и отсовокупиться от себя. Вот в какой форме выложила, в такой пусть и существует, ни символа не менять. Да, ученический, так и положено, учусь. 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') Свернуть сообщение - Показать полностью
2 Показать 4 комментария |