모두를 위한 파이썬(PY4E) [7. 파일] 강의

Charles R. Severance (찰스 R. 세브란스)의 <모두를 위한 파이썬(PY4E)> 수강 내용
https://www.boostcourse.org/cs122/joinLectures/284901

7. 파일

1) 파일 열기

학습목표

파일이 어떠한 방식으로 열리는 지 이해하고 파일을 열기 위한 open()함수를 사용할 수 있다.
텍스트 파일의 구성과 이와 관련된 기본적인 코드들을 이해하고 사용할 수 있다.

핵심키워드

  • open() 함수
  • 개행문자

텍스트 파일은 무엇인가?
텍스트 파일은 연속적으로 연결되어 있는 줄글들의 집합이라고 생각할 수 있다. 우리는 지금까지 많은 텍스트 파일을 만들어 왔다. 그럼 텍스트 파일을 열고 처리하는 것과 관련된 몇 가지 함수들을 살펴보도록 하자.

open()
파일을 여는 것은 open() 함수를 이용해 달성할 수 있다. open() 함수는 handle을 반환하게 되고 handle은 파일에 대한 작업을 수행하기 위해 사용된다. handle은 텍스트가 파일 형태, 메모리에 저장된 문자열의 형태, 웹 사이트에서 존재하는 형태와 같이 다른 방식으로 저장되어 있는 텍스트를 처리하는 하나의 표준화된 방식이다. 또한 많은 양의 문자 파일을 한꺼번에 읽어 발생할수 있는 성능의 문제를 handle은 점진적으로 읽어 방지한다.

fhand = open('hello.txt', 'r')

# open('파일명입력','모드 선택')
# 1. 파일명 입력
# 파일명은 문자열 타입으로 입력하며, 확장자까지 포함시켜 준다.
# 2. 모드 선택
# 모드에서는 w 또는 r 두가지를 선택할 수 있다. 'w'는 파일을 작성할 때 사용하며, 'r'은 파일을 읽을 때 사용한다.

개행 문자
파이썬에서 행을 바꾸는 문자인 개행 문자는 '\n'이다. print() 함수를 사용하게 되면 해당 함수에 의해 '\n'가 발생하게 된다. 여기서 중요한 것은 '\n'도 하나의 문자라는 점이다. 아래에서 보는 것처럼 문자열의 길이를 확인하기 위해 len() 함수를 호출하면 'Hello World!'와 'Hello\nWorld!' 길이가 동일한 것을 확인할 수 있다.

stuff1='Hello Word!'
print(stuff1)
print(len(stuff1))
stuff2='Hello\nWorld!'
print(stuff2)
print(len(stuff2))

# Hello World!
# 12
# Hello
# World!
# 12

2) 파일 읽기

학습목표

텍스트 파일을 읽어온 후 내장 함수를 활용해 특정 문자열의 개수를 알아 낼 수 있다.

핵심키워드

  • open() 함수
  • counting

파일핸드
파일 핸들(File Handle)은 순서가 있고 연속적으로 구성된 텍스트 파일을 한줄한줄 읽어 나가게 된다.

fhand=open('Hamlet.txt')

for line in fhand:
	print(line)
    
# 다음을 출력하게 되면 한줄씩 띄워져서 출력

파일의 라인 수 세기
파일의 문장이 몇 줄이 있는지 확인하기 위해서 매우 간단한 방법으로 해결할 수 있다.

fhand=open('Hamlet.txt')
count=0

for line in fhand:
	count=count+1
print('Line Count',count)

# Line Count: 35로 출력

파일 전체 읽기
우리는 전체 텍스트 파일을 단일한 하나의 문장으로 읽어 들어 올 수도 있다. 물론 각 문장에 대한 구분은 개행문자로 구분되어 있다.

fhand=open('mbox-short.txt')
inp=fhand.read()
print(len(inp))
# 94646으로 출력
print(inp[:20])
# From stephen.marquar으로 출력

파일 내용 검색하기
우리는 기존에 배웠던 문자열과 관련된 내장 함수를 활용해서 특정 문자열로 시작하는 문자를 찾을 수 있다.

fhand=open('mbox-short.txt')
for line in fhand:
	if line.startwith('From:'):
    	print(line)
        
# 결과값으로 From: 으로 시작되는 문자열이 출력

하지만 결과를 보게 되면 한줄씩 띄워져 있는 것을 발견할 수 있다. 이에 대한 원인은 print() 함수로 출력되면서 앞서 말한 것처럼 개행 문자가 계속해서 추가되기 때문이다. 새로운 라인은 공백으로 인식되기 때문에 해당 부분을 제거하게 되면 우리는 기본적으로 추가 되어 있던 개행 문자를 삭제할 수 있다. 기억을 떠올려 본다면 문자열의 오른쪽 공백을 제거하는 함수는 rstrip()이었다.

fhand=open('mbox-short.txt')
for line in fhand:
	line=line.rstrip() # 오른쪽 공백 제거
    if line.startwith('From:'):
    	print(line)

파일 이름 입력 받기
사용자가 파일의 이름을 직접 입력해야 하는 경우도 있을 수 있다. 파일명을 적절하게 입력한다면 문제가 없겠지만 잘못된 파일명을 입력했을 때 처리방법을 생각할 필요가 있다. 이미 배운 try, except문을 적절히 활용하면 발생할 수 있는 오류 상황을 적절하게 해결할 수 있다.

fname=input('Enter the file name: ')
try:
	fhand=open(fname)
except:
	print('File cannot be opened:',fname)
	quit()
    
count=0
for line in fhand:
	if line.startwith('Subject:'):
    	count=count+1
print('There were',count,'subject lines in',fname)

# There were 27 subject lines in mbox-short.txt와 같이 출력

3) <실습> 파일 열고 읽기

실습
Exercise 7-1
Write program to read through a file and print the contents of the file (line by line) all in upper case.
Executing the program will look as follows:

python shout.py
Enter a file name: mbox-short.txt
FROM [email protected] SAT JAN 5 09:14:16 2008
RETURN-PATH: <[email protected]>
RECIVED: FROM MUDDER (MAIL.UMICH.EDU [141.211.14.90])
	BY FRANKENSTEIN.MAIL.UMICH.EDU (CYRUS V2.3.8) WITH LMTPA;
    SAT, 05 JAN 2008 09:14:16 -0500
fh=open('mbox-short.txt')

for lx in fh:
	ly = lx.rstrip()
	print(ly.upper())

좋은 웹페이지 즐겨찾기