파일 입·출력
- open() 내장 함수
- open("filename",'mode')
- open()함수의 모드
1. 'r'(read) : 생략을 하면 기본적으로 사용되는 모드로, 읽기 전용모드, 파일 포인터를 처음위치에 놓음
2. 'w'(write) : 쓰기모드로 존재하지 않는 파일은 생성하고, 존재하는 파일은 내용을 모두 지우고 파일포인터를 처음위치에 놓음
3. 'a'(append) : 이미 존재하는 파일 뒤쪽에 내용을 추가, 파일 포인터를 파일의 마지막 위치에 놓음
- 이진 파일로 저장하기 위한 모드
1. rb
2. wb
3. ab
----------------------------------------------------------------------------------------
- 파일 쓰기
----------------------------------------------------------------------------------------
import os
print os.getcwd() # 현재 작업중인 디렉토리를 알아보는 함수
D:\PythonProject\Python\13
----------------------------------------------------------------------------------------
- 파일 읽기
이번에는 이클립스에서 텍스트 파일을 읽어보겠습니다. 파일을 읽을때에는 read()메소드를 이용합니다.
----------------------------------------------------------------------------------------- 라인단위로 파일 읽기/쓰기
파일을 읽을때 라인단위로 읽을 수가 있습니다. 라인 단위로 읽는 방법은 총 4가지가 있습니다.
1. 객체 반복자 사용
아래와 같이 for-in 문을 이용해서 라인 단위로 출력이 가능합니다. 파일을 라인단위로 읽을때 가장 효율적인 방법이라고 합니다.
i=1
for line in f:
print i,":",line,
i+=1
f.close()
3. readlines() 사용
각 라인을 모두 읽어서 메모리에 리스트 형태로 저장합니다. 라인이 100줄 1000줄이면 메모리를 굉장히 비효율적으로 사용하게 됩니다. 한글이여서 아스키코드로 변화해서 저장되는걸 확인 할 수 있습니다.
print f.readlines() # 리스트로 저장
print # 한줄 개행
f.seek(0) # 파일포인터를 처음으로 되돌려줌
i=1
for line in f:
print i,":",line,
i+=1
f.close()
4. xreadlines() 사용
위의 readlines()의 메모리 비효율성을 개선할 수 있는 함수입니다. 리스트가 반환되지 않고, 파일 객체 내용이 찍힙니다. 사용과 실행 결과는 위와 동일합니다.
그렇다면, 반대로 라인단위로 파일 쓰는건 어떻게 할까요? 이미 위에서 사용했던 write() 함수와 wrtielines() 함수가 있습니다. 라인단위로 파일을 쓸때에는개행문자(\n)를 꼭 써줘야 합니다.
----------------------------------------------------------------------------------------
f=open("end.txt",'a') # 기존 파일에 내용 추가
f.writelines('\n\n')
f.writelines('오늘은 2월 22일 \n')
f.writelines('하루종일 날씨가 흐리다.\n')
f.writelines('얼른 봄이 왔으면 좋겠다.\n')
f.close()
f=open('end.txt')
print f.read()
----------------------------------------------------------------------------------------
(실행 결과)
애써 미안한 표정 하지마
싫어진 거잖아 이제 널 떠나줄게
비겁해지는 널 보는 게 아파
내가 갈게 널 보내줄게
-권진아 끝 中에서-
오늘은 2월 22일
하루종일 날씨가 흐리다.
얼른 봄이 왔으면 좋겠다.
----------------------------------------------------------------------------------------
- 파일 내 임의 위치로 접근
위에서 몇번 언급한 파일포인터는 파일 내에서 현재 위치를 가리키고 있습니다. 이때 seek(5)를 하면 문자열의 5번째 인덱스를 가리키게 됩니다.
tell()을 사용하면 현재 위치를 돌려주고, read(1)을 사용하게되면 현재 위치에서 문자하나를 읽고나서 파일포인터를 하나 이동합니다.
- 표준 출력 방향 전환
일반적으로 print 함수를 사용하게되면 문자열을 화면(콘솔)에 출력하게됩니다. sys 모듈의 sys.stdout의 표준출력이 정해져있기 때문인데, 이를 바꿔주면 print함수를 사용하면 바꿔준 형태로 실행이 됩니다.
아래 코드는 표준출력을 파일에 저장하는것으로 바꾸고 실행 후 다시 되돌리는 코드입니다.
----------------------------------------------------------------------------------------
import sys
f=open('t.txt','w')
stdout=sys.stdout # 표준출력 저장(백업 개념)
sys.stdout=f
print '테스트 메시지1'
print '테스트 메시지2'
print '테스트 메시지3'
f.close()
sys.stdout=stdout # 다시 원상태로 되돌려줌
----------------------------------------------------------------------------------------
아래와같이 화면(콘솔)에 출력되는것이 아니라 't.txt'파일에 문자열이 써집니다.
- StringIO 모듈 사용
StringIO 모듈의 StringIO 클래스 객체는 사용하면, 파일 객체처럼 입출력 가능한 문자열 객체로, StringIO에 지원되는 메소드는 파일 객체가 지원하는 메소드와 거의 유사합니다. 메소드중에서 getvalue() 메소드가 있는데 현재까지 담아 놓은 전체 내용을 반환하는 메소드입니다.
----------------------------------------------------------------------------------------
import StringIO
f=StringIO.StringIO()
f.write('abc')
f.seek(0)
s=f.read()
print s
f.write('def')
s2=f.getvalue()
print s2
----------------------------------------------------------------------------------------
(실행 결과)
abc
abcdef
----------------------------------------------------------------------------------------
- 파일로의 지속 모듈
- 지속성 기능을 지원하는 모듈
DBM 관련 모듈 : anydbm, dbm, gdbm, dbhash, dumbdbm
pickling 모듈 : 파이썬의 객체를 저장하는 일반화된 지속성 모듈
pickling 모듈이 좀 더 일반적으로 사용한다고해서 pickle모듈만 사용해 봤습니다. 이클립스에서는 에러가 발생해서 Enthought Canopy로 실습을 진행했습니다.
----------------------------------------------------------------------------------------
import pickle
color={'r':'red','g':'green','b':'blue'}
fruits=['banana','apple','grape']
Tuple=(color,fruits)
f=open('pickle.txt','w')
pickle.dump(Tuple,f) # 저장하고자 하는 Tuple을 f에 넣어서 얼림
f.close()
####################################
f=open('pickle.txt')
x,y=pickle.load(f) # dump()와 반대
print x
print y
----------------------------------------------------------------------------------------
'언어 > Python' 카테고리의 다른 글
[파이썬] 디렉토리 다루기 (0) | 2017.02.25 |
---|---|
[파이썬] 파일 다루기 (0) | 2017.02.24 |
[파이썬] 사전 (0) | 2017.02.19 |
[파이썬] 튜플과 집합자료형 (0) | 2017.02.14 |
[파이썬] 리스트 활용 (4) | 2017.02.07 |