본문 바로가기
프로그래밍/Python

python 카카오톡 텍스트파일을 DataFrame으로

by Leeys 2022. 3. 19.
반응형

 

file_path에 카카오톡에서 추출한 txt문서 경로를 넣으면

날짜, 요일, 이름, 채팅내용의 데이터프레임이 추출됩니다.

def katalk_msg_parse(file_path):
    my_katalk_data = list()
    katalk_msg_pattern = "[가-힣a-zA-Z0-9]* [가-힣]{2} [0-9]* [가-힣a-zA-Z0-9]*"
    date_info = " [0-9]{4}년 [0-9]{1,2}[월] [0-9]{1,2}[일] [가-힣]{3}"
    for idx, line in enumerate(open(file_path)):
        line = re.sub('[-=+,#/\?:^$.@*\"※~&%ㆍ!』\\‘|\(\)\[\]\<\>`\'…》]','', line)
        line_list = line.split()

        if idx == 0:
          title = line # 첫번째는 타이틀
          opponent = line_list[0] # 상대방 이름
          continue

        elif idx == 1:
          continue
        
        elif line == '':
          continue

        elif re.match(date_info, line):
          weekday = line_list[3]
          date_foward = re.sub("[가-힣]", '', line)
          line_list = date_foward.split()

          if len(line_list[1]) == 1:
            line_list[1] = '0'+line_list[1]
          if len(line_list[2]) == 1:
            line_list[2] = '0'+line_list[2]
          date_foward = line_list[0] + line_list[1] + line_list[2]
          continue

        elif re.match(katalk_msg_pattern, line):
          if line_list[1] == '오후':
            clock = str(int(line_list[2][:-2]) + 12)
            if clock == '24':
              line_list[2] = '00' + line_list[2][-2:]
            else:
              line_list[2] = clock + line_list[2][-2:]

          if line_list[1] == '오전':
            if len(line_list[2]) == 3:
              line_list[2] = '0'+line_list[2]

          date_time = date_foward.strip() + line_list[2].strip()

          user_name = line_list[0]
          if len(line_list) == 4:
            kakao_txt = line_list[3]
          else:
            continue

          my_katalk_data.append({'date_time': date_time,
                                  'week_day' : weekday,
                                  'user_name': user_name,
                                  'text': kakao_txt
                                  })
        else:
            if len(my_katalk_data) > 0:
                my_katalk_data[-1]['text'] += "\n"+line.strip()

    my_katalk_df = pd.DataFrame(my_katalk_data)
    my_katalk_df['date_time'] = pd.to_datetime(my_katalk_df['date_time'])
    my_katalk_df['year_month'] = my_katalk_df.date_time.map(lambda x: x.strftime('%Y-%m'))
    my_katalk_df['year_month_day'] = my_katalk_df.date_time.map(lambda x: x.strftime('%Y-%m-%d'))
    my_katalk_df['hour'] = my_katalk_df.date_time.dt.hour
    return my_katalk_df
반응형

댓글