프로그램에서 만든 데이터를 반영구 저장을 하기 위해서는 하드디스크에 파일 형태로 저장을 해야한다. 우리가 사용하는 파일들은 이렇게 저장되는 것이다.
파일을 열기 위해서는 open() 함수를 이용하고, 작업이 종료되면 close()를 호출해 파일을 닫아야 한다.
| 파일 모드 | 모드 이름 | 설명 |
|---|---|---|
| "r" | 읽기 모드 | 파일을 처음부터 읽는다. |
| "w" | 쓰기 모드 | 파일을 처음부터 작성한다.(없으면 생성) - 기존 데이터는 지워짐 |
| "a" | 추가 모드 | 파일의 끝에 추가적으로 작성한다.(없으면 생성) |
| "r+" | 읽기와 쓰기 모드 | 파일을 읽고 쓸 수 있다. seek()를 통해 모드를 변경한다. |
f = open("test.txt","w")
f.write("Hello World!!")
f.close()
#test.txt파일에 Hello World!!라고 되어있음
f = open("test.txt","r")
f.read() #f는 파일 객체 자체를 받아오는 것이기 때문에 내용을 보기 위해서는 read해줘야 함
print(f)#Hello World!!
f.close()
f = open("test.txt","a")
f.write("Im Yoon")
f.close() #Hello Wolrd!! Im Yoon
파일을 열고 close()하는 과정은 사실 까다롭다고 할 수 있다. 그렇기 때문에 with문으로 여는 방법이 있다.
with open("test.txt","w") as f:
f.write("Im a student\n")
#Im a student\n
파일 읽고 쓰는 것을 이용해 간단한 행맨, 단어 맞추기 게임을 만들어 보겠다.
import random
import os
#파일 위치를 정확하게 찾기 위해 os.path.join을 사용
file_path = os.path.join(os.path.dirname(__file__), 'words.txt')
#사용자의 입력이 guesses에 저장되고, 턴 수를 설정해줌
guesses = ''
#턴을 20으로 해준다
turns = 20
#파일을 경로에 맞게 연다 - words.txt
infile = open(file_path, 'r')
#파일 내용을 리스트로 저장한다.
lines = infile.readlines()
#리스트에서 랜덤으로 단어를 선택하고, 줄바꿈 문자를 제거해준다.
target_word = random.choice(lines).strip()
while turns > 0:
failed = 0
#단어의 글자를 하나씩 확인하며, 사용자가 맞춘 글자를 출력해준다.
for char in target_word:
if char in guesses:
#사용자가 입력한 guessus에 chr이 포함되어 있으면 출력
print(char, end='')
else:
#포함되어 있지 않으면 _를 출력
print('_', end='')
failed += 1
if failed == 0:
#모든 글자를 맞추면 게임 종료
print('\nYou won')
break
print("")
#단어 하나만 입력받기 위함
while True:
guess = input('guess a character: ')
#알파벳 단어 하나인지 검사, 아니라면 다시 입력
if guess.isalpha() and len(guess) == 1:
break
else:
print("Please enter a single English letter.")
#사용자가 입력한 글자를 guesses에 저장
guesses += guess
if guess not in target_word:
#못맞추면 턴 -1
turns -= 1
print('Wrong! You have', turns, 'more guesses\n')
#턴이 0이 되면 게임 종료
if turns == 0:
print('You lose!!!! The answer is', target_word)
break
파일에 미리 여러 단어들을 넣어두고 랜덤으로 불러와서 게임을 진행하는 방식이다.
import csv
f = open('test.csv')
data = csv.reader(f)
for row in data:
print(row)
f.close()
import os
os.getcwd() #cwd = current working directory
os.getcwdb() #바이트 형태로 가져옴
# /home/user/projects
# b'/home/user/projects'
chdir()메서드를 통해 현재 작업중인 디렉토리의 위치를 변경할 수 있다.
import os
# 현재 작업 디렉토리 출력
print("현재 작업 디렉토리:", os.getcwd())
# 새로운 작업 디렉토리로 변경
new_directory = '/path/to/new/directory'
os.chdir(new_directory)
# 변경된 작업 디렉토리 출력
print("변경된 작업 디렉토리:", os.getcwd())
listdir()메서드를 이용해 현재 디렉토리 내의 모든 파일을 리스트로 가져올 수 있다.
items = os.listdir(current_directory_path)
다음은 디렉토리에 있는 파일중에서 사진 파일만 가져오는 코드다
import os
cwd = os.getcwd()
files = cwd.listdir()
for name in files:
if os.path.isfile(name): #파일인지 아닌지 확인
if name.endswith('.jpg','.jpng','png'):
print(name)
os.mkdir('test')
#이름 변경
os.rename('test','test2')
#파일 삭제
os.remove('test2')
os.rmdir('test2') #rmdir은 빈 디렉토리만 제거할 수 있다.
infile = open(filename,"rb") #이진 파일에서 데이터를 읽는 방법
bytesArray = infile.read(8) # 입력 파일에서 8 바이트를 읽는 방법
byte1 = bytesArray[0] #첫번째 바이트를 꺼냄
outfile = open(filename,"wb") #쓰기 모드
bytesArray = bytes([255,128,0,1]) #바이트 생성
outfile.write(bytesArray)#바이트 쓰기
outfile.close() # 파일 닫기
##"ab"로 열면 추가 모드임
#파일 포인터를 이동시키는 코드
file.seek(offset,whence)
# offset : 이동할 바이트 수, 양수면 현재 위치에서 앞으로 이동, 음수면 뒤로 이동
# whence : 기준 위치를 정한다. 0(파일의 시작), 1(현재 위치), 2(파일의 끝)
file.seek(0,0) -> 맨 앞으로 이동 시킨다
infile = open("filename1.png","rb")
outfile = open("filename2.png","wb")
while True:
copy_buffer = infile.read(1024)
if not copy_buffer:
break
outfile.write(copy_buffer)
infile.close()
ourfile.close()
print(filename1 + "를" + filename2 + "로 복사했습니다.")
Pickle모듈은 파이썬에서 객체를 직렬화, 역직렬화 하는데 사용되는 표준 라이브러리 이다.
직렬화 : 객체를 바이트 스트림으로 변환하에 파일에 저장하거나 통신 가능
역직렬화 : 직렬화를 다시 푸는것.
pickle.dump(obj, file): 객체 obj를 파일 file에 직렬화하여 저장
pickle.load(file): 파일 file에서 직렬화된 객체를 읽어와서 역직렬화.
pickle.dumps(obj): 객체 obj를 바이트 스트림으로 직렬화.
pickle.loads(bytes): 바이트 스트림 bytes를 역직렬화하여 원래의 객체로 복원.
import pickle
gameOption = {
"Sound": 8,
"VideoQuality": "HIGH",
"Money": 100000,
"WeaponList": ["gun", "missile", "knife" ]
}
file = open( "save.p", "wb" ) # 이진 파일 오픈
pickle.dump( gameOption, file ) # 딕셔너리를 피클 파일에 저장
file.close() # 파일을 닫는다.
import pickle
file = open( "save.p", "rb" ) # 이진 파일 오픈
obj = pickle.load(file) # 피클 파일에 딕션너리를 로딩
print(obj)
예외처리는 프로그램의 실행을 계속할 수 있는 다른 경로를 제공해 주는 것이다.
try-catch는 가장 대표적인 예외처리 방법이다. try블록 안에 있는 코드를 실헹하다가 문제가 발생하면 throw하고 그걸 catch가 받아서 프로그램을 계속 실행하는 것이다.
while True:
try:
n = input("숫자를 입력하세요: ")
n = int(n)
break
except ValueError:
print("정수가 아닙니다. 다시 입력하세요")
print("정수 입력 성공")
zipfile 모듈은 파이썬에서 ZIP 파일을 읽고 쓰는데 사용되는 표준라이브러리이다.
import zipfile
# ZIP 파일 생성
with zipfile.ZipFile('example.zip', 'w') as z:
# 파일 추가
z.write('file1.txt')
z.write('file2.txt')
import zipfile
# ZIP 파일 열기
with zipfile.ZipFile('example.zip', 'r') as z:
# 파일 목록 출력
print(z.namelist())
# 특정 파일 읽기
with z.open('file1.txt') as file:
content = file.read()
print(content.decode('utf-8')) # 파일 내용 출력
extractall()메서드를 이용한다.
import zipfile
# ZIP 파일 압축 해제
with zipfile.ZipFile('example.zip', 'r') as z:
z.extractall('extracted_files') # 'extracted_files' 폴더에 압축 해제
# ZIP 파일에서 특정 파일 압축 해제
with zipfile.ZipFile('example.zip', 'r') as z:
z.extract('file1.txt', 'extracted_files') # 'file1.txt'만 압축 해제