파이썬 | 파일 사용하기

CHOI·2021년 11월 24일
0

Python

목록 보기
20/33
post-thumbnail

프로그래밍에서 중요한 축에 속하는 것 중 하나가 파일 처리이다. 이번에는 파일에서 문자열을 읽고 쓰는 방법과 파이썬 객체를 파일에 읽고 쓰는 방법을 알아보자.

1. 파일에 문자열 쓰기, 읽기

파일에서 문자열 쓰기

  • 파일객체 = open(파일이름, 파일모드)
  • 파일객체.write('문자열')
  • 파일객체.close()
file = open('hello.txt', 'w')    # hello.txt 파일을 쓰기 모드(w)로 열기. 파일 객체 반환
file.write('Hello, world!')      # 파일에 문자열 저장
file.close()                     # 파일 객체 닫기

소스 코드를 실행해보면 지금 위 코드가 작성된 .py 파일이 있는 위치에 hello.txt 파일이 생성된다. 그리고 그 파일을 열어보면

Hello, world!

다음과 같이 Hello, world! 가 써져있는 것을 볼 수 있다.

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

파일을 사용하기 위해서는 먼저 open 함수를 통해 파일을 열어서 파일 객체를 얻어야 한다. 다음과 같이 파일 이름을 'hello.txt' 로 지정하고 파일에 내용을 쓸 것이기 때문에 'w'로 지정해준다 (write의 w 이다.)

file.write('Hello, world!')      # 파일에 문자열 저장

이제 파일 객체를 얻었으니까 write 로 파일에 문자열을 써준다.

file.close()

파일 쓰기가 끝났으면 반드시 close 로 파일 객체를 닫아준다.

Untitled

파일에서 문자열 읽기

이번에는 앞서 만든 hello.txt 파일을 읽어보자. 파일을 읽을 때에도 open 함수를 통해서 파일을 열어서 파일 객체를 얻은뒤, read 메서드로 파일을 읽는다. 단, 이때 파일 모드는 읽기 모드인 r 로 지정해야한다.

file = open('hello.txt', 'r')    # hello.txt 파일을 읽기 모드(r)로 열기. 파일 객체 반환
s = file.read()                  # 파일에서 문자열 읽기
print(s)                         # Hello, world!
file.close()                     # 파일 객체 닫기

실행 결과

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

먼저 open 함수를 이용하여 파일을 읽기 모드 r 로 연다. (read의 r 이다.)

s = file.read()                  # 파일에서 문자열 읽기
print(s)                         # Hello, world!

이제 read 의 반환값을 변수에 저장해주면 파일의 내용을 읽을 수 있다. 그리고 print 로 변수의 값을 출력해보면 "Hello, world!" 가 잘 나오는 것을 볼 수 있다.

file.close()

마찬가지로 파일 읽기 작업이 끝났으면 close 로 파일 객체를 닫아준다.

Untitled

자동으로 파일 객체 닫기

코드를 짜다가 보면 매번 파일을 열고 나서 닫을 때 close 를 해줘야 하는데 좀 귀찮다. 이럴 때는 with as 를 이용하면 파일을 사용한 뒤에 자동으로 파일의 객체를 닫아준다. with 다음에 open 으로 파일을 열고 as 뒤에 파일 객체를 지정한다.

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

그러면 앞서 만든 hello.txt 를 열어보자

with open('hello.txt', 'r') as file:    # hello.txt 파일을 읽기 모드(r)로 열기
    s = file.read()                     # 파일에서 문자열 읽기
    print(s)                            # Hello, world!

실행 결과

Hello, world!

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

반복문으로 문자열 여러 줄을 파일에 쓰기

with open('hello.txt', 'w') as file:    # hello.txt 파일을 쓰기 모드(w)로 열기
    for i in range(3):
        file.write('Hello, world! {0}\n'.format(i))
Hello, world! 0
Hello, world! 1
Hello, world! 2

파일에 문자열을 저장할 때 주의할 부분은 개행문자를 입력해줘야 한다는 것이다. 위의 처럼 Hello, world! {0}\n 로 마지막에 \n 를 넣어줘야만 줄 바꿈이 일어난다.

리스트에 들어있는 문자열을 파일에 쓰기 ( writelines )

lines = ['안녕하세요.\n', '파이썬\n', '코딩 도장입니다.\n']
 
with open('hello.txt', 'w') as file:    # hello.txt 파일을 쓰기 모드(w)로 열기
    file.writelines(lines)
안녕하세요.
파이썬
코딩 도장입니다.

writelines 는 리스트에 들어있는 문자열을 파일에 쓴다. 여기서도 주의할 점은 각 문자열 끝에 개행 문자가 들어 있지 않으면 줄 바꿈 없이 문자열들이 붙여진 상태로 파일에 저장된다는 것이다.

파일의 내용을 한 줄씩 리스트로 읽기 ( readlines )

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

실행 결과

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

readlines 으로 파일의 내용을 한 줄씩 리스트 형태로 가져온다.

파일의 내용을 한 줄씩 읽기 ( 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 삭제하여 출력

실행 결과

안녕하세요.
파이썬
코딩 도장입니다.

readline 으로 파일을 읽을 때는 while 문을 사용해야 한다. 왜냐하면 파일에 문자열이 몇 줄이나 있을 지 모르기 때문이다. while 문은 특정 조건을 만족 할 때 까지 계속 반복하므로 파일의 크기에 상관 없이 문자열을 읽어 올 수 있기 때문이다.

readline 은 더 이상 읽을 줄이 없을 때 빈문자열을 리턴하는데 이러한 특성을 이용하여 while 문의 조건문을 작성하면 파일에 더 이상 읽을 문자열이 없을 때 까지 가져올 수 있다.

처음에 line = None 라고 하여 처음에 line != '' 조건에 만족하여 반복문이 진행이 된다. 만약에 line = '' 로 했었다면 반복문 조건에 만족하지 않기 때문에 반복문이 실행되지 않는다.

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

while 반복문과 readline 을 사용하면서 좀 복잡했을 것이다. 파이썬에서는 좀 더 간단한 방법으로 파일의 내용을 줄 단위로 읽을 수 있는 방법이 있다.

with open('hello.txt', 'r') as file:    # hello.txt 파일을 읽기 모드(r)로 열기
    for line in file:    # for에 파일 객체를 지정하면 파일의 내용을 한 줄씩 읽어서 변수에 저장함
        print(line.strip('\n'))    # 파일에서 읽어온 문자열에서 \n 삭제하여 출력

실행 결과

안녕하세요.
파이썬
코딩 도장입니다.

for line in file: 로 간단하게 파일의 내용을 한 줄씩 읽었다. 이렇게 for 반복문에 파일 객체를 지정하면 반복할 때 마다 파일의 내용을 한 줄씩 읽어서 변수에 저장한다.

% 파일 객체는 이터레이터

파일 객체는 사실 이터레이터이다. 따라서 변수 여러개에 저장하는 언패킹(unpacking) 도 가능하다.(이터레이터에 관한 내용은 나중에)

>>> file = open('hello.txt', 'r')
>>> a, b, c = file
>>> a, b, c
('안녕하세요.\n', '파이썬\n', '코딩 도장입니다.\n')

물론 위와 같이 하려면 파일에서 문자열 줄의 개수와 변수의 개수가 같아야 한다.

3. 파일 객체를 파일에 저장하기, 가져오기

파일에서 문자열만 쓰고 읽는다면 불편할 것이다. 파이썬은 객체를 파일에 저장하는 pickle 모듈을 제공한다.

다음과 같이 파이썬 객체를 파일에 저장하는 과정을 피클링(pickling) 이라고 하고 파일에서 객체를 가져오는 과정을 언피클링(unpickling) 이라고 한다.

Untitled

파이썬 객체를 파일에 저장하기

그러면 파이썬 객체를 파일에 저장하는 피클링을 해보자. 피클링은 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)

소스 코드를 실행해보면 위 코드를 작성한 .py 파일이 있는 위치에 james.p 파일이 생성되어 있을 것이다. 여기선 확장자를 pickle 의 p 를 사용했지만 다른 확장자를 사용해도 상관 없다.

pickle.dump 로 객체를 저장 할 때는 open('james.p', 'wb') 와 같이 파일 모드를 wb 로 해야한다. b 는 바이너리(binary)를 뜻하며 바이너리 파일은 컴퓨터가 처리하는 파일 형식이다

파일에서 파이썬 객체 읽기

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 를 사용했지만 파일을 읽을 때에는 pickle.load 를 사용한다.

다른 파일 모드

읽기 'r', 쓰기 'w' 이외에 추가 'a', 배타적 생성 'x'도 있습니다. 추가 모드는 이미 있는 파일에서 끝에 새로운 내용을 추가할 때 사용하고, 배타적 생성 모드는 파일이 이미 있으면 에러(FileExistsError)를 발생시키고 없으면 파일을 만듭니다. 'x'는 베타적 생성(exclusive creation)의 x입니다

또한, 파일의 형식도 함께 지정할 수 있는데, 텍스트 모드 't'와 바이너리 모드 'b'가 있습니다. 이 파일 형식과 읽기, 쓰기 모드를 조합한 텍스트 모드 'rt', 'wt'는 파일을 텍스트 모드로 엽니다. 특히 텍스트 모드는 생략할 수 있어서 그냥 'r', 'w'도 텍스트 모드입니다. 그리고 바이너리 모드 'rb', 'wb' 등은 피클링을 사용하거나 바이너리 데이터를 직접 저장할 때 사용합니다.

그다음에 '+'가 있는데 파일을 읽기/쓰기 모드로 엽니다. 이 모드는 'r+t', 'w+t', 'r+', 'w+', 'r+b', 'w+b' 등으로 조합할 수 있으며 읽기/쓰기 모드인 것은 같지만 파일 처리 방법이 조금씩 다릅니다.

지금까지 나온 파일 모드 조합을 그림으로 정리하면 다음과 같은 구조가 됩니다.

Untitled

profile
벨로그보단 티스토리를 사용합니다! https://flight-developer-stroy.tistory.com/

0개의 댓글