파일 입출력
키보드에 입력되는 것을 표준입력
화면에 출력되는 것을 표준출력
키보드+화면 콘솔
파일 입출력 기본 과정
파일열기(변수명 = open("파일명", "r" or "w"))->파일 읽기 및 파일 쓰기 작업->파일 닫기(변수명.close())
텍스트 파일 입출력
data1.txt
CookBook 파이썬을 공부합니다.
완전 재미있어요. ^^
파이썬을 공부하기 잘했네요~~
Code11-01.py
inFp = None
inStr = ""
inFp = open("ch11/data1.txt", "r", encoding="utf-8")
inStr = inFp.readline()
print(inStr, end = "")
inStr = inFp.readline()
print(inStr, end = "")
inStr = inFp.readline()
print(inStr, end = "")
inFp.close()
-.readline():한행씩 읽어 inFp 파일에 집어 넣는다
Code11-02.py
inFp = None
inStr = ""
inFp = open("ch11/data1.txt", "r", encoding="utf-8")
while True:
inStr = inFp.readline()
if inStr == "" :
break
print(inStr, end = "")
inFp.close()
selfstudy11-1.py
inFp = None
inStr = ""
line_number = 1
inFp = open("ch11/data1.txt", "r", encoding="utf-8")
while True:
inStr = inFp.readline()
if inStr == "":
break
print("%d %s" % (line_number, inStr), end="")
line_number += 1
inFp.close()
Code11-03.py
inFp = None
inStr = ""
inFp = open("ch11/data1.txt", "r", encoding="utf-8")
inList = inFp.readlines()
print(inList)
inFp.close()
-readlines():통째로 읽어서 저장
Code11-04.py
inFp = None
inList, inStr = [],""
inFp = open("ch11/data1.txt", "r", encoding="utf-8")
inList = inFp.readlines()
for inStr in inList:
print(inStr, end= "")
inFp.close()
selfstudy11-2.py
inFp = None
inList, inStr = [], ""
inFp = open("ch11/data1.txt", "r", encoding="utf-8")
inList = inFp.readlines()
for line_number, inStr in enumerate(inList, start=1):
print("%d %s" % (line_number, inStr), end="")
inFp.close()
Code11-05.py
inFp = None
fName, inList, inStr = "", [],""
fName = input("파일명을 입력하세요 : ")
inFp = open(fName, "r", encoding="utf-8")
inList = inFp.readlines()
for inStr in inList:
print(inStr, end= "")
inFp.close()
Code11-06.py
import os
inFp = None
fName, inList, inStr = "", [], ""
fName = input("파일명을 입력하세요: ")
if os.path.exists(fName): # 파일 존재 여부 확인
inFp = open(fName, "r") # 파일 열기
inList = inFp.readlines() # 파일 내용 읽기
for inStr in inList: # 읽은 내용 출력
print(inStr, end='')
inFp.close() # 파일 닫기
else:
print(f"{fName} 파일이 없습니다.")
-파일이 없는 경우는 오류 발생하지 않기 위해 os.path.sxists(파일명) 형식을 사용
파일을 이용한 출력
data2.txt
야야야ㅑ
하하하
마마마
Code11-07.py
outFp= None
outStr= None
outFp = open("ch11/data2.txt", 'w',encoding="utf-8") #w는 덮어쓰기
while True:
outStr = input("내용 입력 : ")
if outStr != "" :
outFp.writelines(outStr+ "\n")
else:
break
outFp.close()
print("--- 정상적으로 파일에 씀 ---")
-파일 내용을 쓸때는 write() / witelines()함수 사용
selfstudy11-3.py
outFp = None
outStr = None
outFname = input("저장할 파일명을 입력하세요: ")
outFp = open(outFname, 'w', encoding="utf-8") # 'w'는 덮어쓰기
while True:
outStr = input("내용 입력 : ")
if outStr != "":
outFp.writelines(outStr + "\n")
else:
break
outFp.close()
print("--- 정상적으로 파일에 씀 ---")
복사
Code11-08.py
inFp, outFp = None, None
inStr = ""
inFp = open("C:/Windows/win.ini", "r")
outFp = open("C:/Temp/data3.txt", "w")
inList = inFp.readlines()
for inStr in inList:
outFp.writelines(inStr)
inFp.close()
outFp.close()
print("-- 파일이 정상적으로 복사되었습니다. --")
selfstudy11-4.py
inFp, outFp = None, None
inStr = ""
inFname = input("소스 파일명을 입력하세요: ")
outFname = input("타깃 파일명을 입력하세요: ")
inFp = open(inFname, "r")
outFp = open(outFname, "w")
inList = inFp.readlines()
for inStr in inList:
outFp.writelines(inStr)
inFp.close()
outFp.close()
print(f"--- {inFname} 파일이 {outFname} 파일로 복사되었음 ---")
Code11-09.py
#변수 선언 부분
inFp, outFp = None, None
inStr, outStr = '', ''
i =0
secu = 0
#메인코드 부분
secuYN = input("1. 암호화 2. 암호 해석 중 선택 : ")
inFname = input("입력 파일명을 입력하세요: ")
outFname = input("출력 파일명을 입력하세요: ")
if secuYN == "1":
secu = 100 # 암호화
elif secuYN == "2":
secu = -100 # 복호화
inFp = open(inFname, 'r', encoding='utf-8')
outFp = open(outFname, 'w', encoding='utf-8')
while True:
inStr = inFp.readline() # 한 줄씩 읽기
if not inStr:
break # 더 이상 읽을 내용이 없으면 종료
outStr = '' # 출력 문자열 초기화
for i in range(len(inStr)):
ch = inStr[i]
chNum = ord(ch) # 문자 -> 숫자 변환
chNum = chNum + secu # 암호화/복호화
ch2 = chr(chNum) # 숫자 -> 문자 변환
outStr = outStr + ch2 # 결과 문자열에 추가
outFp.write(outStr) # 출력 파일에 기록
outFp.close()
inFp.close()
print('%s -> %s 변환 완료' % (inFname, outFname))
-ord():문자->숫자
-chr():숫자->문자
이진파일 입출력
이진파일은 텍스트 파일을 제외 한 나머지 파일(비트 단위로 의미가 있는 파일)
Code11-10.py
inFp, outFp = None, None
inStr = ""
inFp = open("C:/Windows/notepad.exe", "rb")
outFp = open("C:/Temp/notepad.exe", "wb")
while True:
inStr = inFp.read(1)
if not inStr:
break
outFp.write(inStr)
inFp.close()
outFp.close()
print("--- 이진 파일이 정상적으로 복사되었음 ---")
-이진파일 복사
-"rb"/"wb"
Code11-11.py
from tkinter import *
# 변수 선언 부분
window = None
canvas = None
XSIZE, YSIZE = 256, 256
# 메인 코드 부분
window = Tk() # 창 생성
canvas = Canvas(window, height=XSIZE, width=YSIZE) # 캔버스 생성
canvas.pack() # pack() 메소드 호출 오류 수정
window.mainloop() # mainloop() 메소드 호출 오류 수정
Code11-12.py
from tkinter import *
# 함수 선언 부분
def loadImage(fname):
global inImage, XSIZE, YSIZE
fp = open(fname, 'rb') # 파일을 이진 모드로 열기
for i in range(0, XSIZE):
tmpList = []
for k in range(0, YSIZE):
data = int(ord(fp.read(1)))
tmpList.append(data)
inImage.append(tmpList)
fp.close()
def displayImage(image):
global XSIZE, YSIZE
rgbString = ""
for i in range(0, XSIZE):
tmpString = ""
for k in range(0, YSIZE):
data = image[i][k] #
tmpString += "#%02x%02x%02x " % (data, data, data)
rgbString += "{" + tmpString + "} "
paper.put(rgbString)
# 전역 변수 선언 부분
window = None
canvas = None
XSIZE, YSIZE = 256, 256
inImage = []
# 메인 코드 부분
window = Tk()
window.title("흑백 사진 보기")
canvas = Canvas(window, height=XSIZE, width=YSIZE)
paper = PhotoImage(width=XSIZE, height=YSIZE)
canvas.create_image((XSIZE / 2, YSIZE / 2), image=paper, state="normal")
# 파일 --> 메모리
filename = 'ch11/gif/tree.raw'
loadImage(filename)
# 메모리 --> 화면
displayImage(inImage)
canvas.pack()
window.mainloop()
예외처리
Code11-13.py
myStr = "파이썬은 재미 있어요. 파이썬만 매일매일 공부하고 싶어요. ^^"
strPosList = []
index = 0
while True:
index = myStr.index("파이썬", index)
strPosList.append(index)
index = index + 1
print("파이썬 글자 위치 -->", strPosList) #실행될 수가 없기에(무한) 희미하게 보인다.
Code11-14.py
myStr = "파이썬은 재미 있어요. 파이썬만 매일매일 공부하고 싶어요. ^^"
strPosList = []
index = 0
while True:
try:
index = myStr.index("파이썬", index)
strPosList.append(index)
index = index + 1
except :
break
print("파이썬 글자 위치 -->", strPosList)
Code11-15.py
num1 = input("숫자1 --> ")
num2 = input("숫자2 --> ")
try :
num1 = int(num1)
num2 = int(num2)
while True :
res = num1/num2
except ValueError:
print("문자열은 숫자로 변환할 수 없습니다.")
except ZeroDivisionError :
print("0으로 나눌 수 없습니다")
except KeyboardInterrupt :
print("Ctrl+C를 눌렀군요.")
Code11-16.py
num1 = input("숫자1 --> ")
num2 = input("숫자2 --> ")
try :
num1 = int(num1)
num2 = int(num2)
except :
print("오류가 발생했습니다.")
else :
print(num1, "/", num2, "=", num1/num2)
finally :
print("이 부분은 무조건 나옵니다.")
-try문에서 오류가 발생하면 except문 실행되며, 오류가 발생하지 않으면 else 문이 실행이된다. finally문은 오류가 발생하든 그렇지 않든 무조건 실행된다.
selfstudy11-5.py
from tkinter import *
from tkinter import filedialog, messagebox
# 함수 선언 부분
def loadImage(fname):
global inImage, XSIZE, YSIZE
try:
# 파일을 이진 모드로 열기
with open(fname, 'rb') as fp:
for i in range(0, XSIZE):
tmpList = []
for k in range(0, YSIZE):
data = int(ord(fp.read(1)))
tmpList.append(data)
inImage.append(tmpList)
except Exception as e:
messagebox.showerror("오류", f"처리에 실패했습니다: {e}")
return False
return True
def displayImage(image):
global XSIZE, YSIZE
rgbString = ""
for i in range(0, XSIZE):
tmpString = ""
for k in range(0, YSIZE):
data = image[i][k]
tmpString += "#%02x%02x%02x " % (data, data, data)
rgbString += "{" + tmpString + "} "
paper.put(rgbString)
# 전역 변수 선언 부분
window = None
canvas = None
XSIZE, YSIZE = 256, 256
inImage = []
# 메인 코드 부분
window = Tk()
window.title("흑백 사진 보기")
canvas = Canvas(window, height=XSIZE, width=YSIZE)
paper = PhotoImage(width=XSIZE, height=YSIZE)
canvas.create_image((XSIZE / 2, YSIZE / 2), image=paper, state="normal")
# 파일 선택 대화상자 띄우기
filename = filedialog.askopenfilename(title="이미지 파일 선택", filetypes=[("Raw files", "*.raw"), ("All files", "*.*")])
if filename:
# 파일 로딩 시도
if loadImage(filename):
# 성공적으로 이미지 로드된 경우
displayImage(inImage)
messagebox.showinfo("성공", f"{filename} 파일이 정상적으로 처리되었습니다.")
else:
# 파일 선택이 없을 경우
messagebox.showwarning("경고", "파일이 선택되지 않았습니다.")
# 종료 메시지 출력
messagebox.showinfo("종료", "수고하셨습니다.")
# 화면에 표시
canvas.pack()
window.mainloop()