파이썬 파일 임의 접근
파일의 내용을 쓰거나 읽을 때 FP(File Position)을 이용한다. 말 그대로 위치를 기억하는 FP는 파일을 열면 맨 앞을 가리킨다. FP를 움직이면서 파일을 읽을 시작위치 또는 파일에 쓸 위치를 조작한 뒤에 읽기, 쓰기를 한다. C언어와 개념은 비슷하지만 파이썬이 사용방법은 좀 더 심플하다.
C언어에서의 FP(File Position)
C언어에서의 파일처리는 꽤 복잡하다. 따라서 여기서는 간략하게 설명만 하고 파이썬에서 얼마나 심플해졌는지 간단한 비교만 하겠다.
C언어에서 FP를 이동시킬 때 기준이 되는 세가지 위치가 위에 그려져 있다.
SEEK_SET : 파일의 선두
SEEK_CUR : 현재 FP의 위치
SEEK_END : 파일의 끝
함수 int fseek(FILE *stream, long offset, int origin); 를 사용하는데 origin이 바로 세 위에 나온 세가지 옵션 중에 하나가 된다.
offset : 기준이 되는 origin으로 부터의 떨어진 byte수를 나타낸다.
파이썬(phthon)에서의 FP(File Position)
우선 파일을 만들어 보자.
2015/08/23 - [프로그래밍/python] - 파이썬(python) 파일 읽기, 쓰기
tell()함수는 FP의 바이트 위치를 반환한다. 즉 위 결과 9L은 시작점으로 부터 9byte뒤가 FP라는 뜻이다.
만약
f.write('file test\n')라고 하면
f.tell()은 11을 반환한다.' \n' 은 2byte의 하나의 문자라고 생각하는 것이 편하다.
파이썬에서의 파일 임의 접근
seek()함수를 사용하는데 사용법은 매우 간단하다.
우선 C언어에서 파일의 기준이 되는 origin이라는 값이 3가지가 있었다. 이 값은 파일 시작점, 현재 FP, 파일 끝의 세가지 인데 파이썬에서는 순서대로 0, 1, 2로 나타낸다. (0인 경우는 생략 가능하다.)
위 예에서 test.txt에 'file test'라는 문자열이 저장되어 있다. 이 파일에서 seek()함수를 이용하는 예를 들어 보면
별도의 설명은 필요 없을 정도로 매우 직관적이고 간단하다. seek(byte,origin) : origin으로 부터 byte떨어진 곳으로 FP이동
읽거나 쓸 경우 FP의 이동도 같이 이루어진다는 것도 잊지 말자. read(1)은 1byte를 읽는다.
파일 처리모드와 FP
주의할 사항으로 파일 처리 모드를 'a+'로 열어도 맨 앞을 가리키는데, 파일 처리 모드 'a+'의 경우로 파일을 연 경우는 읽기는 FP에 따라서 읽혀지지만 쓰는 경우는 무조건 파일 끝에서 부터 쓰게 된다. 'a+'로 열어서 읽는 경우는 몇 가지 예상 못할 일이 발생하기도 하는데 참고해 보자.
'a+'로 파일을 연 경우
FP이동 -> 읽기-> 쓰기
읽기-> 쓰기
예1)
에러는 없지만 파일 확인해보면 파일 쓰기 실패
예2)
파일 임의 접근->쓰기
FP의 위치에 상관없이 'append'가 끝에 추가됨
'w+'로 파일을 연 경우
기존에 파일이 있다면 내용이 다 지워진다. 위에서 test.txt에 file test가 저장되어있다. 여기에 다음과 같이 'w+'모드로 파일을 열어 조작하면
'r+'로 파일을 연 경우
기존 파일의 내용은 그대로 있지만 덮어 쓴다.
위 예에서 파일에 'te1t'가 저장되어 있다 여기에서 다음과 같이 r+모드로 파일을 열어서 쓰기를 해보면
기존 파일의 내용은 그대로지만 새로 덮어 쓰기가 된다.