컴퓨터를 실행할 때 가장 기본이 되는 단위, 파일!
파일의 종류는 다양하지만, 기본적으로 바이너리 파일binary file과 텍스트 파일text file, 두 가지로 분류 가능한다.
1. 파일의 종류
📌 Binary File
바이너리 파일은 이진 정보로 저장된 파일이다. 즉, bit 형태로 저장된 bytes 형태를 포함하고 있는 파일이다. 대부분, 정보를 효율적으로 저장하기 위해 파일 시스템을 이진 정보를 저장한다. 엑셀이나 워드가 모두 이진 정보로 저장된 이진 파일이다.
개발자들이 파일을 만들 때에도 필요한 정보를 이런 바이너리 형태로 저장한다. 바이너리 파일 형태를 파일 뿐만 아니라 이미지, 비디오, 오디오 등의 데이터를 저장할 수 있으며, 이렇게 바이너리로 저장된 데이터들은 또 다른 프로그램에 의해 interpret될 수 있다.
아래는 .png 이미지 파일을 이미지 뷰어로 interpret한 것과 text editor로 열었을 때 각각 나타나는 화면이다.
📌 Text File
텍스트 파일은 사람이 이해할 수 있는 형태인 문자열 형식으로 저장된 파일이다. 오로지 텍스트만 저장할 수 있기 때문에 이미지, 비디오 등을 저장할 수 있는 바이너리 파일보다 더 제한적이라고 할 수 있다.
개발자가 작성한 python 코드 파일, HTML 파일, 메모장에 저장된 파일들은 모두 텍스트 파일이다.
이때, 텍스트 파일도, 컴퓨터가 이해하기 위해서는 바이너리 형태로 저장되어야 하기 때문에 결국, 텍스트 파일도 바이너리 형태로 저장된다. 이때 텍스트 파일이 바이너리 형태로 변경되는 기준이 인코딩encoding 방식이다. (대표적인 표준 인코딩 방식으로는 아스키코드ASCII나 유니코드Unicode가 있다.)
2. 파일 읽기
📁open() + read(), close()
파이썬에서 텍스트 파일을 다루이 위해서 사용되는 함수는 open()
이다.
f = open("file_name", "file open mode + file format")
f.close()
여기서 f는 하나의 파일 객체라고 생각하면 된다. (파일의 정보가 변수 f에 저장된다.)
파일명을 첫번째 인수에 넣어주고, 두번째 인수에는 파일을 여는 모드를 넣어준다.
f.read()
, f.close()
등의 함수를 사용할 수 있다.
(하나의 파이썬 프로그램이 하나의 파일을 쓰고 있을 때, 사용을 완료하면 반드시 close()
함수를 사용하여 해당 파일을 종료 후, 다른 파일을 사용해야 한다.)
[file open mode]
파일을 여는 모드에는 읽기 모드, 추가 모드, 쓰기 모드, 생성 모드가 있다.
- "r" : 읽기 모드(default, 파일을 읽는 모드, 파일이 존재하지 않으면 에러를 리턴)
- "a": 추가 모드(파일의 마지막에 새로운 내용을 추가하는 모드, 파일이 존재하지 않으면 새로 생성해서 추가, 파일이 존재하면 내용을 추가)
- "w" : 쓰기 모드(파일을 새로 생성하고 파일을 쓰는 모드)
- "x" : 생성 모드(특정 파일을 생성, 만약 이미 같은 이름의 파일이 존재하면 에러를 리턴)
[file format]
- "t": 텍스트 파일(default)
- "b": 바이너리 파일 (e.g. images, video)
⇒ file open mode와 file format을 합쳐서 open()함수의 두번째 파라미터로 전달한다.
e.g. "rt"(default: read+text), "rb"(read+binary), "wb"(write+binary)
✅example
f = open("D:\\mydirectory\file1.txt", "r"):
contents = f.read(10)
print(contents)
f.close()
read()
함수에 인자를 전달하면 일부만 읽어올 수도 있다.
✅example
f = open("D:\\mydirectory\file1.txt", 'rt')
contents = f.read()
print(contents)
f.close()
read모드로 text파일('rt')을 open()함수로 파일을 열고, read()함수로 파일을 읽어온 내용을 contents 변수에 저장한다.
contents를 출력한 후, close()함수로 파일 객체를 닫는다.
📁with문과 함께 사용
with문과 함께 open()함수를 사용할 수 있다. with문을 함께 사용하는 이유는 파일 객체를 더 쉽게 다루기 위해서이다.
(with문은 자원을 획득하고 사용후 종료해야하는 경우 주로 사용한다.)
with문을 들여쓰기를 사용해서 들여쓰기가 있는 코드에서는 open() 함수가 유지되고, 들여쓰기가 끝나면 open()함수도 끝난다.
따라서 위에서처럼 close()함수를 사용하여 파일의 사용 종료를 명시적으로 작성하지 않아도 된다!
with문과 함께 사용할 때에는 파일 객체를 as문을 사용하여 변수에 할당한다.
with EXPRESSION [as VARIABLE]:
BLOCK
✅example
with open("file1.txt", "r") as my_file:
contents = my_file.read()
print(contents)
📁readline() | readlines()
read()
함수가 파일 전체의 텍스트를 문자열로 반환하는 함수였다면, readlines()
함수는 파일의 내용을 한 줄씩 읽어온다. +) readline()
함수는 단 한 줄만 읽어온다.
한 줄의 기준은 \n으로 나뉘고, readlines()
는 결과를 list로 반환한다.
✅example
with open("file1.txt", "r") as my_file:
contents = my_file.readlines()
print(type(contents)) #<class 'list'>
print(contents) #['sentence1 \n', 'sentence2 \n', ...]
3. 파일 쓰기
📁"w" | "a" (write, append)
파일을 쓰기 위해서는 파일 열기 모드를 "w" 또는 "a"로 지정하면 된다.
f = open("my_file.txt", "w")
data = 'I am writing new contents with "w" mode'
f.write(data)
f.close
이후 파일 객체에 write()
함수를 사용하여 내용을 작성하면 된다.
쓰기 모드("w")는 항상 새로운 파일을 생성한 후, 내용을 작성한다. 따라서 위의 코드에서 만약 "my_file.txt"라는 파일이 기존에 있었다면, 기존 파일은 삭제되고 새로운 파일이 생겨 새로운 내용만 기록하게 된다.
이때 기존 파일에 내용을 '추가'하고 싶다면 파일 열기 모드를 "a"로 지정한다.
f = open("my_file.txt", "a")
data = 'I am appending new contents with "a" mode'
f.write(data)
f.close
📁인코딩encoding
파일을 쓰기 위해서는 인코딩도 함께 지정해주어야 한다.
왜냐하면, 앞서 설명하였듯이 텍스트 파일은 이후 컴퓨터가 처리하기 위해 결국 바이너리 파일로 저장되는데, 이때 텍스트를 바이너리 형태로 바꾸는 기준이 인코딩이다. 따라서 인코딩 방식을 지정해주어야 한다.
f = open("my_file.txt", "w", encoding = "utf-8)
f.write("This is contents")
f.close()
📁디렉터리dicrectory 다루기 (os module)
파일은 기본적으로 특정 디렉터리directory에 저장된다. 디렉터리는 os 모듈을 사용하여 쉽게 다룰 수 있다.
import os
os.getcwd()
os.mkdir("new directory")
os 모듈의 getcwd()
함수는 현재 경로(current working direcotry)를 반환해준다.
mkdir()
함수는 새로운 directory를 만들어주는 함수이다. (경로를 따로 지정해주지 않으면 현재 경로에 만들어지고, 절대 경로를 지정하여 현재 경로가 아닌 원하는 곳에 directory를 만들 수도 있다.)
📁pickle 모듈
파이썬 프로그램을 실행할 때 생성되는 변수와 객체는 프로그램이 실행 중일 때에는 메모리에 로딩되었다가 프로그램이 종료되는 사라진다. 하지만 이렇게 사용되는 변수와 객체를 저장하여 필요할 때 다시 불러와야 하는 경우가 있다. 이 경우를 프로그래밍 언어에서는 영속화persistence라고 한다. (예를 들면.. 주피터로 크롤링을 모두 하고 크롤링 한 결과를 csv로 저장하고 싶을때!)
이때 사용할 수 있는 파이썬 모듈이 pickle이다. pickle 모듈은 메모리에 로딩된 객체를 영속화할 수 있도록한다.
pickle 모듈을 사용하는 방법은 객체를 저장할 수 있는 파일을 열고 객체를 넘기면dump 된다.
pickle을 사용할 때에는 파일을 바이트 형식으로 읽거나 써야한다.("rb", "wb")
✅example ('rb)
import pickle
with open('my_dataframe.pickle', 'rb') as f:
data = pickle.load(f)
✅example (wb)
import pickle
list = ['a', 'b', 'c']
with open('my_list.pickle', 'wb') as f:
pickle.dump(list, f)
메모리에만 올라가 있던 list변수를 pickle을 사용해서 f에 넘겨주어dump my_list.csv로 언제든 꺼내볼 수 있게 저장할 수 있게 한다.
(pickle파일 뿐만 아니라, csv, txt, 다양한 형태로 저장 가능하다!)
+) pickle 모듈은 사용자가 직접 생성한 클래스의 객체도 저장한다.
✅example (객체 저장+로드)
my_object = my_class("object_name")
my_class라는 클래스에 "object_name"이라는 파라미터를 전달하여 my_object라는 객체를 만들었다고 가정해보자.
이때 pickle을 사용하여 my_object라는 객체를 따로 저장하여 언제든지 pickle로 load하여 사용할 수 있다는 것이다.
import pickle
with open("my_object.pickle", "wb") as obj:
pickle.dump(my_object, obj)
with open("my_object.pickle", "rb") as obj:
my_obj_load = pickle.load(obj)
먼저 객체를 저장한 후에 저장한 객체를 다시 로드해오는 과정이다.
4. 파일 삭제
import os
os.remove('my_file.txt')
os 모듈을 사용하여 파일을 삭제한다. 이때 파일이 존재하지 않으면 오류가 난다.
import os
if os.path.exists('my_file.txt'):
os.remove('my_file.txt')
파일이 있는지 확인한 후, 제거한다.
+) 참고
Python File Open
Python File Open File handling is an important part of any web application. Python has several functions for creating, reading, updating, and deleting files. File Handling The key function for working with files in Python is the open() function. The open()
www.w3schools.com
What is the difference between binary and text files?
Need a file viewer? Open common file formats with a file viewer for your platform.
fileinfo.com
'Python' 카테고리의 다른 글
[Python Error Handling] ModuleNotFoundError even though Reauirements Satisfied | 패키지 설치하고도 에러가 난다면 🤬 (1) | 2021.10.30 |
---|---|
[python] 람다 함수 lambda function (0) | 2021.10.11 |
[pythonic code] 리스트값을 출력하는 다양한 방법 enumerate() zip() (0) | 2021.10.11 |
[pythonic code] 리스트 컴프리헨션 list comprehention (0) | 2021.10.11 |
[python] ❗❓ 예외 처리 Exception Handling (0) | 2021.09.21 |
댓글