08 파일 읽기, 쓰기

08 파일 읽기, 쓰기

파일 읽기, 쓰기

파일 읽고 쓰기를 통해서 텍스트에서 내용을 가져와 활용할 수도 있고, 엑셀이나 csv같은 파일을 갖고 와 가공하여 정보로 사용할 수 있다. 파이썬에서는 세 가지의 모드가 있다.

  1. 읽기 모드 r - 파일 읽기만 할 때 사용
  2. 쓰기 모드 w - 파일 내용 쓸 때, 다시 작성하면 기존 파일 삭제
  3. 추가 모드 a - 파일 내용 쓸 때, w와 달리 밑에 내용이 추가됨

예제1 - 파일 읽기

파일을 읽고 쓸 때는 open 함수를 사용하여 제어한다. 첫 번째 인자에는 제어할 파일경로/파일명을 두 번째는 모드에 대해 지정한다.

f = open('./resource/review.txt', 'r') # 절대경로와 읽기모드
content = f.read()
print(content)
print(dir(f))
# 반드시 close 리소스 반환해야한다.
f.close()

read()함수는 전체 문장을 읽어서 표시한다. 그리고 읽고 나서는 리소스를 꼭 반환해야해서 close()를 호출해준다.

예제2

close 항상 하기 귀찮고 잊을 수 있기에 with문을 써서 자동 반환해줄 수 있다!

with open('./resource/review.txt', 'r') as f:
    c = f.read()
    print(c)
    print(list(c)) # 문자열이기에 list로 형변환 해줄 수 있다.
    print(iter(c)) # 리스트는 iterable기에 iter를 호출해볼 수 있다.

예제3

open함수도 아마 iterable 객체로 주는지, for문으로 순회 가능하다.

with open('./resource/review.txt', 'r') as f:
    for c in f:
        print(c.strip())

예제4

읽고, 쓰기에서는 커서라는 개념도 있는데, 우리가 흔히 말하는 마우스 커서같이 위치를 알려주는 개념이라 생각하면 될거 같다. read()함수를 사용하면 전체를 다 읽기에, 커서가 문서 끝으로 가기 때문에 한 번 더 read()함수를 호출해도 이미 문서 끝이기에 아무 내용이 없다.

with open('./resource/review.txt', 'r') as f:
    content = f.read()
    print(">", content)
    # 한 번 읽으면 커서가 끝으로 가서 출력이 안됨
    content = f.read() # 내용이 없음
    print(">", content)

####예제5

한 문장씩 처리

read()함수를 사용하면 전체를 읽기 때문에, 한 문장씩 제어가 위해서는 readline()함수를 이용할 수 있다.

with open('./resource/review.txt', 'r') as f:
    line = f.readline()
    # print(line)
    while line: # NULL될때까지
        print(line, end='###')
        line = f.readline()

예제6

readlines()를 이용하면 문장을 리스트 형태로 저장해서 좀 더 편하게 순회할 수 있다.

with open('./resource/review.txt', 'r') as f:
    contents = f.readlines() # 리스트 형태로 저장
    print(contents)
    for c in contents:
        print(c, end=' ****** ')

예제7

score = []
with open('./resource/score.txt', 'r') as f:
    for line in f:
        score.append(int(line))
    print(score)

print('average : {:6.3}'.format(sum(score)/len(score)))
# 여섯 자리, 소수점 세자리까

파일 쓰기

파일을 읽어봤으면, 쓰기도 해봐야 하는법! 마찬가지로 open함수를 쓰는데 두 번째 인자로 ‘w’, ‘a’를 사용하면 된다.

with open('./resource/text1.txt', 'w') as f:
    f.write('Niceman!\n')

with open('./resource/text1.txt', 'a') as f:
    f.write('Goodman!\n')

‘w’로 호출하면, 만약 기존 파일에 내용이 있으면 전부 삭제되고 새로운 내용이 추가되고, ‘a’로 호출하면 그 다음 줄에 추가된다. 상황에 따라 적절한 옵션을 넣어주면 된다.

예제8

랜덤한 숫자를 넣어보는 예제이다.

from random import randint
with open('./resource/text2.txt', 'w') as f:
    for cnt in range(6):
        f.write(str(randint(1, 50)))
        f.write('\n')

예제9

writelines()를 통해 리스트를 통째로 넣을 수 있다.

# wrtielines : 리스트 -> 파일로 저장
with open('./resource/text3.txt', 'w') as f:
    list = ['Kim\n','Park\n','Hong\n']
    f.writelines(list)

예제10

print() 함수를 통해서도, 내용을 집어넣을 수 있다.

# 프린트 문 활용
with open('./resource/text4.txt', 'w') as f:
    print("test Contents1!", file=f)
    print("test Contents12", file=f)