본문 바로가기
컴퓨터공학 언어/Python

파일 입출력

by KChang 2021. 10. 28.

1. 파일 입출력의 기본

파일 입출력

(1) 파일 열기

  • 읽기용 : 변수명 = open("파일명","r")
  • 쓰기용 : 변수명 = open("파일명","w")

(2) 파일 처리

(3) 파일 닫기

  • 변수명.close();

 

모드(Mode) : open() 함수의 마지막 매개변수

  • 생략 : r과 동일하다.
  • r : 읽기 모드, 기본 값이다.
  • w : 쓰기 모드, 기존에 파일이 있으면 덮어쓴다.
  • r+ : 읽기/쓰기 겸용 모드이다.
  • a : 쓰기 모드, 기존에 파일이 있으면 이어서 쓴다. append의 약어이다.
  • t : 텍스트 모드, 텍스트 파일을 처리한다. 기본값이다.
  • b : 이진 모드, 이진 파일을 처리한다.

 

2. 파일 입력

한 행씩 읽어 들이기

  • readline() 함수 사용
  • 파일로 데이터 입력 후 이를 화면에 출력하는 프로그램
inFp = None # 입력파일
inStr = "" # 읽어온 문자열

inFp = open("data.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()

# 결과
CookBook 파이썬을 공부합니다.
완전 재밌어요
파이썬을 공부하기 잘했네요.
  • cp949는 encoding 하는 방법 중 하나로, 보통 메모장에서 ANSI로 저장하게 되면 이 CP949로 저장되게 되며 'UTF-8' / 'UTF-16' / 'EUC-KR' 등 많은 방법이 있으며 'UTF-8'을 많이 사용한다.
  • python3부터는 ANSI 기준으로 작성된 파일만 읽을 수 있다. UTF-8로 작성된 파일은 보통 방법으로 읽을 때 에러가 난다.
  • f = open(path, 'r', encoding = 'UTF-8')
inFp = None # 입력 파일
inStr = "" # 읽어온 문자열

inFp = open("data.txt","r",encoding="UTF-8")

while True:
    inStr = inFp.readline()
    if inStr == "":
        break
    print(inStr,end = "")

inFp.close()

# 결과
CookBook 파이썬을 공부합니다.
완전 재밌어요
파이썬을 공부하기 잘했네요.

 

  • readlines() 함수 : 파일의 내용을 통째로 읽어서 리스트에 저장
inFp = None # 입력 파일
inStr = "" # 읽어온 문자열

inFp = open("data.txt","r",encoding="UTF-8")

inList = inFp.readlines()
print(inList)
inFp.close()

# 결과
['CookBook 파이썬을 공부합니다.\n', '완전 재밌어요\n', '파이썬을 공부하기 잘했네요.']

 

close()함수를 호출하지 않고 프로그램을 종료하기

with~as문으로 파일을 열시 close()함수를 사용하지 않아도 된다.

with open("C:/Temp/data1.txt","r") as inFp:
    inList = inFp.readlines()
    print(inList)

 

파일의 내용을 한 행씩 출력

inFp = None  # 입력 파일
inStr = ""  # 읽어온 문자열

# fname = input("파일명을 입력하세요 : ")
# inFp = open(fname, "r", encoding="UTF-8")
inFp = open("data.txt", "r", encoding="UTF-8")

inList = inFp.readlines()
for inStr in inList:
    print(inStr, end="")


inFp.close()

# 결과
CookBook 파이썬을 공부합니다.
완전 재밌어요
파이썬을 공부하기 잘했네요.

 

도스 명령어 type의 구현

지정한 파일의 내용을 화면에 출력

type 파일명

 

파일이 없을 때 오류가 발생하지 않게 하려면 os.path.exists(파일명) 형식 사용

import os

inFp = None
fName, inList, inStr = "", [], ""

fName = input("파일명을 입력하세요: ")

if os.path.exists(fName):
    inFp = open(fName, "r", encoding="UTF-8")

    inList = inFp.readlines()
    for inStr in inList:
        print(inStr, end = "")

    inFp.close()
else :
    print("%s 파일이 없습니다"%fName)

# 결과
파일명을 입력하세요: data.txt
CookBook 파이썬을 공부합니다.
완전 재밌어요
파이썬을 공부하기 잘했네요.

 

3. 파일 출력

출력 결과를 파일에 저장하는 방식(파일에 내용 쓸 때 write()나 writelines() 함수 사용)

파일 입출력2

한 행씩 파일에 쓰기

outFp = None
outStr = ""

outFp = open("data2.txt","w")

while True:
    outStr = input("내용 입력 : ")

    if outStr != "":
        outFp.writelines(outStr + "\n")

    else:
        break

outFp.close()
print("---파일에 정상적으로 써졌음 ---")
완료1완료

도스 copy 명령어의 구현

copy 소스파일 타깃파일

chr(i) : 유니코드(Unicode) 값을 입력받아 그 코드에 해당하는 문자를 출력하는 함수이다.

ord(c) : 문자 c의 유니코드 값을 돌려주는 함수이다.

(ord <-> chr)

 

readline()과 readlines() 함수

readlines() 함수 : 파일 용량이 몇 MB정도면 사용

readline() 함수 : 수백 MB가 넘으면 사용

 

간단한 파일 처리

with~as 문을 사용하면 텍스트 파일 복사 소스가 간단해진다.

inFp, outFp = None, None
inStr = ""

with open("C:/Windows/win.ini","r") as inFp:
    with open("C:/Temp/data4.txt", "w") as outFp:
        for inStr in inFp:
            outFp.writelines(inStr)

print("---파일이 정상적으로 복사되었음 ---")

 

4. 이진 파일 입출력

이진(Binary : 바이너리) 파일 : 글자가 아닌 비트(Bit) 단위로 의미가 있는 파일

  • 텍스트 파일을 제외한 나머지 파일
  • 그림 파일, 음악 파일, 동영상 파일, 엑셀 파일, 실행 ExE 파일 등이 모두 이진 파일

텍스트 파일과 이진 파일을 구분하는 간단한 방법(파일을 메모장에서 열기)

  • 열었을 때 글자처럼 보이면 텍스트 파일, 이상하게 보이면 이진 파일

 

이진 파일의 복사

inFp, outFp = None, None
inStr = ""

# 이진 읽기 모드와 쓰기 모드로 파일 열기
inFp = open("C:/Windows/notepad.exe","rb")
outFp = open("notepad.exe","wb")

# 파일의 끝까지 한 바이트씩 읽어서 한 바이트씩 파일에 쓰기
while True:
    inStr = inFp.read(1)
    if not inStr:
        break
    outFp.write(inStr)

inFp.close()
outFp.close()
print("--- 이진 파일이 정상적으로 복사되었음 ---")
notepad
 
 

 

참고자료
  • Python 수업, ch11 파일 입출력과 Exception Handling - 수정

 

'컴퓨터공학 언어 > Python' 카테고리의 다른 글

내부 함수, reduce 함수  (0) 2021.10.27
iterator, generator  (0) 2021.10.27
Algorithm 공부하다 알게된 내용  (0) 2021.10.26
Module과 Package  (0) 2021.10.15
함수  (0) 2021.10.15

댓글