티스토리 뷰

[문법] 파이썬(Python)

[중급] 9강. 파일

으나니머스 2025. 1. 6. 20:35
반응형

이번 시간에는 파일을 다루는 방법을 알아보겠습니다. 

파일을 다룰 수 있게 되면 프로그램과 데이터를 따로 관리할 수 있지요. 

먼저 메모장으로 텍스트 파일 하나를 만들어봅시다.

Programming is fun.
Very fun!

You have to do it yourself...

각자  파이썬 스크립트를 저장하기 위한 폴더를 만들어두셨을 거예요. 거기에다가 Python_for_Fun.txt와 같은 이름으로 저장해주세요. 그리고나서 아래 예제를 따라해보세요. 폴더와 파일의 이름은 각자 지으신 대로 써주시구요.

>>> f = open('C:\\python_newbie\\Python_for_Fun.txt')
>>> f.read()
'Programming is fun.\nVery fun!\n\nYou have to do it yourself.'

파일을 열어서 f라는 이름을 붙여주고 다시 그것을 읽었습니다.

 

그런데, 좀 이상합니다. 아까 파일을 작성할 때 줄을 바꿔가면서 썼던 것이 모두 한 줄에 나옵니다. 쓴 적이 없는 글자도 끼어 있구요.

잘 보면 줄을 바꾼 곳마다 '\n'이 들어있다는 것을 알 수 있지요. '\n'은 다음과 같이 문자열을 출력할 때 '줄 바꿈'을 의미한답니다.

>>> print('야호~\n호야~')
야호~
호야~

우리가 메모장에서 텍스트 파일을 작성할 때에도 줄을 바꿀 때마다 이런 개행 문자가 포함되었던 것이지요. 위에서는 f.read() 함수가 돌려준 문자열을 그대로 보았기 때문에 우리가 개행 문자도 볼 수 있었던 것이고, 이 문자열을 print 하면 정상적으로 줄 넘김이 된 상태로 보입니다.

>>> buffer = f.read()
>>> print(buffer)
Programming is fun.
Very fun!

You have to do it yourself...

이번엔 파일에 글을 써볼까요?

>>> letter = open('C:\\python_newbie\\letter.txt', 'w') # 새 파일 열기
>>> letter.write('Dear Father,')                      # 아버님 전상서
>>> letter.close()                                    # 닫기

이번엔 파일명 뒤에 'w'라고 써주었죠? 아까 파일의 데이터를 읽기만 했을 때와는 달리, 파일에 데이터를 쓰려고 할 때는 미리 '파일에 데이터를 쓰겠다'는 사실을 알려줄 필요가 있기 때문입니다.

 

그 다음에 몇 자 적어주고 나서 파일을 닫았습니다.

이제 해당 폴더를 보시면 letter.txt 파일이 있구요, 그걸 메모장으로 열어보시면 파이썬으로 써준 글자가 고스란히 적혀있을 거예요.

만약, 파일에 데이터를 쓴 다음에 close()로 닫아주지 않았으면 메모장으로 봐도 아무 글자도 없을 거예요. 그러니 꼭 닫아주셔야 합니다.

하지만 우리가 잊어버리더라도 파일이 더 이상 필요 없으면 파이썬이 알아서 닫아준다고 하네요. 

혹시 letter.txt가 아니라  python.txt 파일에다가 'Dear Father'라고 쓰신 분 계신가요? 

원래 들어있던 내용이 다 날아갔죠? 

파일에 데이터가 원래 들어있을 때 'w' 모드로 파일을 열면 원래 있던 데이터가 없어져버린답니다. 파일에 들어있는 데이터를 지우지 않고 내용을 추가하려면 'a+' 모드를 지정해줘야 하죠.

>>> letter = open('C:\\python_newbie\\letter.txt', 'a+')
>>> letter.write('\n\nHow are you?')
>>> letter.close()

이제 letter를 다시 열어보시면 제대로 되어있을 거예요.

 

이번엔 한 줄씩 다루어 보겠습니다.

파이썬이 설치된 디렉터리에 있는 LICENSE.txt 파일을 열어보겠습니다.

>>> import os
>>> os.getcwd()
'C:\\Users\\Yong Choi\\AppData\\Local\\Programs\\Python\\Python38-32'
>>> os.listdir()
['DLLs', 'Doc', 'img_read.py', 'include', 'Lib', 'libs', 'LICENSE.txt', 'NEWS.txt',
'python.exe', 'python3.dll', 'python38.dll', 'pythonw.exe', 'Scripts', 'tcl',
'Tools', 'vcruntime140.dll']
>>> f = open('LICENSE.txt')

파일을 처음부터 끝까지 읽을 땐 read()를 썼죠? 한 줄씩 읽을 때는 readline()을 사용하면 됩니다.

첫 줄을 읽어볼게요.

>>> f.readline()
'A. HISTORY OF THE SOFTWARE\n'

다음 줄도 읽어볼까요?

>>> f.readline()
'==========================\n'

간단하죠? 별 것 아닙니다. 파일 내용을 처음부터 한 글자씩 주루룩~ 읽어나가다가 '\n'이 나타나면 한 줄이 끝난 줄 알고 딱 멈춰서게 되는 겁니다.

 

다음과 같이 반복문과 readline()을 함께 사용해 텍스트를 원하는 줄 수 만큼만 읽어들일 수 있답니다.

>>> for x in range(5):
...     f.readline()
...
'\n'
'Python was created in the early 1990s by Guido van Rossum at Stichting\n'
'Mathematisch Centrum (CWI, see http://www.cwi.nl) in the Netherlands\n'
"as a successor of a language called ABC.  Guido remains Python's\n"
'principal author, although it includes many contributions from others.\n'

파일을 한 줄씩 읽어 화면에 출력하기를 다섯 번 되풀이했지요.

이번엔 똑같이 다섯 줄을 읽기는 하지만 조금 다르게 하는 방법을 보여드리겠습니다.

>>> f = open('LICENSE.txt')
>>> lines = f.readlines()
>>> lines[:2]
['A. HISTORY OF THE SOFTWARE\n', '==========================\n']

여기서는 ' readline'에 's' 자가 붙은 readlines()를 사용했습니다. readlines()로 파일을 읽으면 한 줄, 한 줄이 각각 리스트의 원소로 들어갑니다.

 

위에서는 파일 전체가 lines라는 리스트에 쏙 담겼습니다. 그런 다음엔 lines에 들어있는 것들을 입맛대로 꺼낼 수 있습니다.

이 방법을 쓰면 아주 쉽게 원하는 줄을 읽어들일 수 있겠죠? 26번째 줄부터 40번째 줄까지를 읽어볼까요?

>>> for l in lines[26:41]:
...     print(l, end='')
...
    Release         Derived     Year        Owner       GPL-
                    from                                compatible? (1)

    0.9.0 thru 1.2              1991-1995   CWI         yes
    1.3 thru 1.5.2  1.2         1995-1999   CNRI        yes
    1.6             1.5.2       2000        CNRI        no
    2.0             1.6         2000        BeOpen.com  no
    1.6.1           1.6         2001        CNRI        yes (2)
    2.1             2.0+1.6.1   2001        PSF         no
    2.0.1           2.0+1.6.1   2001        PSF         yes
    2.1.1           2.1+2.0.1   2001        PSF         yes
    2.1.2           2.1.1       2002        PSF         yes
    2.1.3           2.1.2       2002        PSF         yes
    2.2 and above   2.1.1       2001-now    PSF         yes

>>>

 26:40이 아니라 26:41이라고 하는지 아리송하신 분은 문자열과 리스트 강좌를 복습하셔야겠네요.

 

오늘의 하이라이트! 끝에서 열 줄을 읽어봅시다.

리스트에서 맨 마지막 원소의 인덱스는 -1이랍니다. 

한번 도전해 보세요. 성공하신 분은 다음과 같은 결과를 볼 수 있을 거예요~

Parts of this software are based on the Tcl/Tk software copyrighted by
the Regents of the University of California, Sun Microsystems, Inc.,
and other parties. The original license terms of the Tcl/Tk software
distribution is included in the file docs/license.tcltk.

Parts of this software are based on the HTML Library software
copyrighted by Sun Microsystems, Inc. The original license terms of
the HTML Library software distribution is included in the file
docs/license.html_lib.

 

 

출처: wikidocs

반응형

'[문법] 파이썬(Python)' 카테고리의 다른 글

[고급] 10강. 객체지향 - 클래스와 인스턴스  (2) 2025.01.06
[중급] 8강. 모듈  (0) 2025.01.06
[기초] 7강. 자료형  (1) 2025.01.06
[기초] 6강. lambda 함수  (0) 2025.01.06
[기초] 5강. 함수  (0) 2024.09.18