본문 바로가기

MATHrone/DEV

[DB,python] 데이터 renaming

728x90

 

 

 

 

아직 데이터베이스 기획에 대한 내용을 작성하지 않았지만..

 

유저가 푼 문제를 기반으로 많이 틀린 단원의 문제를 추천해주는 기능을 넣기 위해서 

다음과 같이 유저가 시도한 문제에 대한 테이블을 만들었다.

지금 보니까 날짜를 하려면 맞은날짜, 시도한 날짜가 필요할까? 

어떤유저( user_id ) 가 어떤 문제(problem_id)를 시도했고, 그 문제를 맞았는지 (IsCorrect) 를 저장하는 테이블이다.

그런데, 어떤 문제가 어떤 단원인지 파악하려면,

problem_try 테이블에서 problem 테이블을 조회하여 단원id를 알아낸다음 chapter 테이블을 조회해서 단원명을 알아내야한다.

문제 테이블
단원명(chapter) 테이블

 

그래서, 애초에 problem_id를 지정할 때, 어떤문제집인지(workbook_id) / 어떤 단원인지(chapter_id) / 어떤문제인지 (문제번호) 를 알 수 있게 지정하면 좋겠다는 의견이 나왔다.

 

수능완성 2021년도 가형 문제집에서 확률과 통계 단원 문제는 

01 : 수능완성 2021년도 가형

09 : 확률과 통계 - 통계 

247번 문제 

" 01-09-00247 " 이라는 id를 가지며, 문제 이미지 또한 해당 이름으로 지정하면 좋겠다고 하여서

 

문제 이미지를 전부 다음과 같은 형식이 이름으로 변경하기로 했다.

 

 

해당 문제가 어떤 단원인지 알아내는 것은 어쩔 수 없이 수동으로 파악해야하지만, 천장정도 되는 이미지이름을 하나하나 변경하는 건.. 

너무 오바인 일이며, 보통 이런일은 개발자라면 코드로 자동화를 해줘야 제맛이다

 

내가 생각한 방식은 다음과 같다.

엑셀을 이용해서 원하는 형식으로 id를 생성해낸다.

이를 전부 txt파일내에 저장해 둔 후, python을 이용해 이름을 한개씩 읽어서 파일명을 해당 이름으로 변경하는 것이다. 

 

 

 

excel로 problem_id 생성

 

먼저, problem table에 들어갈 데이터들 중

문제번호 / 단원 id / 문제집 id는 엑셀로 쉽게 조사해서 작성해둔 상태이다. 

이제 엑셀의 함수를 이용해서, 00-00-00000 형식을 맞추면서 "workbook_id"-"chap_id"-"prob_num"을 만들어 준다.

 

두가지 함수를 사용한다.

TEXT(숫자, 형식)
TEXT(숫자,"형식")

원하는 숫자를 입력한 형식으로 변환해주는 함수를 사용해서, 

1 -> 01 (문제집id, 챕터id)

145 -> 00145 (문제번호)

를 다음과 같이 맞추어 준다.

 

CONCATENATE(문자열,문자열,....)
CONCATENATE(문자열,문자열,....)

여러 문자열을 이어준다.

workbook_id , "-", chap_id , "-", prob_num  을 이어주면 된다.

 

=CONCATENATE(TEXT(workbook_id열,"00"),"-",TEXT(chap_id열,"00"),"-",TEXT(prob_num열,"00000"))

두개를 이용해서 다음과 같이 자동으로 prob_id를 원하는 형식으로 생성해 냈다.

 

이제 id를 복사해서 텍스트 파일로 만들어 둔다.

 

 

python을 이용해 이미지 명 한번에 변경

 

 

이미지 데이터를 일단 gdrive에 넣어두었으므로, 코랩을 이용하기로 한다.

먼저 기본적으로 이름을 변경하고자 하는 이미지가 담긴 폴더를 gdrive에 넣어준다.

 

#구글 드라이브와 연동 
from google.colab import drive
drive.mount('/gdrive')

먼저 드라이브를 코랩에서 사용하기 위해 연동한다.

 

 

import cv2 #openCV package
import glob
import os
#from google.colab.patches import cv2_imshow

필요한 라이브러리는 다음과 같다. 

 

 

먼저, 경로는 두가지가 필요하다.

  • 이름을 변경할 이미지들이 담긴 폴더의 경로 
  • 변경할 이름들이 저장된 txt파일

 

if __name__ == "__main__":

    #불러올 파일 경로 
    loadpath_img = '이미지가 담긴 폴더경로'
    loadpath_txt = '파일명이 저장된 텍스트파일 경로'

    #해당 폴더내 파일 가져오기 
    os.chdir(loadpath_img)
    images = glob.glob('./*.png') #폴더 내 png파일 전부

    #폴더내 이미지 순서대로 정렬 
    images.sort()

    #txt파일 읽어오기 
    title_txt = open(loadpath_txt, 'r')

폴더내 파일을 한번에 가져오고 .png파일을 전부 images에 리스트로 저장해둔다.

그리고 중요한 점은 이 이미지들은 정렬이 가능한 순서의 이름을 가지고 있어야 한다는 것이다.

순서대로 정렬이 가능해야 이 코드를 사용할 수 있다. 

(나는 문제이미지를 다루기 때문에, 문제번호 순서대로 정렬되어야 한다.) 

이는 대충 맥북에서 한번에 이름을 00001 ~ 끝번까지 지정가능하니 대충 그걸 사용해서 순서대로 정렬이 가능하게 하도록한다.

 

sort함수를 이용해서 내가 원하는 순서대로 이미지가 정렬되도록 한다.

 

이제 텍스트 파일을 읽기 전용인 "r"로 열어준다.

 

    for i in range(len(images)):#한개의 이미지의 수 만큼 반복  

        #새로운 파일명을 적어둔 txt파일 한줄씩 읽기 
        line = title_txt.readline()
        title = line.replace('\n', '') #엔터 제거 

        #파일을 불러올 경로 
        load_url = loadpath_img + images[i]
        #이름이 변경될 파일을 저장할 경로 
        save_url = loadpath_img + title + '.png' #문제지 
        #save_url = loadpath_img + title + '-ans.png' 답지

        #이름변경 
        os.rename(load_url, save_url)

이미지 수만큼 for문을 반복한다. 

(당연하게도 이미지의 수와 파일명의 수가 같아야 한다.) 이걸 당연하게 생각했으므로, 따로 에러처리는 안했다.

둘이 다르면 당연히 중간에 에러가 날 것 

 

 

 

전체코드

#구글 드라이브와 연동 
from google.colab import drive
drive.mount('/gdrive')

import cv2 #openCV package
import glob
import os
from google.colab.patches import cv2_imshow

if __name__ == "__main__":

    #불러올 파일 경로 
    loadpath_img = '이미지가 담긴 폴더경로'
    loadpath_txt = '파일명이 저장된 텍스트파일 경로'
    
    
    #해당 폴더내 파일 가져오기 
    os.chdir(loadpath_img)
    images = glob.glob('./*.png') #폴더 내 png파일 전부

    #폴더내 이미지 순서대로 정렬 
    images.sort()

    #txt파일 읽어오기 
    title_txt = open(loadpath_txt, 'r')

    for i in range(len(images)):#한개의 이미지의 수 만큼 반복  

        #새로운 파일명을 적어둔 txt파일 한줄씩 읽기 
        line = title_txt.readline()
        title = line.replace('\n', '') #엔터 제거 

        #파일을 불러올 경로 
        load_url = loadpath_img + images[i]
        #이름이 변경될 파일을 저장할 경로 
        save_url = loadpath_img + title + '.png' #문제지 
        #save_url = loadpath_img + title + '-ans.png' 답지

        #이름변경 
        os.rename(load_url, save_url)

단순한 코드이지만, 프로젝트의 일부기 때문에 글 작성 

 

다음과 같이 자동으로 이름이 잘 변경되었다.

사실 수동으로 해도 괜찮겠지만, 경험상 이런 이름을 전체 변경하거나 하는 일은 너무 자주생겨서 그냥 코드로 작성해두고 글을 써두는 것이 미래의 나에게 도움이 된다.

 

728x90

'MATHrone > DEV' 카테고리의 다른 글

[FE] BookList page(2) - 검색창 만들기  (0) 2022.01.24
[DB] PostgreSQL 진행 리뷰  (0) 2022.01.17
[DevOps] Docker - Redis  (0) 2022.01.12
[FE] BookList page(1) - 구조잡기  (0) 2021.12.16
[Dev-ops] Docker setting  (0) 2021.11.18