이해하기 쉬운 파이썬 3.6 - 8회차

2018. 7. 19. 00:21언어별 정리 자료/Python

이해하기 쉬운 파이썬 3.6 - 8회차

파일을 열고 닫기

    파일을 열고 닫는 데에는 특별한 모듈 없이도 가능합니다. 함수 명 또한 굉장히 직관적인데, 파일을 여는 함수는 open(), 닫는 함수는 close()입니다.


fileObj = open(fileName, mode)

fileName은 말 그대로 파일의 이름을 의미하는 문자열 변수입니다. 절대경로 ( C://User/chj/fileName.txt ) 로 써도 되며, 파이썬 파일과 동일한 위치에 있다면 그냥 파일 이름만 써도 좋습니다.

mode에는 크게 3가지 모드가 있는데, 각각 w ( write ), r ( read ), a ( append ) 가 그것입니다. 파이썬은 ( 거의 모든 프로그래밍 언어는 ) 읽기와 쓰기를 파일에 동시에 진행할 수 없는데, 파이썬 또한 마찬가지로 File I / O를 할 때에 읽기를 할 것인지, 쓰기를 할 것인지 확인 후 진행해야 합니다. append 모드는 write 과 거의 유사한데, write 은 파일이 있던 없던 새롭게 처음부터 쓰기를 진행한다면, append는 파일이 존재 할 때에는 파일의 뒤에 이어서 쓰게 됩니다.

fileObj 는 파일을 열어서 읽을 때 사용하는 일종의 파일 변수입니다. 개발자는 이렇게 열린 fileObj를 통해 File input/output ( File I / O ) 를 진행 할 수 있습니다.

close(fileObj)

close 내부에는 파일 변수가 들어가야 합니다. 닫지 않고 종료하게되면 여러가지 예측 불가능한 오류가 생길 수 있으며, 컴퓨터 성능에도 영향을 미칠 수 있습니다.

바로 코드를 보면서 진행 하여 보도록 합시다.

fileObj = open("ex.txt", "r")    # 파일 이름은 한글이어도 상관 없습니다.
/* doing with file.... */
close(fileObj)

with as

    파일을 open 함수로 열었다면, 반드시 close 함수로 닫아야 합니다. 그러나 기초적인 이런 부분에서도 실수가 있을 수 있고, 괜히 코드 양만 늘어나며, 코드가 길어지게 된다면 현재 닫는 파일이 정확히 닫는게 맞는지 확인하는 과정도 생겨 날 수 있습니다. 따라서 이때 사용하는 예약어가 with ~~ as 입니다. 위에 사용했던 코드를 with as 를 통해 진행 해 봅시다.

with open("ex.txt", "r") as fileObj    :
    /* doing with file.... */    # Indent는 필수 사항입니다.


이처럼 close()를 쓰지 않고도 as 뒤에 파일 변수를 명시하여 사용 가능합니다. 또한 indent 덕분에 파일이 사용될 부분을 명시적으로 코드상에서 확인 가능한 장점도 있습니다.

파일 읽기

    파일을 읽는 것에는 몇 가지 방식이 있습니다. 크게는 3개의 함수로 이용 가능합니다.

1. read()

fileObj.read() 와 같이 사용할 수 있습니다. 아무것도 쓰지 않고 read() 로만 쓰면 파일을 전부 읽어서 하나의 문자열로 반환하게 됩니다. read(5) 와 같이 인자를 넘기게 되면 처음부터 5 Byte 만 읽어서 반환하게 됩니다. 보통 Binary File을 읽을 때 사용합니다.

2. readline()

readStr = fileObj.readline() 과 같이 사용 할 수 있습니다. 한 줄만 읽어서 문자열로 return 하며, 더 읽을 것이 없다면 None 을 반환합니다.

3. readlines()

readStrList = fileObj.readlines()와 같이 사용 가능합니다. 모든 줄을 읽어서 문자열 list로 반환 해 줍니다.

파일 쓰기

    read 에 비해서 파일에 쓰는 방식은 제한적입니다. write() 함수를 사용 가능합니다. 쓸 데이터를 fileObj.write( data ) 같이 넘기면 됩니다.

예제를 하나 진행하면서 이번 회차도 마무리 해 보겠습니다. aaa.txt 를 읽어서 bbb.txt 로 복사하는 예제입니다.

with open("aaa.txt", "r") as fileA:
    # "aaa.txt" 를 "r", read 모드로 열어서 fileA라고 지칭합니다.
    readStr = fileA.readlines()
    # 모든 줄을 읽어들입니다.

with open("bbb.txt", "w") as fileB:
    # fileB라는 이름으로 "bbb.txt"를 "w", write 모드로 열어줍니다.
    for s in readStr:
        # 읽었던 모든 줄에 대해서 fileB에 wirte 해 줍니다.
        fileB.write( s )

# with as 로 사용하였기 때문에 close 함수는 불필요합니다.