Code: Select all
# -*- encoding: UTF-8 -*-
import os, re, sys
def uik_paths():
for path, dirs, files in os.walk(u'out'):
dirs = set(dirs)
for f in files:
if not os.path.splitext(f)[0] in dirs:
filepath = os.path.join(path, f)
parts = filepath.replace('\\', '/').split('/')
result = []
for p in parts[2:]:
if p not in result:
result.append(p)
yield filepath, unicode(os.path.splitext('/'.join(result))[0])
heads1 = [
("1", u'Число избирателей, внесенных в список избирателей на момент окончания голосования', u'izbirateley v spiske'),
("2", u'Число избирательных бюллетеней, полученных участковой избирательной комиссией', u'polucheno bulleteney dlya komissii'),
("3", u'Число избирательных бюллетеней, выданных избирателям, проголосовавшим досрочно', u' bulleteney dosrochno'),
("4", u'Число избирательных бюллетеней, выданных в помещении для голосования в день голосования', u' bulleteney v pomeschenii'),
("5", u'Число избирательных бюллетеней, выданных вне помещения для голосования в день голосования', u'bulleteney vne pomescheniya'),
("6", u'Число погашенных избирательных бюллетеней', u'bulleteney pogasheno'),
("7", u'Число избирательных бюллетеней, содержащихся в переносных ящиках для голосования', u'bulleteney v perenosnyh urnah'),
("8", u'Число избирательных бюллетеней, содержащихся в стационарных ящиках для голосования', u'bulleteney v stacionarnyh urnah'),
("9", u'Число недействительных избирательных бюллетеней', u'bulleteney nedeystvitelnyh'),
("10", u'Число действительных избирательных бюллетеней', u'bulleteney deysttvitelnyh'),
("11", u'Число открепительных удостоверений, полученных участковой избирательной комиссией', u'polucheno otkrepitelnyh'),
("12", u'Число открепительных удостоверений, выданных на избирательном участке до дня голосования', u'vydano otkrepitelnyh'),
("13", u'Число избирателей, проголосовавших по открепительным удостоверениям на избирательном участке', u'progolosovavshyh po otkrepitenym'),
("14", u'Число погашенных неиспользованных открепительных удостоверений', u'pogashennye otrkepitelnye'),
("15", u'Число открепительных удостоверений, выданных избирателям территориальной избирательной комиссией', u'otrepitelnye vydannye TIK'),
("16", u'Число утраченных открепительных удостоверений', u'utrachennyh otrkepitelnyh'),
("17", u'Число утраченных избирательных бюллетеней', u'utrachennye bulleteni'),
("18", u'Число избирательных бюллетеней, не учтенных при получении', u'neuchtennye bulleteni'),
]
heads2 = [
("19", u'1. ВСЕРОССИЙСКАЯ ПОЛИТИЧЕСКАЯ ПАРТИЯ "РОДИНА"', u'Rodina'),
("20", u'2. Политическая партия КОММУНИСТИЧЕСКАЯ ПАРТИЯ КОММУНИСТЫ РОССИИ"', u'KPKomRos'),
("21", u'3. Политическая партия "Российская партия пенсионеров за справедливость"', u'RosParPensSprav'),
("22", u'4. Всероссийская политическая партия "ЕДИНАЯ РОССИЯ"', u'ER'),
("23", u'5. Политическая партия "Российская экологическая партия "Зеленые"', u'Zelenye'),
("24", u'6. Политическая партия "Гражданская Платформа"', u'GraPlatforma'),
("25", u'7. Политическая партия ЛДПР - Либерально-демократическая партия России', u'LDPR'),
("26", u'8. Политическая партия "Партия народной свободы" (ПАРНАС)', u'PARNAS'),
("27", u'9. Всероссийская политическая партия "ПАРТИЯ РОСТА"', u'ParRosta'),
("28", u'10. Общественная организация Всероссийская политическая партия "Гражданская Сила"', u'GraSila'),
("29", u'11. Политическая партия "Российская объединенная демократическая партия "ЯБЛОКО"', u'Yabloko'),
("30", u'12. Политическая партия "КОММУНИСТИЧЕСКАЯ ПАРТИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ"', u'KPRF'),
("31", u'13. Политическая партия "ПАТРИОТЫ РОССИИ"', u'PatRos'),
("32", u'14. Политическая партия СПРАВЕДЛИВАЯ РОССИЯ', u'SpraRos'),
]
invalid_uiks = open('invalid_uiks.txt', 'wb')
def parse_file(filename):
page = open(filename).read()
template = '''
<tr bgcolor="[^"]*">
<td style="[^"]*"> (\d+) </td>
<td style="[^"]*">(.*?)</td>
<td style="[^"]*" align="right"> <b> (\d+) </b> (<br>)? (([0-9.]*)%)? </td>
</tr>
'''
template = '\s*'.join(template.split())
d = {}
for m in re.finditer(template, page):
g = m.group
proc = g(6)
if proc:
proc = proc.replace(',', '.')
d[g(1), g(2).strip().decode('cp1251')] = (g(3), proc)
for n, head, rename in heads1 + heads2:
if not ((n, head) in d):
print 'error during parsing', filename
print >> invalid_uiks, filename.encode('cp1251')
print "can't find", head.encode('UTF-8')
return None
for n, head, rename in heads2:
if not d[n, head][1]:
print 'error during parsing', filename
print >> invalid_uiks, filename.encode('cp1251')
print 'empty % for', head.encode('UTF-8')
return None
return d
output = open('elections_2016.txt', 'wb')
def add_row(uik_name, data):
row = []
row.append(uik_name.encode('cp1251'))
for n, head, rename in heads2:
row.append(data[n, head][0])
row.append(data[n, head][1])
for n, head, rename in heads1:
row.append(data[n, head][0])
output.write('\t'.join(row)+'\n')
head_data = {}
head_data.update(((n,h), ((rename or h).encode('cp1251') , None)) for n, h, rename in heads1)
head_data.update(((n,h), ((rename or h).encode('cp1251') , (rename or h).encode('cp1251') + '%')) for n, h, rename in heads2)
add_row(u'Участок', head_data)
print 'searching uik paths...'
files = list(uik_paths())
for i, (filepath, uik_name) in enumerate(files):
data = parse_file(filepath)
if data:
add_row(uik_name, data)
sys.stdout.write('%s/%s\r' % (i+1, len(files)))