공공기관2 작업 중. _temp 몽타주(재생성가능)는 제외. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
88 lines
3.5 KiB
Python
88 lines
3.5 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""공주시 227~414행 재검수 적용.
|
|
규칙(226행 검수 캘리브레이션 결과):
|
|
R1 관광지 dongList(tursmCn): L 페이지->게시판, M=썸네일수
|
|
R2 게시판 글수 재계산: M=현재 크롤 글수 (board_count 있는 행, 값이 다를 때만)
|
|
R3 찾아오시는길/오시는길: N=어문,이미지
|
|
DRY 기본. --write 시 백업 후 저장.
|
|
"""
|
|
import sys, json, shutil
|
|
import openpyxl
|
|
|
|
XLSX = r'D:\01.프로젝트\DB수집\작업파일\광역_사이트맵\충청남도\2.공주시\충청남도_공주시.xlsx'
|
|
EV = r'D:\01.프로젝트\DB수집\_스크립트\_evidence.json'
|
|
LO, HI = 227, 414
|
|
|
|
|
|
def main():
|
|
write = '--write' in sys.argv
|
|
ev = json.load(open(EV, encoding='utf-8'))
|
|
wb = openpyxl.load_workbook(XLSX)
|
|
ws = wb.active
|
|
changes = [] # (row, col, colname, old, new, rule)
|
|
drift = [] # 미세 드리프트(원본 유지) 보고용
|
|
|
|
for r in range(LO, HI + 1):
|
|
e = ev.get(str(r))
|
|
if not e:
|
|
continue
|
|
url = (ws.cell(r, 11).value or '')
|
|
L = ws.cell(r, 12).value
|
|
M = ws.cell(r, 13).value
|
|
N = ws.cell(r, 14).value
|
|
Gname = ws.cell(r, 7).value or ''
|
|
Fname = ws.cell(r, 6).value or ''
|
|
name = '%s %s' % (Fname, Gname)
|
|
|
|
# R1 관광지 dongList
|
|
if 'tursmCn' in url and e.get('tursm_count'):
|
|
tc = e['tursm_count']
|
|
if L != '게시판':
|
|
changes.append((r, 12, 'L', L, '게시판', 'R1관광지'))
|
|
if M != tc:
|
|
changes.append((r, 13, 'M', M, tc, 'R1관광지'))
|
|
continue # 관광지는 M 규칙2 적용 안함
|
|
|
|
# R2 게시판 글수 재계산 (0/빈 값만 복구; 유효 비0값의 미세 드리프트는 원본 유지)
|
|
if L == '게시판' and e.get('board_count') is not None:
|
|
bc = e['board_count']
|
|
if (M in (None, 0, '0')) and bc:
|
|
changes.append((r, 13, 'M', M, bc, 'R2게시판글수복구'))
|
|
elif M != bc:
|
|
drift.append((r, M, bc, ws.cell(r, 7).value or ws.cell(r, 6).value or ''))
|
|
|
|
# R3 찾아오시는길 N
|
|
if ('찾아오시는' in name) or ('오시는길' in name) or ('오시는 길' in name):
|
|
if N == '어문':
|
|
changes.append((r, 14, 'N', N, '어문,이미지', 'R3오시는길'))
|
|
|
|
# report
|
|
print('=== 제안 변경 %d건 (DRY) ===' % len(changes))
|
|
by = {}
|
|
for r, c, cn, old, new, rule in changes:
|
|
by.setdefault(rule, []).append((r, cn, old, new))
|
|
for rule in sorted(by):
|
|
print('\n[%s] %d건' % (rule, len(by[rule])))
|
|
for r, cn, old, new in by[rule]:
|
|
g = ws.cell(r, 7).value or ws.cell(r, 6).value or ws.cell(r, 5).value or ''
|
|
print(' r%d %s: %r -> %r (%s)' % (r, cn, old, new, g))
|
|
|
|
if drift:
|
|
print('\n[미세 드리프트: 원본 유지, 참고용] %d건' % len(drift))
|
|
for r, old, new, g in drift:
|
|
print(' r%d 게시판글수 원본 %s (현재 크롤 %s, 차이 %+d) %s' % (r, old, new, new - (old or 0), g))
|
|
|
|
if write:
|
|
bak = XLSX.replace('.xlsx', '_backup_재검수227전.xlsx')
|
|
shutil.copy(XLSX, bak)
|
|
for r, c, cn, old, new, rule in changes:
|
|
ws.cell(r, c).value = new
|
|
wb.save(XLSX)
|
|
print('\n저장 완료. 백업:', bak)
|
|
else:
|
|
print('\n(DRY — 적용하려면 --write)')
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|