programming

파이썬 구구단 with open 활용하여 파일로 저장하기


by Kitle · 2020. 07. 09.



파이썬 구구단 with open 활용하여 파일로 저장하기

지난 포스트에서는 구구단을 맛깔나게(?) 출력해 보았습니다.

지금까지는 화면(콘솔)에 찍었는데 화면에 출력하는 것은 따로 저장하지 않으면 사라지죠. 이것이 바로 무서운(응?) 컴퓨터의 세계입니다. 따라서 해당 콘솔 출력 내용을 복붙하여 파일로 저장하는 노동을 해야하죠.

그렇다고 정말 이렇게 하고 있진 않겠죠?

화면에 나오는 정보를 이제 PC의 파일로 저장해보겠습니다. 영구적으로 저장해야 하는 데이터는 파일로 저장하는 것이 옳습니다. 구구단을 파일에 영구저장할 일이 뭐 있겠냐만은... 학습용이니까 참고하시구요.

아주 간단한 구구단 소스를 한번 보시지요.


for i in range(1,10):
    for j in range(1,10):
        print(i, '*', j, '=', i*j)

print 문은 화면에 출력합니다.


파일 쓰기의 기본은 열기 -> 쓰기 -> 닫기 이게 파일 입출력 기본로직 입니다.

a = open('test.txt', mode='w', encoding='utf-8')
for i in range(1, 10):
    for j in range(1, 10):
        a.writelines(str(i)+' * '+str(j)+' = '+str(i*j) + '\n')
        # print(i, '*', j, '=', i*j)
a.close()

화면상에는 아무것도 안나오고, 파이참 폴더에 test.txt 만들어졌으면 성공입니다.

Value error I/O Operation on close file.

파일 닫을때 에러가 난다는건 데 파일이 열려있거나 하면 닫을때 오류 날 수가 있습니다.

혹시 메모장같은거로 열었으면 닫고 다시 실행해 봅니다.

파일의 특성상 메모장에서 저장하려고 하고, 파이썬 에디터에서 저장하려고 하면 서로 자원 충돌이 일어나겠죠? 서로 내용을 덮어써버리면 안되니 이런 관리를 위해 자원 점유를 합니다. 따라서 이런 읽고/쓰기 상태에 문제가 있으면 저런 에러가 날 수 있습니다.

아니면 a.close() 위치가 부적절 하여 날 수도 있겠습니다. 저는 인덴트(띄어쓰기)문제로 오류가 났었네요.

지금처럼 여닫기 제대로 안하면 오류나거나 보통 닫기 빼먹는 휴먼에러가 있을 수 있어요.

다른언어는 대부분 이렇게 쓰는게 정석입니다. 하지만 a.close()를 깜빡하고 빼거나 이상한데에서 닫아버리고 쓰려고 하거나 이런문제들이 상당히 많이 발생합니다.


파이썬에서는 이 문제를 좀 더 쉽고 편하게  with open을 통해 사용합니다.

with open 문장으로 변경해보시죠.


with open('test2.txt', mode='w') as f:
    for i in range(1, 10):
        for j in range(1, 10):
            f.writelines(str(i)+' * '+str(j)+' = '+str(i*j) + '\n')
            # print(i, '*', j, '=', i*j)

어? close 문장이 없는데? 라는 생각이 될겁니다. 일단 한번 돌려보시죠.

잘 돌아가죠? test2.txt 파일이 정상적으로 만들어졌을겁니다. 오류가 난다면 오류 메세지를 찾아 수정해 보는 연습도 필요합니다.

with open은 끝날때 알아서 닫아줘서 close 불필요 합니다. 관리가 더 편해 졌죠?

파이썬 파일은 with open을 꼭 활용해 합시다 :)