TIL

TIL. 21 파일 사용하기

codermun 2020. 10. 29. 22:46
728x90
반응형

## 파일 사용하기

## 프로그래밍에서 중요한 축을 차지하는 부분이 파일 처리이다.

 

## 파일에 문자열 사용하기

## 파일에 문자열을 쓸 때는 open 함수로 파일을 열어서 파일 객체(file object)를 얻은 뒤에 write 메서드를 사용합니다.

# 파일객체 = open(파일이름, 파일모드)

# 파일객체.write('문자열')

# 파일객체.close()

 

## IDLE로 아래 코드 입력

file = open('hellow.txt', 'w') # hello.txt 파일을 쓰기 모드(w)로 열기. 파일 객체 반환

file.write('Hellow, cordermun') # 파일에 문자열 저장

file.close() # 파일 객체 닫기

 

# 위와 같이 입력하며 'hellow.txt' 파일이 저장될 경로와 이름을 지정해준다.(지정한이름으로의.py 파일이 만들어지고 hello.txt 파일을 생성한다)

# open 함수로 파일을 열고, 'w' -> 쓰기모드로 파일 모드를 지정해준다. (write)

# 'w' 상태의 파일로 직접 작성할 수 있으며 작성된 문자열을 파일에 저장한다.

# 어떠한 행위를 마무리하고는 반드시 close를 이용해 파일 객체를 닫아줘야한다.

 

## 위에서 작성한 파일의 문자열 읽기

## 파일을 읽을 때도 open 함수로 파일을 열어서 파일 객체를 얻은 뒤 read 메서드로 파일의 내용을 읽습니다.

## 단, 이때는 파일 모드를 읽기 모드 'r'로 지정합니다.

# 변수 = 파일객체.read()

 

file = open('hellow.txt', 'r') # hellow.txt 파일을 읽기 모드(r)로 열기. 파일 객체 반환

s = file.read() # 파일에서 문자열 읽기

print(s) # Hellow, codermun

file.close() # 파일 객체 닫기

 

## 위에서 작성된 파일에서 문자열을 읽는 방법이다.

## open함수로 해당 파일을 열고, 'r' --> 읽기모드로 파일 모드를 지정해준다.(read)

## 임의의 변수를 할당하여 read의 반환값의 내용을 읽을 수 있다.

## Hellow, codermun이 출력됨을 확인할 수 있다

## 여기서도 모두 마무리하고 반드시 close를 이용해 파일 객체를 닫아줘야한다.

 

## 자동으로 파일 객체 닫기

## python에서는 일일이 close하는 과정을 줄이기 위해

## 파이썬에서는 with as를 사용하면 파일을 사용한 뒤 자동으로 파일 객체를 닫아준다.

## 아래와 같이 with 다음에 open으로 파일을 열고 as 뒤에 파일 객체를 지정한다.

# with open(파일이름, 파일모드) as 파일객체:

# 코드

 

with open('hello.txt', 'r') as file: # hello.txt 파일을 읽기 모드(r)로 열기

s = file.read() # 파일에서 문자열 읽기

print(s) # Hello, world!

 

## read를 사용해도 파일을 닫지 않고 마무리해도 에러없이 잘 작동한다

 

## 문자열 여러줄을 파일에 쓰기, 읽기

 

## 문자열을 여러줄 입력할때는 반복문을 사용해주면 된다.

 

with open('hello.txt', 'w') as file: # hello.txt 파일을 쓰기 모드(w)로 열기

for i in range(3):

file.write('Hello, world! {0}\n'.format(i))

 

## open 함수와 'w' 모드로 파일 열기

## for 문과 formatting을 이용해 여러줄의 문자열을 입력할 수 있다



## 리스트 안의 문자열을 파일에 쓰기

 

# 파일객체.writelines(문자열리스트)

 

lines = ['안녕하세요.\n', '파이썬\n', '코딩 도장입니다.\n']

 

with open('hello.txt', 'w') as file: # hello.txt 파일을 쓰기 모드(w)로 열기

file.writelines(lines)

 

# 파일객체.writelines(리스트)를 이용해 리스트 안의 문자열을 파일에 작성할 수 있다

## 여기서 리스트 안의 요소는 \n 이 적용되면 여러줄이 입력된다

## \n이 없으면 위 요소는 한줄로 입력된다.

 

## 파일의 내용을 한줄씩 리스트로 가져오기

## read는 파일의 내용을 읽어서 문자열로 가져오지만 readlines는 파일의 내용을 한 줄씩 리스트 형태로 가져옵니다..

# 변수 = 파일객체.readlines()

 

with open('hello.txt', 'r') as file: # hello.txt 파일을 읽기 모드(r)로 열기

lines = file.readlines()

print(lines)

 

# ['안녕하세요\n', '파이썬\n', '코딩도장입니다\n'] 출력

 

## 파일의 내용을 한줄씩 읽기

# 파일의 내용을 한 줄씩 순차적으로 읽으려면 readline을 사용한다.

# 변수 = 파일객체.readline()

 

with open('hello.txt', 'r') as file: # hello.txt 파일을 읽기 모드(r)로 열기

line = None # 변수 line을 None으로 초기화

while line != '':

line = file.readline()

print(line.strip('\n')) # 파일에서 읽어온 문자열에서 \n 삭제하여 출력

 

## 보통 어떤 파일을 열때는 해당 파일에 문자열이 몇개있는지 알 수 없다.

## 따라서 while 반복문을 사용해야한다(반복횟수가 정해져있지 않을때)

 

## line = None 으로 지정하는 이유

## readlined 메서드는 더 이상 읽을 줄이 없을때 빈 문자열을 반환한다.

## 이 특성을 이용해 while의 조건식을 만든다

## 먼저 line 이라는 변수를 만들어주지 않으면 while 조건에서 빈 문자열과의 비교대상이 없기에 error가 발생한다.

## 또한, line을 '' 빈문자열로 초기화하면 처음 조건부터 맞지 않아 반복문이 실행되지 않는다.

## line = [] 로 지정해도 같은 결과가 확인된다.(?)

 

## line = file.readline() ## 파일의 내용을 한줄씩 순차적으로 line 이라는 변수에 할당하고 출력하고 할당하고 출력하고를 반복한다.

## strip 메서드를 이용해 \n을 삭제하고 출력해야 한다 삭제하지 않을 경우 줄바꿈이 2번 일어난다 (print 디폴트로 줄바꿈이 되어있다)

 

## for 문으로 파일의 내용을 줄 단위로 읽기

 

with open('hello.txt', 'r') as file: # hello.txt 파일을 읽기 모드(r)로 열기

for line in file: # for에 파일 객체를 지정하면 파일의 내용을 한 줄씩 읽어서 변수에 저장함

print(line.strip('\n')) # 파일에서 읽어온 문자열에서 \n 삭제하여 출력

 

## for 문을 사용하면 조금 더 간편한것 같다.

## readline을 쓰지 않기 때문

 

## 파이썬 객체를 파일에 저장하기, 가져오기

# 파이썬은 객체를 파일에 저장하는 pickle 모듈을 제공합니다.

# 다음과 같이 파이썬 객체를 파일에 저장하는 과정을 피클링(pickling)이라고 하고,

# 파일에서 객체를 읽어오는 과정을 언피클링(unpickling)이라고 한다.

 

## pickle

# 피클링은 pickle 모듈의 dump 메서드를 사용합니다.

 

import pickle

 

name = 'james'

age = 17

address = '서울시 서초구 반포동'

scores = {'korean': 90, 'english': 95, 'mathematics': 85, 'science': 82}

 

with open('james.p', 'wb') as file: # james.p 파일을 바이너리 쓰기 모드(wb)로 열기

pickle.dump(name, file)

pickle.dump(age, file)

pickle.dump(address, file)

pickle.dump(scores, file)

 

## IDLE로 코드를 실행하면 james.p 라는 파일명으로 파일이 생성된다.

## 여기서 피클 -> 파일로 저장하는 단계이므로 모드는 'wb'를 입력하며 wb == writebinary라는 뜻이다.

## binary 파일은 컴퓨터가 처리하는 방식의 파일로 텍스트파일과 같이 사람이 알아보기는 어렵다.

 

## unpickle

# 파이썬 객체를 읽어오는 언피클링

# 언피클링은 pickle 모듈의 load를 사용한다.

# 그리고 언피클링을 할 때는 반드시 파일 모드를 바이너리 읽기 모드 'rb'로 지정해야 한다.

 

import pickle

 

with open('james.p', 'rb') as file: # james.p 파일을 바이너리 읽기 모드(rb)로 열기

name = pickle.load(file)

age = pickle.load(file)

address = pickle.load(file)

scores = pickle.load(file)

print(name)

print(age)

print(address)

print(scores)

 

# james

# 17

# 서울시 서초구 반포동

# {'korean': 90, 'english': 95, 'mathematics': 85, 'science': 82}



## 앞써 pickle dump 메서드를 4번 사용하였기 때문에

## 마찬가지로 파일에서 객체(값)을 가져올때 pickl.load를 4번 사용해야 합니다

## name age address scores 순서대로 입력하여 load 시도 순서대로 입력해야한다고 하지만

## 순서가 바뀌어도 문제없이 동작한다. 혹시모르니 순서대로 입력하도록 하자




728x90
반응형