변수명 지정의 자동화가 필요할 땐 globals 함수

히제오·2020년 12월 17일
0

파이썬 til

목록 보기
7/9

데모데이가 끝난지는 한참 됐지만, 너무 바빠 쓰지 못하고 남겨두었던 TIL을 마저 써본다.

히제오의 데모데이 결과물이 궁금하다면, 웹사이트를 방문해보자!

정제되지 않은 JSON 형태의 로그 데이터를 분석 가능한 수준으로 정제하기 위해 파이썬의 for문을 정말 많이 활용해야만 했다. 불과 몇 개월 전만 해도 for문의 작동 원리를 이해하지 못해 끙끙댔는데 정말 장족의 발전.

모든 데이터 추출 과정에서 자동화가 필요했는데 그 이유는 데이터의 양이 정말 방대했기 때문이다...... shift+enter 한 번이면 모든 작업이 동작하도록 하려고 노력했다.

사용했던 데이터 베이스 안에 있는 데이터를 가져오거나, 데이터프레임을 만들어 데이터 베이스에 집어넣는 코드에서는 '문자열 포맷팅'을 정말 많이 사용했다.

예를 들면, 이렇게!

tournament_id = 'tournamanet id'
sql_input = f"SELECT DISTINCT match_id FROM `matches_{tournament_id}` ORDER BY created_at"

'tournament_id' 부분에 실제 id에 해당하는 스트링을 넣어주면 자동으로 아래 {tournament_id} 부분에 입력되어 실행된다.

문제는 이 부분이었다... 변수명 지정은 어떻게 자동화하지?

변수명 지정을 자동화할 필요가 있다고는 생각을 못 했는데, 어떤 단계에 이르니 만들어진 데이터프레임을 따로따로 변수에 지정한 뒤 나중에 한꺼번에 합치는 방식의 로직을 구현할 필요가 발생했다. 그런데...

변수명은 문자열이 아닌데?

그래서 구글에 변수명 루프, 변수명 자동화 등의 키워드로 검색해서 알게 된 함수가 바로 global 함수이다.

변수명을 자동화하는 globals 함수

for x in range(len(match_list)):
	## pickup_df를 만드는 코드 ##
	globals()['pickup_df_{}'.format(x)] = pickup_df

내가 사용한 방식을 먼저 설명해보자면, for문 안에서 pickup_df를 만들어내는 코드를 진행한 후 pickup_df가 특정한 이름 (pickup_df_x)의 변수에 할당되도록 코드를 짰다. 즉, for문의 x번째 데이터프레임 산출물임을 변수명으로 확인할 수 있게 한 것!

globals()를 제일 앞에 붙여준 뒤, 리스트 형태처럼 보이는 [ ]를 바로 뒤에 붙여주고, 그 안에 변수명을 문자열 포맷팅하듯이 써주면 된다!

globals()[ ] 안에서는 문자열 포맷팅의 방식으로 작동하기 때문에, 아래와 같은 형태도 작동 가능.

for (i, dt) in enumerate(date):
    file = open(f"/DATAITGEULS_2020/데글데글_slack분석/{dt}.json","r",encoding='utf-8')
    globals()['json_'+ str(i)] = json.load(file)

여러모로 참 쓸모가 많아서 앞으로도 종종 쓰게 될 것 같다.

profile
삽질 전문가. 모든 일에 진심인 편.

0개의 댓글