[PY4E] 파이썬 파일; open() read()
1. 파일 열기
- 핸들 = open(파일명, 모드) : 파이썬에게 작업할 파일과 파일로 어떤 작업을 할지 알려줌
fhand = open('mbox.txt', 'r')
- open() : handle 반환
> handle은 파일에 접근하는 창구(파일에 대한 작업 수행)
> 다른 방식으로 저장되어 있는 텍스트를 처리하는 하나의 표준화된 방식
> 많은 양의 문자 파일을 한꺼번에 읽어 발생할 수 있는 성능 문제 방지(점진적 읽기)
- 파일명 : 문자열
- 모드 : 매개변수는 선택사항
> 'r' 파일 읽기
> 'w' 파일 쓰기
- 파일 열기 오류
>>> fh = open('mbox-short.txt', 'r')
>>> print(fh)
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape
> 파일 위치의 문제
> 관리자모드가 아니라서 권한이 없어서 그런 것으로 추측됨
> c드라이브 처음이나 d드라이브로 폴더 및 파일 위치를 바꾸면 해결 완료 = cmder 설치랑 같음
2. 개행문자 \n
- 각 줄이 끝났음을 알림 >> 줄 바꿈
- 두 글자가 아닌 한 글자임(빈공간의 일부라고 생각해도 무방)
>>> stuff = 'X\nY'
>>> print(stuff)
X
Y
>>> len(stuff)
3
#X하나 / \n하나 / Y하나
3. 시퀀스로써 파일 핸들
- 읽기용의 파일 핸들 : 파일의 각 줄에 대한 문자열의 시퀀스
- 시퀀스 = 정렬된 집합
- for문을 이용하여 각 줄 읽기
#한줄씩 띄워서 출력
xfile = open('mbox.txt')
for line in xfile:
print(line)
#한 줄씩 파일 줄 세기
fhand = open('mbox.txt')
count = 0
for line in fhand:
count = count + 1
print('Line Count:', count)
$ python open.py
Line Count: 132045
4. 파일 전체 읽기 read()
- 너무 많은 파일을 한번에 읽을 경우 성능 문제 주의
>>> fhand = open('mbox-short.txt')
>>> inp = fhand.read()
>>> print(len(inp))
94626
>>> print(inp[:20])
From stephen.marquar
5. 파일 내용 탐색
- for문에 조건 걸기 > 원하는 줄만 출력
>>> fhand = open('mbox-short.txt')
>>> for line in fhand:
... if line.startswith('From:') :
... print(line)
# From:시작하는 모든 열 출력됨
From: stephen.marquard@uct.ac.za
From: louis@media.berkeley.edu
☞ 기존 파일의 각 줄 끝에는 개행문자 존재 > print 구문이 각 줄에 개행 문가 추가로 더 함
- 공백제거 > rstrip() 사용
>>> fhand = open('mbox-short.txt')
>>> for line in fhand:
... line = line.rstrip() #오른쪽 공백 제거
... if line.startswith('From:') :
... print(line)
From: stephen.marquard@uct.ac.za
From: louis@media.berkeley.edu
#print로 인한 줄바꿈만 존재
- 파일 이름 입력 받기
: 파일 이름 오류 났을 경우를 대비해 try/except 추가
: 한 줄씩 실행하면서 나타냄
>>> fn = input('Enter a file name: ')
>>> try:
... fo = open(fn)
>>> except:
... print('File cannot be opened: ', fn)
... quit()
>>> print(fo)
<_io.TextIOWrapper name='mbox-short.txt' mode='r' encoding='cp949'>
>>> for line in fo:
... sline = line.rstrip()
... print(sline.upper())
FROM STEPHEN.MARQUARD@UCT.AC.ZA SAT JAN 5 09:14:16 2008
RETURN-PATH: <POSTMASTER@COLLAB.SAKAIPROJECT.ORG>
RECEIVED: FROM MURDER (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