1. 파일
📁 변수는 프로그램을 실행할 때 데이터를 저장하기 좋은 방법
➡️ 그러나 프로그램을 종료한 후에도 데이터를 유지하고 싶다면, 파일 형태로 저장해야 함
1) 파일과 파일 경로
⚡️ 파일에는 파일 이름과 경로라는 두 가지 주요속성이 있다.
ex. 윈도우 운영체제를 사용하는 노트북 컴퓨터의 C:\Users\al\Documents 라는 경로에
project.docx 라는 이름의 파일이 있는 경우
▶️ 파일이름 project.docx는 워드 문서이고 Users, al, Documents는 모두 폴더(디렉토리)
▶️ 폴더 안에는 파일이나 다른 폴더가 들어 있을 수 있음
⚡️ 경로의 C:\는 루트 폴더를 나타내며 모든 폴더가 이 안에 들어 있음
📌 윈도우에서 루트 폴더의 이름은 "C:\"이며, C 드라이브라고 부름.
📌 맥os나 리눅스에서 루트 폴더는 "/"
📌 윈도우, 맥os에서는 폴더이름이나 파일이름의 대소문자를 구분하지 않지만, 리눅스의 경우 이를 구분함
⚡️ 윈도우에서의 폴더 구분은 "\" 백슬러시를 사용하고, 맥 os나 리눅스에서는 "/" 슬러시를 사용함.
# 1) Path 객체 사용.
from pathlib import Path
path = Path('spam', 'bacon', 'eggs') # 운영체제에 맞는 경로 체제를 만들어 줌.
print(path) # spam/bacon/eggs
# 2) platform.system() 함수 사용.
import platform
my_os = platform.system()
print("OS in my system: ", my_os) # OS in my system: Darwin
if my_os == 'Darwin':
print('Mac 운영체제 입니다.')
else:
print('Mac 운영체제가 아닙니다.')
# 현재 작업 디렉토리
print(Path.cwd()) # /Users/Desktop/pycharm/pythonProject/part2
2) 절대 경로와 상대 경로
⚡️ 절대 경로 : 항상 루트 폴더에서 시작하는 경로
⚡️ 상대 경로 : 현재 작업 디렉토리에 대한 경로
📌 '.' : 현재 디렉토리
📌 '..' : 상위 디렉토리
3) 새로운 디렉토리 만들기
⚡️ os.makedirs() 함수로 새로운 디렉토리를 만들 수 있음
⚡️ os.path.isdir(path) : path 인자의 디렉토리가 있는지 확인
import os
path = './test'
if not os.path.isdir(path):
os.makedirs(path) # 현재 작업 폴더 안에 test라는 폴더 생성.
4) 파일 크기와 폴더 내용 확인
⚡️ os.path.getsize(path) : path 인자에 해당하는 파일 크기 반환
⚡️ os.listdir(path) : path에 있는 파일 이름 리스트를 반환
path = './input'
print(os.path.getsize(f'{path}/hello.txt')) # 53
list_dirs = os.listdir(path)
print(list_dirs) # ['연락처.txt', 'hello.txt', '엄마돼지아기돼지.txt']
2. 파일 열기
📁 입출력 파일을 지정하는것을 의미 ( 파일 객체 생성 )
📁 파일 입력과 파일 출력 모두 반드시 파일 열기 작업을 가장 먼저 수행
파일객체 = open(파일명, 모드)
1) 파일명
🚀 입출력 작업을 수행할 파일을 의미
🚀 파일명만 작성할 수도 있고 경로를 함께 작성할 수도 있음
# 파일명만 작성하는 경우 : 파이썬 소스 파일과 같은 경로에 존재하는 경우
open('sample.txt')
# 전체 경로를 작성하는 경우 : 빈도가 적음.
open('C:/sample.txt')
# 현재 디렉터리(.)를 기준으로 경로를 결정
open('./sample.txt')
open('./input/hello.txt')
# 상위 디렉터리(..)를 기준으로 경로를 결정
open('../sample.txt')
2) 모드
r (read) | 읽기 |
w (write) | 쓰기 (새로 쓰기 모드) |
a (append) | 추가 (뒤에 이어서 쓰기 모드) |
x (exclusive) | 배타적 추가 (파일 있으면 오류, 없으면 새로 생성) |
🚀 파일의 종류
- t (text) 텍스트 파일 : 메모장으로 열 수 있는 파일
- b (binary) 바이너리 파일 (텍스트 파일 외의 모든 파일)
3. 파일 닫기
👾 파일을 더 이상 사용하지 않거나 프로그램을 종료하고자 할 때
파일객체.close()
4. 파일 생성
file = open('./output/my_file.txt', 'wt') # 빈파일 생성
print('my_file.txt 파일이 생성되었습니다.')
file.close()
# 텍스트 파일을 새로 만들 수 있는 모드인 wt 모드를 사용하여 my_file.txt라는 이름의
# 텍스트 파일을 output 이라는 디렉토리에 생성하는 코드
🚀 with문
- close() 메소드를 자동으로 호출할 수 있는 문법을 제공
- with문을 사용하면 with문이 끝날 때 언제나 close() 메소드가 자동으로 호출
➡️ 별도의 예외 처리를 하지 않더라도 프로그램이나 파일의 에러로 close()가 호출이 안되는 상황을 방지
# 기본 구성
with open (파일명, 모드) as 파일객체:
파일처리코드
with open('./output/my_file_1.txt', 'wt') as file:
print('my_file_1.txt 파일이 생성되었습니다.')
5. 파일 입출력
📁 파일 입출력 : 컴퓨터에 저장된 파일을 읽어 들이는 것은 물론 파일을 생성해서 컴퓨터에 저장하는 것도 가능
📌 파일 입력 input : 기존의 파일 내용을 읽어 들이는 것
📌 파일 출력 output : 기존 파일에 새로운 내용을 추가하거나 새로운 파일을 생성하는 것
1) 파일 출력 output
# 1. 텍스트 파일 생성하기
file = open('./output/hello.txt', 'wt')
# hello.txt에 글 쓰기.
file.write('안녕하세요.')
file.write('\n') # 줄 바꿈
file.write('반갑습니다.')
file.write('\n')
print('hello.txt 파일이 생성되었습니다.') # 진행 상황을 알기 위해서 화면 출력.
file.close()
# 2. 텍스트 파일에 내용 추가하기
# 기존 파일에 내용을 추가할 수 있는 모드는 a 모드
file = open('./output/hello.txt', 'at')
file.write('Hello.\n')
file.write('Nice to meet you.\n')
print('hello.txt 파일에 새로운 내용이 추가되었습니다.')
file.close()
2) 파일 입력 input
1) read() 메소드
📁 파일로부터 데이터를 읽어 들이는 메소드
📁 텍스트 모드와 바이너리 모드에서 다른 방식으로 동작
file.read(size)
👾 반환값 : 텍스트 모드 - 읽어 들인 문자열, 바이너리 모드 - 읽어 들인 바이트열
👾 매개변수 size : 텍스트 모드- 읽어 들일 최대 문자의 개수, 바이너리 모드- 읽어 들일 최대 바이트 수
👾 매개변수 size 생략 : 파일 전체 읽음
👾 파일의 끝에 도달 : 빈 문자열 ('') 반환
file = open('./input/hello.txt', 'rt', encoding='cp949')
str = file.read() # 파일 전체를 한 번에 읽어 들임
print(str, end='')
file.close()
💡 'encoding = cp949' 는 맥 os 에서 파일 처리할 때 사용
2) readline() 메소드
📁 텍스트 파일을 한 줄씩 읽어서 처리하는 메소드
📁 파일이 종료되어 더 이상 읽어 들일 글자가 없으면 빈 문자열('')을 읽어 들임
📁 반복문을 이용해서 여러 번 읽어 들어야 파일 전체를 읽어 들일 수 있음
file = open('./input/hello.txt', 'rt', encoding='cp949')
while True:
str = file.readline()
if str == '':
break
print(str, end='')
file.close()
3) readlines() 메소드
📁 라인 line 하나가 아니라 전체 라인 lines을 모두 읽어 각 라인 line 단위로 리스트에 저장하는 메소드
file = open('input/hello.txt', 'rt', encoding='cp949')
line_list = file.readlines()
print(line_list) # ['안녕하세요.\n', '반갑습니다.\n', 'Hello.\n', 'Nice to meet you.\n']
for line in line_list:
print(line, end='')
file.close()
# enumrate() 함수를 이용하면 라인 번호 line number 도 함께 출력할 수 있다
file = open('input/hello.txt', 'rt', encoding='cp949')
line_list = file.readlines()
for no, line in enumerate(line_list):
print('{} {}'.format(no + 1, line), end='')
file.close()
# sys 모듈을 이용하면 보다 쉽게 파일을 읽을 수 있다
# sys 모듈에는 표준 입출력을 위한 stdin과 stdout 객체가 포함
# stdout은 출력을 위한 객체이며 화면 출력 메소드인 write()와 writelines() 메소드를 사용할 수 있음
# writelines() 메소드를 사용하면 리스트와 같은 반복 가능한 객체의 각 요소를 한 줄씩 자동으로 출력
import sys
file = open('input/hello.txt', 'rt', encoding='cp949')
line_list = file.readlines()
sys.stdout.writelines(line_list)
file.close()
6. pickle
📁 텍스트가 아닌 자료형 (리스트나 딕셔너리 자료형등)을 저장하기 위한 방식
📁 import pickle을 통하여 모듈 임포트가 필요
📁 pickle로 데이터를 저장하거나 불러올때는 파일을 바이너리 형식으로 읽거나 써야함 (wb, rb)
📁 모든 파이썬 데이터 객체를 저장하고 읽을 수 있음
import pickle
data = {
'a': [1, 2.0, 3, 4 + 6j],
'b': ("character string", "byte string"),
'c': {None, True, False}
}
print(type(data)) # <class 'dict>
# 1. 일반 텍스트 파일 형식을 사용하는 경우.
# 저장
with open('./output/data.txt', 'w') as file:
# file.write(data) # TypeError: write() argument must be str, not dict
file.write(str(data)) # write() 메서드의 인자는 문자열이어야 함.
# 읽기
with open('./output/data.txt', 'r') as file:
data_output = file.read()
print(data_output)
# {'a': [1, 2.0, 3, (4+6j)], 'b': ('character string', 'byte string'),
# 'c': {False, True, None}}
print(type(data_output)) # <class 'str'>
# 2. pickle 방식을 사용하는 경우
# 저장
with open('./output/data.my_pickle', 'wb') as file:
pickle.dump(data, file)
# 읽기
with open('./output/data.my_pickle', 'rb') as file:
data_output = pickle.load(file) # 읽음.
print(data_output)
# {'a': [1, 2.0, 3, (4+6j)], 'b': ('character string', 'byte string'),
# 'c': {False, True, None}}
print(type(data_output)) # <class 'dict'>
print(data_output.get('a')) # [1, 2.0, 3, (4+6j)]
[ 내용 참고 : IT 학원 강의 ]
'Programming Language > Python' 카테고리의 다른 글
[Python] CSV 파일 입출력, reader()/writer(), DictReader()/DictWriter() (2) | 2024.03.04 |
---|---|
[Python] mutable/immutable, % 연산자, 삼항 조건연산자, 지역변수/전역변수 (0) | 2024.03.03 |
[Python] 클래스 변수, 클래스 메소드, 정적 메소드, 상속 (0) | 2024.03.03 |
[Python] 클래스, 객체생성, 인스턴스 변수와 메소드, 생성자 및 소멸자 (0) | 2024.03.03 |
[Python] 모듈 만들기, __name__, __init__.py (0) | 2024.03.03 |