DB_JOB/_스크립트/_gongju_apply.py
hehihoho3 df16c98366 백업: DB수집 전체 스냅샷 (공공기관2 정리 전)
공공기관2 작업 중. _temp 몽타주(재생성가능)는 제외.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 18:15:40 +09:00

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()