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

Пароль

 
Войти при помощи

Блог » Поиск

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

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')
Свернуть сообщение
-
Показать полностью
Показать 4 комментария
ПОИСК
ФАНФИКОВ











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