아래 내용은 공부한 것을 정리하므로 틀린 내용이 포함되어 있을 수 있습니다.
1. 파일 다루기 기본
- 파이썬에서 파일 다룰 때는 기본 내장함수
open()
함수를 활용합니다. open()
함수의 사용법- 첫번째 인수 file경로만이 필수입니다.
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)¶
open()
함수 인자, 자주 사용하는 것만 살펴봅니다.- file : 파일 경로
- mode : 파일이 열리는 모드
- ‘r’ : 읽기 용으로 열림 (기본값)
- ‘w’ : 쓰기 위해 열기, 파일을 먼저 자른다.
- ‘x’ : 베타적 생성을 위해 열리고, 이미 존재하는 경우 실패
- ‘a’ : 쓰기를 위해 열려 있고, 파일의 끝에 추가하는 경우 추가합니다.
- ‘b’ : 2진 모드(바이너리 모드)
- ‘t’ : 텍스트 모드 (기본값)
- ’+’ : 업데이트 (읽기 및 쓰기)를 위한 디스크 파일 열기
- ‘U’ : 유니버설 개행 모드 (사용되지 않음)
- buffering : 버퍼링끄기는 0(바이너리모드에서만 동작함), 라인모드는 1 (텍스트 모드에서만 가능),
고정 크기로 보내려면 임의의 바이트수를 1보다 큰 양의 수로 입력, 기본 정책은 아래와 같습니다.
- 이진 파일은 고정 크기 청크로 버퍼링됩니다. 버퍼의 크기는 기본 장치의 “블록 크기”를 결정하고 다시 떨어지는 경험적 방법을 사용하여 선택됩니다 io.DEFAULT_BUFFER_SIZE. 많은 시스템에서 버퍼는 일반적으로 4096 또는 8192 바이트 길이입니다.
- “대화식”텍스트 파일 ( isatty() 반환 되는 파일 True)은 회선 버퍼링을 사용합니다. 다른 텍스트 파일은 바이너리 파일에 대해 위에서 설명한 정책을 사용합니다.
- encoding : 파일을 디코딩하거나 인코딩하는데 사용되는 이름, 대부분 utf-8 이지만 모든 시스템이 utf-8이라는 보장이 없으므로 명시적으로 하는 것이 좋다.
- 파이썬에서 지원되는 인코딩 목록 - https://docs.python.org/3.6/library/codecs.html
- 파일 객체는 반드시 열고 작업이 완료되면 반드시 파일을 닫아야 합니다.
- 파일을 닫지 않으면 버퍼링되어 있는 데이터는 기록되지 않고 소실될 수 있습니다.
- **file 객체의
close()
메소드로 파일을 닫습니다. **
2. 파일 쓰기
- 파일 쓰기를 수행해봅니다.
-
REPL에서 수행해봅니다.
- 파일을 작성하기 위해서는 새로운 파일을 open 해야합니다.
mode='wt'
라고 되어 있는 부분은 쓰기모드이면서 텍스트모드를 가리킵니다.- mode를 작성할 때
r(읽기)
,w(쓰기)
,a(추가하기)
세가지중 하나와t(텍스트)
와b(바이너리)
둘중 하나와 반드시 결합해야하며, 나머지는 optional하게 사용가능합니다. - 인코딩을 명시적으로 기입하였습니다.
- help메소드로 file객체의 여러사용할 수 있는 메소드를 볼 수 있습니다.
>>> f = open('test.txt', mode='wt', encoding='utf-8') >>> help(f)
- 작성해봅니다.
- write의 반환은 바이트수가 아닌 문자열 수입니다.
- 작성이 끝나면 반드시
close()
메소드를 호춣해야 합니다.>>> f.write('파이썬으로 파일을 작성하고 있습니다.') 20 >>> f.write('newline 문자로 개행해봅니다.\n') 20 >>> f.write('개행이 잘되었나요?') 10 >>> f.close()
- REPL을 빠져나와 vi 에디터로 오픈해봅니다.
$ vi test.txt
3. 파일 읽기
- 파일 읽기를 수행해봅니다.
- mode는
mode='rt'
입니다. read(글자수)
로 파일을 읽습니다.- 파일을 읽고 나서 내부 포인터는 읽은 마지막 끝으로 이동됩니다.
>>> r = open('test.txt', mode='rt', encoding='utf-8') >>> r.read(10) '파이썬으로 파일을 '
- 파일을 읽고 내부포인터가 읽은 마지막 끝으로 이동되었다는 의미는 read를 한번 더 실행하면 확인할 수 있습니다.
- 첫번째 다음 10글자를 읽었습니다.
>>> r = open('test.txt', mode='rt', encoding='utf-8') >>> r.read(10) '파이썬으로 파일을 ' >>> r.read(10) '작성하고 있습니다.'
- 나머지 문자를 읽어보겠습니다.
- 다 읽은 후에는 빈 문자가 반환됩니다.
>>> r.read(50) 'newline 문자로 개행해봅니다.\n개행이 잘되었나요?' >>> r.read(50) ''
- 다시 포인터를 맨 앞으로 가져가려면
seek(포인터위치)
메소드를 사용합니다. - 맨 앞이기 때문에 인자를 0으로 입력합니다.
>>> r.seek(0) 0
- 파일 내용 전체를 리턴받으려면 read메소드를 인수 없이 사용합니다.
>>> r.read() '파이썬으로 파일을 작성하고 있습니다.newline 문자로 개행해봅니다.\n개행이 잘되었나요?'
- 다시 포인터를 0으로 위치시킵니다.
>>> r.seek(0) 0
- 이제는
readline()
메소드로 line 별로 읽어봅니다.>>> r.readline() '파이썬으로 파일을 작성하고 있습니다.newline 문자로 개행해봅니다.\n' >>> r.readline() '개행이 잘되었나요?' >>> r.readline() '' >>>
readlines()
메소드는 파일의 라인별로 리스트 형태로 리턴합니다.>>> r.seek(0) 0 >>> r.readlines() ['파이썬으로 파일을 작성하고 있습니다.newline 문자로 개행해봅니다.\n', '개행이 잘되었나요?'] >>> r.close()
4. 파일 추가하기
- 파일 추가를 수행해봅니다.
- mode는
mode='at'
입니다.>>> a = open('test.txt', mode='at', encoding='utf-8') >>> a.writelines(['writelines로 추가합니다.', '내부 원소는 개행이 안되는군요.', '개행을 하려면 개행문자를 입력해야합니다.\n', '마지막에는 안붙여도 개행문자가..']) >>> a.close()
- 결과는
파이썬으로 파일을 작성하고 있습니다.newline 문자로 개행해봅니다. 개행이 잘되었나요?writelines로 추가합니다.내부 원소는 개행이 안되는군요.개행을 하려면 개행문자를 입력해야합니다. 마지막에는 안붙여도 개행문자가..
5. Iterable한 파일 객체의 특성을 이용한 읽기
- iterable한 객체임을 확인합니다.
>>> import collections >>> r = open('test.txt', mode='rt', encoding='utf-8') >>> isinstance(r, collections.Iterable) True
- for문을 통해 라인별로 읽습니다.
>>> for line in r: ... print(line) >>> r.close()
- print 문에 의해 한번 씩 추가로 개행이 되었습니다.
파이썬으로 파일을 작성하고 있습니다.newline 문자로 개행해봅니다. 개행이 잘되었나요?writelines로 추가합니다.내부 원소는 개행이 안되는군요.개행을 하려면 개행문자를 입력해야합니다. 마지막에는 안붙여도 개행문자가..