Language/Python

파일 입출력

westcold 2024. 12. 5. 21:38

키보드에 입력되는 것을 표준입력

화면에 출력되는 것을 표준출력

키보드+화면 콘솔

 

파일 입출력 기본 과정

파일열기(변수명 = 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()