파이썬으로 파일 사용하기 위한 방법
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)도 가능하다.
파이썬 객체를 저장하는 과정을 피클링(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)
그 외에 다른 언어와 상호 운용성이 필요한 경우, 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 | 바이너리 모드 (읽기, 쓰기, 추가) |
os
와 pathlib
모듈을 사용하여 파일 존재 여부 및 디렉터리 생성을 할 수 있다.
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} 파일이 존재합니다.")
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()