어제 오늘 내일

[Python 실전] 여러 텍스트 파일을 하나의 딕셔너리로 병합하기 본문

IT/Python

[Python 실전] 여러 텍스트 파일을 하나의 딕셔너리로 병합하기

hi.anna 2026. 7. 18. 09:43

여러 파일을 다룰 때는 1) 어떤 파일들을 읽을지 목록을 만들고, 2) 각 파일을 열어 데이터를 추출한 뒤, 3) 메인 딕셔너리에 추가하는 순서로 진행합니다.


1.  라이브러리로 파일 목록 한 번에 가져오기

glob 모듈을 사용하면 특정 폴더 안에 있는 모든 .txt 파일을 필터링해서 리스트로 가져올 수 있습니다.

📌 예제 코드: 폴더 내 모든 파일 취합

import glob
import os

# 1. 'data' 폴더 안의 모든 .txt 파일 경로를 가져옵니다.
file_list = glob.glob("data/*.txt")

all_data = {}

for file_path in file_list:
    # 2. 파일 이름만 추출해서 딕셔너리의 키(Key)로 사용 (예: 'student1')
    file_name = os.path.basename(file_path).replace(".txt", "")

    with open(file_path, "r", encoding="utf-8") as f:
        # 3. 파일 내용을 읽어 딕셔너리의 값(Value)으로 저장
        # 여기서는 파일 전체 내용을 저장하거나, 줄별로 파싱할 수 있습니다.
        all_data[file_name] = f.read().strip()

print(f"총 {len(all_data)}개의 파일을 합쳤습니다.")

2. 파일별 데이터를 '중첩 딕셔너리'로 합치기

단순히 내용 전체를 읽는 게 아니라, 각 파일 안에 들어있는 Key: Value 쌍들을 모아 하나의 큰 중첩 딕셔너리로 만드는 방식입니다.

📌 예제 코드: 상세 데이터 병합

import glob

# 예: 학생별 성적 파일들이 여러 개 있을 때
all_students_scores = {}

for file_path in glob.glob("scores/*.txt"):
    student_name = os.path.basename(file_path).split(".")[0]

    current_scores = {}
    with open(file_path, "r", encoding="utf-8") as f:
        for line in f:
            if ":" in line:
                subject, score = line.strip().split(":")
                current_scores[subject.strip()] = int(score.strip())

    # 학생 이름을 키로, 성적 딕셔너리를 값으로 저장
    all_students_scores[student_name] = current_scores

# 결과: {'철수': {'국어': 90, '수학': 85}, '영희': {'국어': 95, '수학': 100}}
print(all_students_scores)

3. 중복된 키가 있을 때 안전하게 합치기 ()

여러 파일에 동일한 키(예: 동일 인물의 다른 날짜 기록)가 있을 때, 데이터가 덮어씌워지지 않고 리스트 형태로 쌓이게 하려면 defaultdict가 가장 좋습니다.

from collections import defaultdict
import glob

# 날짜별 판매 기록 파일을 합칠 때
total_sales = defaultdict(list)

for file_path in glob.glob("sales/*.txt"):
    with open(file_path, "r", encoding="utf-8") as f:
        for line in f:
            item, amount = line.strip().split(",")
            # 같은 품목이 나와도 리스트에 계속 추가됨
            total_sales[item].append(int(amount))

# 결과: {'사과': [10, 5, 12], '포도': [3, 8]}

📝 핵심 요약

  1. glob.glob("경로/*.txt"): 원하는 확장자 파일만 쏙쏙 골라 리스트로 만든다.
  2. os.path.basename(): 파일의 전체 경로에서 파일 이름만 추출할 때 유용하다.
  3. 병합 전략: 파일 이름을 키로 쓸지, 파일 내부의 데이터를 누적할지에 따라 일반 딕셔너리 또는 defaultdict를 선택한다.

 

반응형
Comments