본문 바로가기
python& Django

파이썬 : file input output

파이썬 : 파일 객체 다루기

 

open 내장 함수의 문서를 보면 아래와 같이 되어있다.

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

 

여기서는 기본적인 파일을 다루는 법과 mode 를 살펴본다.

먼저 같은 path (해당 스크립트와 같은 path) 에 score.txt 파일을 하나 만든다. 내용은 아래와 같다.

수학: 0
영어: 10
과학 : 80
국어 : 30

 

===파일 읽기

score_file = open("score.txt", "r")
# score_file # 불러온 파일 객체
score_file.read() # 파일의 내용물
score_file.close() # 파일 객체 닫기

여기서 read() 함수를 통해서, 파일의 모든 내용을 읽어 온다.

#파일을 열었다면 (파이썬 스크립트가 끝나면 자동으로 파일 세션도 종료되긴 하지만) 항상 닫아준다.

 

===파일 쓰기

score_file = open("score.txt", "w")
# print(score_file.read()) # 쓰기 모드로 열면, 읽을 수 없다. io 에러 발생 not readable
score_file.write("test") # 파일 확인하면, test 라고 나옴
score_file.close() # 파일 객체 닫기

# 파일 내용을 확이하면 test 한 줄이 적혀있다.

 

===파일 읽고 쓰기

score_file = open("score.txt", "r")
old = score_file.read()

score_file = open("score.txt", "w")
score_file.write(old)
score_file.write("test")
score_file.close() # 파일 객체 닫기

# score.txt 파일
수학: 0
영어: 10
과학 : 80
국어 : 30test

 

===파일 읽고 쓰기(mode 파라미터 "a" 를 활용하여)

score_file = open("score.txt", "a")
score_file.write("test")
score_file.close() # 파일 객체 닫기

# score.txt 파일
수학: 0
영어: 10
과학 : 80
국어 : 30test

 

===파일 읽고 쓰기(mode 파라미터 "x" 를 활용하여)

score_file = open("score.txt", "x")
score_file.write("test")
score_file.close() # 파일 객체 닫기

# 결과
FileExistsError: [Errno 17] File exists: 'score.txt'

위의 코드는 실행되지 않고 파일이 이미 존재하고 있다는 에러 메시지가 나온다.

 

#정리:

파일을 불러올 때 open 내장 함수를 사용한다.

open 내장 함수의 파라미터로 "파일 경로", "모드" 를 입력한다.

r = 읽기 전용 모드 (읽기)
w = 쓰기 전용 모드 (쓰기 : 파일의 내용을 버림)
a = 이어쓰기 모드 (쓰기 : 파일의 내용을 유지함)
x = 파일이 있다면 (쓰기 : 파일이 있다면 에러, 파일이 없다면 생성한다.)

 

 

#활용

score_file = open("score.txt", "r", encoding="utf8")
while True:
  line = score_file.readline()
  line = line.replace("\n", "")
  if not line:
    score_file.close()
    break
  print(line)

- 읽기 전용 모드로 파일을 불러와, 파일 객체를 생성한다.

- while 문 안에서, readline() 함수로 한 줄 씩 읽어서 line 변수에 저장한다.

- replace()를 사용하여 줄 바꿈을 없에준다.

- 읽어온 line 변수에 내용이 존재할 경우의 코드를 실행한다. (줄바꿈 코드만 있고, 내용이 텅텅 비어있는 경우도 있을 수 있으니)

- for 반복문을 활용할 수도 있다.

 

 

===with 사용하기

- with 를 사용하면 일일이 close() 를 하지 않아도, 처리가 끝난 후 자동으로 파일을 닫아준다.

- as 뒤에는 파일 객체의 이름을 지정한다.

# with, with as
# with open(filename, filemode) as 파일객체:
#   코드

 

===pickle 사용하기

- 파이썬 객체를 파일에 저장하는 용도로 사용한다.

- 파이썬 객체를 저장하는 과정을 피클링(pickling), 읽어오는 과정을 언피클링(unpickling)이라고 한다.

import pickle
name = 'swd'
age = 17
address = '서울시 마포구 OO동'
scores = {'korean': 90, 'english': 95, 'mathematics': 85, 'science': 82}

with open('info_me.pickle', 'wb') as file:
    pickle.dump(name, file)
    pickle.dump(age, file)
    pickle.dump(address, file)
    pickle.dump(scores, file)

with open('info_me.pickle', 'rb') as file:
    name = pickle.load(file)
    age = pickle.load(file)
    address = pickle.load(file)
    scores = pickle.load(file)
    print(name)
    print(age)
    print(address)
    print(scores)

- 변수들을 만들고 값을 저장한다.

- wb (바이너리 모드로 쓰기) 모드로 열어서 pickle 객체에 담는다.

- info_me.pickle 이라는 파일이 생성되어있다.

  (안의 내용을 확인해보면, 바이너리 형식으로 저장되어 알아볼 수 없는 형식의 텍스트가 나온다)

- 그 후 다시 info_me.pickle 파일을 읽어온다.

- pickle.load() 함수를 사용하여 한 줄씩 읽어와 변수에 저장한다. 

- 저장한 변수들을 출력한다.

 

#정리

with 를 사용하면 자동으로 close() 된다.

pickle 을 사용하면 바이너리 파일을 읽고, 쓸수 있다.

 

#모드 정리

r 읽기 전용
w 쓰기 전용
  w 기존의 파일 내용 버림
  a 기존 파일 내용의 끝에 추가
  x 파일이 있다면 에러

읽기/쓰기
w+ 기존의 파일 내용 버림
r+ 파일 내용 유지 - 처음부터 쓰기
a+ 파일 내용 유지 - 끝부터 쓰기
x+ 파일 있으면 에러

# wt, rt.., w+t, r+t 이런 형식으로 작성할 수 있는데 t 는 text mode 라는 뜻이며 생략 가능하다.

# b 바이너리 모드
  rb, wb 등은 피클링을 사용하거나 바이너리 데이터를 직접 저장할 때 사용한다.

 

#r+ 모드

r+ 로 열면 기존의 내용을 유지하면서 가장 처음 부터 쓸 수 있는 줄 알았고,

윗줄 부터 새롭게 들어가는 텍스트가 입력되고, 기존의 내용은 밑으로 내려가는 줄 알았는데 ,

생각한 것 처럼 작동하지 않는다. (물론 끝에 \n 을 붙여줬다.)

 

- 가장 윗줄의 기존의 파일 내용에 같은 문자가 있을 경우, 덮어쓴다.

- 반면에 a+ 모드로 끝에 이어붙이면 기대했던대로 작동한다.

- 인코딩을 UTF-8 형식을 줬음에도 불구하고, 영어를 넣었을 때 한글이 있다면 문자가 깨진다 (조사 후 다시 포스팅)

 

 

===참조

https://dojang.io/course/view.php?id=7

 

강좌: 파이썬 코딩 도장

모두 펼치기모두 접기

dojang.io

 

https://www.youtube.com/watch?v=kWiCuklohdY

 

 

'python& Django' 카테고리의 다른 글

파이썬 : 람다 (lambda)  (0) 2020.10.15
파이썬 : If 조건문  (0) 2020.10.08
파이썬 : 자료형 (dictionary) -작성 중  (0) 2020.10.08
파이썬 : 자료형 튜플(tuple)  (0) 2020.10.08
파이썬 : 자료형 (List)  (0) 2020.10.08