파이썬 파일 입출력 마스터하기: 파이썬 모드, Pickle, Json

미남잉·2025년 1월 15일
0

파이썬으로 파일 사용하기 위한 방법

파일 읽기

file = open('hi.txt', 'w') # 쓰기 모드(w)
file.write('hello')
file.close()
file = open('hi.txt', 'r') # 읽기 모드(r)
s = file.read()
print(s)
file.close()

실행 결과

hello 

자동으로 파일 객체 닫기

with open(파일이름, 파일모드) as 파일객체:
	code
with open('hi.txt', 'r') as file:
	s = file.read()
    print(s)

실행 결과

hello

with as를 사용하면 read로 읽은 뒤, close를 사용하지 않아도 파일 객체가 자동으로 닫힌다.

read를 통해 파일을 읽을 수 있지만, 만약 파일이 없는 경우 예외 처리를 추가 할 수 있다.

try:
    with open("nonexistent.txt", "r") as file:
        content = file.read()
except FileNotFoundError:
    print("파일이 존재하지 않습니다!")

try-except 구문을 사용하였다.

리스트에 들어 있는 문자열을 파일에 쓰기

writelines를 사용하여 문자열을 파일에 쓸 수 있다. 리스트 각 문자열 끝에 개행 문자 \n을 사용하여 한 줄씩 작성할 수 있다.

파일객체.writelines(문자열리스트)

lines = ['안녕하세요 \n', '저는 \n', '미남 벨로그입니다.\n']

with open('hi.txt', 'w') as file:
	file.writelines(lines)

시행 결과

안녕하세요
저는
미남 벨로그입니다.

반대로 파일의 내용을 한 줄씩 리스트로 가져올 수 있다. 이때는 readlines를 사용하면 된다.

with open('hi.txt', 'r') as file:
	file.readlines()
    print(lines)

시행 결과

['안녕하세요 \n', '저는 \n', '미남 벨로그입니다.\n']

한 줄씩 읽는 방법은 readline이 있다.

변수 - 파일객체.readline()

with open('hi.txt', 'r') as file:
	for line in file:
    	print(line.strip('\n'))
안녕하세요
저는
미남 벨로그입니다.

for문을 사용하여 간단하게 파일 내용을 한 줄씩 읽었다.

파일 객체는 iterator이기 때문에 변수 여러 개에 저장하는 언패킹(unpacking)도 가능하다.

파이썬 객체 저장 (pickle)

파이썬 객체를 저장하는 과정을 피클링(pickling)이라고 하고, 객체를 얻어오는 과정을 언피클링(unpickling)이라 한다.

pickle은 파이썬에서 데이터를 저장하거나 읽어올 때 사용하는 모듈로, 객체를 바이트 스트림으로 파일에 저장하거나 불러올 수 있다.

파이썬 객체인 리스트, 딕셔너리, 사용자 정의 객체 등 쉽게 저장하고 복원할 수 있다.

객체를 저장하기 위해선 pickle.dump(저장할 데이터, 파일 객체)를 사용하여데이터를 바이너리 파일에 저장한다.

import pickle

# 저장할 데이터 (예: 리스트)
data_to_save = [1, 2, 3, {"a": 10, "b": 20}]

# 파일에 저장
with open("data.pkl", "wb") as file:  # 'wb'는 쓰기 모드로 바이너리 파일을 엽니다.
    pickle.dump(data_to_save, file)

print("데이터가 저장되었습니다.")

wb은 읽기와 바이너리 모드가 합쳐진 것으로 바이너리 데이터를 파일에 저장하기 위해 쓰기 모드로 파일을 여는 것을 의미한다.

이제 pickle로 데이터를 읽어오기 위해서 pickle.load(파일 객체)를 사용한다.

import pickle

# 파일에서 데이터 읽기
with open("data.pkl", "rb") as file:  # 'rb'는 읽기 모드로 바이너리 파일을 엽니다.
    loaded_data = pickle.load(file)

print("불러온 데이터:", loaded_data)

로 불러올 수 있으며, rb도 바이너리 모드로 쓰는 것이 가능하다.

아래 코드로 딕셔너리 데이터를 dump로 저장하고, load로 데이터를 읽어올 수 있다.

import pickle

# 예시 데이터
example_data = {
    "name": "Alice",
    "age": 25,
    "skills": ["Python", "Machine Learning", "Data Science"]
}

# 데이터를 저장
with open("example.pkl", "wb") as file:
    pickle.dump(example_data, file)
    print("데이터가 성공적으로 저장되었습니다!")

# 데이터를 읽기
with open("example.pkl", "rb") as file:
    loaded_data = pickle.load(file)
    print("읽어온 데이터:", loaded_data)

json과 비교하기

그 외에 다른 언어와 상호 운용성이 필요한 경우, pickle보다 json이 더 유용하다.

import json

# 데이터 저장
data = {"name": "Alice", "age": 25, "skills": ["Python", "ML"]}
with open("data.json", "w") as file:
    json.dump(data, file)

# 데이터 읽기
with open("data.json", "r") as file:
    loaded_data = json.load(file)

print(loaded_data)

pickle과 비교했을 때 단점은 사용자 정의 객체 직렬화가 불가능하다는 점이다.

파일 읽고 쓰기 모드

모드설명
r읽기 전용 (파일이 없으면 오류 발생)
w쓰기 전용 (파일이 없으면 새로 생성)
a추가 쓰기 (파일 끝에 내용을 추가)
r+읽기/쓰기 (파일이 없으면 오류 발생)
w+읽기/쓰기 (기존 내용 삭제 후 새로 작성)
a+읽기/쓰기 (기존 내용 유지 및 추가 작성)
rb, wb, ab바이너리 모드 (읽기, 쓰기, 추가)

파일 존재 여부 확인

ospathlib 모듈을 사용하여 파일 존재 여부 및 디렉터리 생성을 할 수 있다.

import os

if os.path.exists('example.pkl'):
	print('파일 존재')
else:
	print('파일 존재하지 않음')

디렉터리 생성은 makedirs로 할 수 있다. 리눅스의 mkdir와 같다.

import os

os.makedirs("new_folder", exist_ok=True)  # 이미 존재하면 무시

이미 존재하면 무시한다는 설정이 True이다.

pathlib을 통해서도 경로 관리가 가능하다.

from pathlib import Path

path = Path("example.pkl")
if path.exists():
    print(f"{path} 파일이 존재합니다.")

압축 파일 zipfile로 관리

import zipfile

# 파일 압축
with zipfile.ZipFile("archive.zip", "w") as zf:
    zf.write("example.pkl")
    zf.write("data.json")

# 파일 해제
with zipfile.ZipFile("archive.zip", "r") as zf:
    zf.extractall("extracted_files")

인코딩 처리

가끔 읽어오는 파일의 인코딩 처리가 필요한 경우가 있다.

with open("example.txt", "r", encoding="utf-8") as file:
    content = file.read()
profile
Computer Vision Engineer

0개의 댓글