Skip to content

17. 파일(File)


1. 키워드

  • 파일 객체(File Object)
  • 피클링(Pickling)과 언피클링(Unpickling)


2. 파일 사용하기

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


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

  • 이제부터 파일에 문자열을 써서 파일을 만든 뒤에 만든 파일을 읽는 순서로 진행한다.


1) 파일에 문자열 쓰기

  • 파일에 문자열을 쓸 때는 open 함수로 파일을 열어서 파일 객체를 얻은 뒤에 write 메서드를 사용한다.


파일객체 = open(파일이름, 파일모드)
파일객체.write("문자열")
파일객체.close()
file = open("hello.txt", "w")

file.write("Hello, world!")

file.close()


  • 파일을 사용하기 위해서는 먼저 open 함수로 파일을 열어서 파일 객체를 얻어야 한다.
  • 또한 파일에 내용을 쓸 것이므로 파일 모드를 "w"로 지정해 준다.


file = open("hello.txt", "w")


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


file.write("Hello, world!")


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


file.close()


2) 파일에서 문자열 읽기

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


변수 = 파일객체.read()
file = open("hello.txt", "r")

s = file.read()

print(s) # Hello, world!

file.close()


  • 먼저 open을 사용하여 hello.txt 파일을 읽기 모드 "r"로 연다.


file = open("hello.txt", "r")


  • 이제 read의 반환값을 변수에 저장해 주면 파일의 내용을 읽을 수 있다.


s = file.read()

print(s) # Hello, world!


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


file.close()


3) 자동으로 파일 객체 닫기

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


  • 다음과 같이 with 다음에 open으로 파일을 열고 as 뒤에 파일 객체를 지정한다.


with open(파일이름, 파일모드) as 파일객체:
    코드
with open("hello.txt", "r") as file:
    s = file.read()

    print(s) # Hello, world!


  • read로 파일을 읽고나서 close를 사용하지 않아도 된다.


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

  • 이번에는 문자열 여러 줄을 파일에 쓰고 읽는 방법을 알아보자.


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

  • 문자열 여러 줄을 쓸 때는 간단하게 반복문을 사용하면 된다.


with open("hello.txt", "w") as file:
    for i in range(3):
        file.write(f"Hello, world! {i}\n")


  • .py 파일이 있는 폴더의 hello.txt 파일을 열어보면 다음과 같은 내용이 저장되어 있다.


Hello, world! 0
Hello, world! 1
Hello, world! 2


  • 만약 \n을 붙이지 않으면 문자열이 모두 한 줄로 붙어서 저장되므로 주의해야 한다.


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

  • 이번에는 리스트에 들어있는 문자열을 파일에 써보자.


파일객체.writelines(문자열리스트)
lines = ["안녕하세요.\n", "파이썬\n", "코딩 도장입니다.\n"]

with open("hello.txt", "w") as file:
    file.writelines(lines)


  • writelines는 리스트에 들어있는 문자열을 파일에 쓴다.


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

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


변수 = 파일객체.readlines()
with open("hello.txt", "r") as file:
    lines = file.readlines()

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


4) 파일의 내용을 한 줄씩 읽기

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


변수 = 파일객체.readline()
with open("hello.txt", "r") as file:
    line = None

    while line != "":
        line = file.readline()

        print(line.strip("\n"))


  • 파일에 문자열이 몇 줄이나 있는지 모르기 때문에 readline으로 파일을 읽을 때는 while 반복문을 활용해야 한다.


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

  • 파이썬에서는 for 반복문으로 좀 더 간단하게 파일의 내용을 읽을 수 있다.


with open("hello.txt", "r") as file:
    for line in file:
        print(line.strip("\n"))


  • 이렇게 for 반복문에 파일 객체를 지정하면 반복을 할 때마다 파일의 내용을 한 줄씩 읽어서 변수에 저장해 준다.


파일 객체는 이터레이터

  • 파일 객체는 이터레이터이기 때문에 변수 여러 개에 저장하는 언패킹도 가능하다.


>>> file = open("hello.txt", "r")

>>> a, b, c = file

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


  • 할당할 변수의 개수와 파일에 저장된 문자열의 줄 수가 일치해야 한다.


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

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


  • 다음과 같이 파이썬 객체를 파일에 저장하는 과정을 피클링이라고 하고, 파일에서 객체를 읽어오는 과정을 언피클링이라고 한다.


001


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

  • 파이썬 객체를 파일에 저장하는 피클링을 해보자.


  • 피클링은 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:
    pickle.dump(name, file)
    pickle.dump(age, file)
    pickle.dump(address, file)
    pickle.dump(scores, file)


  • 소스 코드를 실행하면 .py 파일이 있는 폴더에 james.p 파일이 생성된다.
  • 여기서는 확장자를 picklep를 사용했지만 다른 확장자를 사용해도 상관없다.
  • 특히 pickle.dump로 객체(값)를 저장할 때는 open("james.p", "wb")와 같이 파일 모드를 "wb"로 지정해야 한다.
  • b는 바이너리(Binary)를 뜻하는데, 바이너리 파일은 컴퓨터가 처리하는 파일 형식이며 메모장 같은 텍스트 편집기로 열어도 사람이 알아보기 어렵다.


2) 파일에서 파이썬 객체 읽기

  • 파일에서 파이썬 객체를 읽어오는 언피클링을 해보자.


  • 언피클링은 pickle 모듈의 load를 사용하며, 언피클링을 할 때는 반드시 파일 모드를 바이너리 읽기 모드 "rb"로 지정해야 한다.


import pickle

with open("james.p", "rb") as file:
    name = pickle.load(file)
    age = pickle.load(file)
    address = pickle.load(file)
    scores = pickle.load(file)

    print(name) # 'james'
    print(age) # 17
    print(address) # '서울시 서초구 반포동'
    print(scores) # {'korean': 90, 'english': 95, 'mathematics': 85, 'science': 82}


  • 앞에서 james.p 파일을 저장할 때 pickle.dump를 네 번 사용했다.
  • 마찬가지로 파일에서 객체(값)를 가져올 때도 pickle.load를 네 번 사용해야 한다.
  • 즉, name, age, address, scores 순으로 저장했으므로 가져올 때도 같은 순서로 가져오면 된다.


다른 파일 모드는 없나요?

  • 파일 모드는 조합에 따라 여러 종류가 있다.
  • 읽기 "r", 쓰기 "w" 이외에 추가 "a", 배타적 생성 "x"도 있다.
  • 추가 모드는 이미 있는 파일에서 끝에 새로운 내용을 추가할 때 사용하고, 배타적 생성 모드는 파일이 이미 있으면 에러(FileExistsError)를 발생시키고 없으면 파일을 만든다.
  • 또한 파일의 형식도 함께 지정할 수 있는데, 텍스트 모드 "t"와 바이너리 모드 "b"가 있다.
  • 이 파일 형식과 읽기, 쓰기 모드를 조합한 텍스트 모드 "rt", "wt"는 파일을 텍스트 모드로 연다.
  • 특히 텍스트 모드는 생략할 수 있어서 그냥 "r", "w"도 텍스트 모드이다.
  • 그리고 바이너리 모드 "rb", "wb" 등은 피클링을 사용하거나 바이너리 데이터를 직접 저장할 때 사용한다.
  • 그다음에 "+"가 있는데 파일을 읽기/쓰기 모드로 연다.
  • 이 모드는 "r+t", "w+t", "r+", "w+", "r+b", "w+b" 등으로 조합할 수 있으며 읽기/쓰기 모드인 것은 같지만 파일 처리 방법이 조금씩 다르다.


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


002


References