파일 입출력을 알기 전에

파일 입출력을 알기 전에 알아야 하는 개념이 있다.

 

파일의 논리적 구조

  • 파일 안에는 byte들이 순차적으로 저장되어 있다.
  • 파일의 맨 끝에는 EOF(end-of-file)마커가 있다.

파일 포인터

파일의 입출력 동작이 발생하는 위치를 파일 포인터라고 한다.

  • 파일을 처음 열면, 파일 포인터는 파일의 첫 번째 바이트를 가리킨다.
  • 파일의 내용을 읽거나 쓰면 파일 포인터는 자동으로 업데이트(다음 바이트를 가리킴)된다.

파일 열고 닫기

파일 열기

open()함수를 이용하여 파일을 열 수 있다.

close()함수를 이용하여 파일을 닫을 수 있다.

  • open() : 파일의 이름을 받아서 파일 객체를 생성한 후 이를 반환
  • close() : 파일 객체가 가지고 있는 close()메소드 호출 시 파일 닫힘

open()함수로 파일을 열 때, 어떤 모드로 작업을 할 것인지 명시해야 한다.

파일 모드 모드 이름 설명
r 읽기 모드 처음 부터 읽는다
w 쓰기 모드 처음부터 쓴다. 파일이 없으면 생성된다. 파일이 존재하면 기존의 내용은 지워진다.
a 추가 모드 파일의 끝에 쓴다. 파일이 없으면 생성된다.
r+ 읽기와 쓰기 모드 파일에 읽고 쓸 수 있는 모드이다. 모드를 변경하려면 seek()가 호출 되어야 함
file = open("input.txt", "r") #파일 열기(읽기 모드)
#명령
file.close() #파일을 열었으면 꼭 닫아주자

 

파일 닫기

파일 닫기는 기본적으로 close() 메소드를 이용하여 이루어지지만, 파일을 닫지 않았을 때, 닫히지 않은 파일 때문에 메모리가 계속 낭비되니 꼭 닫아줘야 한다. 아래의 내용은 프로그래머가 실수로 파일을 열고 닫지 않는 것을 방지하는 구문이다.

 

try - finally 구문 사용

파일을 열 때 오류가 발생되었을 때 사용한다.

finally구문은 오류가 나든 안 나든 무조건 실행되니, 파일을 확실히 닫을 수 있다.

try: # 예외가 발생할 가능성이 있는 작업들을 여기에  둔다.
     infile  = open("input.txt", "r", encoding = "UTF8") #input이 같은 위치에 있다 가정
     #여러가지 파일 처리 작업 코드 작성
finally:# try블록에서 예외 발생시 프로그램 종료 전 반드시  실행된다.
     infile.close( )

 

with구문 사용

with 명령문 내의 블록이 종료될 때 파일이 자동으로 닫힘

close() 메소드 호출이 필요 없다

with open("input.txt", "r", encoding = "UTF8") as infile:
    line = infile.readline().rstrip()
    while line != "" :
        print(line)
        line = infile.readline()

 

 

파일 읽고 쓰기

파일 읽기

한 줄씩 읽기

파일을 열었다면 readline 메소드를 이용하여 한 줄씩 읽을 수 있다.

파일 포인터는 파일의 첫 위치에 있다가 readline 메소드 실행 시 다음 줄로 이동한다.

infile  = open("input.txt", "r", encoding = "UTF8") #input이 같은 위치에 있다 가정
line = infile.readline()
while line != "" :
    print(line)
    line = infile.readline()
#출력 결과
#홍길동
#
#김철수

코드에 보이는 encoding = "UTF8"은 뒤에서 설명하겠다.

이런 식으로 코드를 작성하면 출력 결과와 같이 줄 바꿈이 같이 출력된다.

그 이유는 line 변수 안에 줄 바꿈(\n)이 포함되어 있어서 그런 것이다.

이럴 때는 아래의 코드로 변경해보자

infile  = open("input.txt", "r", encoding = "UTF8") #input이 같은 위치에 있다 가정
line = infile.readline().rstrip() #rstrip을 이용하여 오른쪽에 줄바꿈 문자와 같은 공백 제거
while line != "" :
    print(line)
    line = infile.readline().rstrip()
#출력 결과
#홍길동
#김철수

 

encoding = "UTF8" -> 인코딩 방식 설정
인코딩(Encoding)은 문자를 바이트로 변환하는 것, 디코딩(Decoding)은 바이트를 문자로 변환하는 것을 말한다
그리고 그 변환하는 방식에 UTF-8, CP949, ANSI 등등이 존재하는데
인코딩과 디코딩 방식이 서로 일치해야 프로그램이 정상적으로 읽어낼 수 있다.
인코딩 방식을 설정하지 않으면, 메모장의 인코딩 방식과 파이썬의 디코딩 방식이 일치하지 않아 오류가 발생한다.

 

통째로 읽기

파일을 한줄 씩 말고 통째로 읽을 수도 있다.

read()메소드를 이용하면 된다.

with open("input.txt", "r", encoding = "UTF8") as infile:
    all = infile.read()
    print(all)

파일이 무척 크다면 많은 양의 메모리를 필요로 하기 때문에 주의가 필요하다

 

한 글자씩 읽기

read() 메소드에 매개변수로 1을 입력하면 한 글자씩 읽는다

with open("input.txt", "r", encoding = "UTF8") as infile:
    one = infile.read(1)
    while one != "":
        print(one)
        one = infile.read(1)
#출력 결과
#홍
#길
#동
#
#
#김
#철
#수

 

파일 쓰기

  • “w”모드로  파일을  열었을  때  파일에  쓰기  가능
  • wirte() 메소드 사용
with open("input.txt", "w", encoding = "UTF8") as infile:
    infile.write("ReBugs\n")

실행을 해보면 input.txt파일에 ReBugs라고 적혀있는 것을 볼 수 있다.

w모드는 기존에 있던 내용을 초기화하고 새로 쓰는 것을 인지하길 바란다.

이어서 쓰고 싶으면 a모드를 사용하면 된다.

 

또한 변수의 값을 문자열에 포함시켜서 쓸 수 있다.

with open("input.txt", "w", encoding = "UTF8") as infile:
    url = "https://rebugs.tistory.com/"
    infile.write(f"ReBugs 주소 : {url}\n")
input.txt
ReBugs 주소 : https://rebugs.tistory.com/

 

'Python Category > Python' 카테고리의 다른 글

[Python] 내장 함수  (0) 2022.12.09
[Python] 예외 처리  (2) 2022.12.09
[Python] 모듈  (0) 2022.12.08
[Python] 문자열  (1) 2022.12.08
[Python] 딕셔너리  (0) 2022.12.07