Intro
파일의 읽고 쓰기는 아주 기본적으로 알고 있어야 하는 기능이다.
그 동안은 아는 한도 내에서 대강 써왔었는데, 이번에 제대로 알아야 하는 계기가 생겼다.
파일 열기, 쓰기, 닫기
- 파일 열기(&생성) : open()
- 파일 쓰기 : .write(‘내용’)
- 파일 닫기(저장) : .close()
- with 문을 통해 작업하기를 추천함
파일 열기 : open
파일 생성 혹은, 기존 존재하는 파일을 편집 등의 목적으로 열 결우 open 메서드를 사용한다.
1
2
3
4
5
6
7
8
9
10
# 파일 열기 기본 틀
f = open('path/to/file.extension', 'mode')
# 실제 예시
f = open('User/user/Desktop/test.txt', 'w') # 경로 지정해 파일 생성
f = open('test.txt', 'w') # 현재 작업 경로에 파일 생성
f = open('test.txt', 'r') # 기존 존재하는 파일 읽기 모드
f = open('test.txt', 'a') # 기존 존재하는 파일 편집 모드
- open 대상 파일이 존재하지 않는 경우 파일을 생성하고 mode로 파일을 연다.
- open 대상 파일이 존재할 경우 mode로 파일을 연다.
- path를 생략하고 파일 명만 기재할 경우, 현재 작업 폴더(cwd)에 파일이 생성된다.
mode | 영문 | 설명 |
---|---|---|
‘r’ | read | 읽기 모드. 파일 편집이 불가하다. |
‘w’ | write | 쓰기 모드. 파일 편집이 가능하다. 기존의 파일 내용은 지워진다. ‘파일 생성’ 이라고 보는 게 옳다. |
‘a’ | add | 이어쓰기 모드. 기존 내용 뒤에 내용을 덧붙일 수 있다. ‘파일 편집’ 이라고 보면 된다. |
내용 작성 : .write(str)
open 한 파일에 내용을 작성하는 메서드이다.
1
2
3
4
5
6
# 파일을 생성하고 '안녕하세요.(줄바꿈)반갑습니다.' 작성하기
f = open('path/to/test.txt', 'w')
f.write('안녕하세요.\n')
f.write('반갑습니다.')
파일 닫기 : .close()
파일 생성 혹은 편집이 완료되었다면, 반드시 파일을 닫아줘야 한다.
파일을 닫는 순간 저장되며, 닫지 않고 작업을 종료할 경우, 파일은 업데이트 되지 않는다.
1
2
3
4
5
6
7
8
9
10
11
# 파일 생성
f = open('path/to/test.txt', 'w')
# 파일에 내용 추가
f.write('안녕하세요.\n')
f.write('반갑습니다.')
# 파일 닫기(저장)
f.close()
with 문을 통한 파일 편집 (자동저장)
파일을 열고 나서 닫지 않으면 저장이 되지 않는..!
불상사가 발생할 수 있다.
하지만, with 문을 통해 파일 편집을 한다면
자동 저장이 되므로 불상사 방지 가능!
1
2
3
4
5
6
7
8
# with문을 이용할 경우
# --> with문을 벗어나는 순간 파일이 close 됨(자동저장)
with open('path/to/test.txt', 'w') as f:
f.write('안녕하세요.\n')
f.write('반갑습니다.\n')
f.write('안녕히가세요.')
1
2
3
4
5
6
7
8
9
# with문을 이용하지 않는 경우
# .close()를 하지 않으면 저장되지 않음
f = open('path/to/test.txt', 'w')
f.write('안녕하세요.\n')
f.write('반갑습니다.\n')
f.write('안녕히가세요.')
f.close()
자동저장이라는 장점 외에도,
파일 편집 작업이 with 문 안에 작성되므로, 코드의 흐름을 파악하기도 훨씬 좋아진다.
파일 편집시에는 웬만하면 with 문을 쓰도록 하자.
파일 읽기 : readline, readlines
open 을 통해 열린 파일의 내용을 읽기 위해서는 readline, readline 메서드를 이용한다.
- readline() : 파일을 위에서부터 한 줄씩 읽어줌
- readlines() : 파일의 전체 내용을 한 번에 읽어들임
readline
open 한 파일의 내용을 한 줄씩 읽어들일 때 사용한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 파일 생성
with open('path/to/test.txt', 'w') as f:
f.write('안녕하세요\n')
f.write('반갑습니다\n')
f.write('안녕히 계세요.')
# 파일 읽어오기
f = open('path/to/test.txt', 'r')
print(f.readline()) # --> 안녕하세요
print(f.readline()) # --> 반갑습니다
print(f.readline()) # --> 안녕히 계세요.
readlines
open 한 파일의 내용을 한 번에 읽어들인다.
읽어들인 내용은 list 형태로 담긴다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 파일 생성
with open('path/to/test.txt', 'w') as f:
f.write('안녕하세요\n')
f.write('반갑습니다\n')
f.write('안녕히 계세요.')
# 파일 읽어오기
f = open('path/to/test.txt', 'r')
lines = f.readlines()
# 읽어온 내용 출력해보기 1
print(lines)
'''--> ['안녕하세요\n', '반갑습니다\n', '안녕히 계세요.']'''
# 읽어온 내용 출력해보기 2
for line in lines:
print(line)
'''
--> '안녕하세요\n'
--> '반갑습니다\n'
--> '안녕히 계세요.'
'''
예시
심화 예시
객체 탐지의 로그를 txt 파일로 저장하고,
해당 객체가 퇴장하면 로그를 읽어와 dataframe으로 구성하는 작업을 진행해본다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import time
import pandas
# 객체 탐지 결과
object_name = 탐지된 객체 명
object_num = 탐지된 객체 수
# timestamp : 현재 시간 기록
time_stamp = time.strftime('%Y-%m-%d %H:%M:%S')
# 파일 경로
path = ',/' + time_stamp + '.txt'
# 파일 생성 및 내용 작성
with open(path, 'w') as f:
f.write(time_stamp + '\n')
f.write(object_name + '\n')
f.write(object_num)
# 파일 불러오기
f = open(path, 'r') as f:
lines = f.readlines()
# 데이터프레임화
df = pandas.DataFrame(lines, columns = ['time_stamp', 'object_name', 'object_num'])
txt가 아닌 다른 파일
open, readline 은 텍스트 파일만을 대상으로 하지 않는다.
서버에 접속할 때 보안을 위해 access key를 로컬 환경변수로 저장하는 경우가 있는데,
이런 경우에도 사용할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from dotenv import load_dotenv, find_dotenv # 환경변수 관리 모듈
# env 파일 선언
env_file = 'path/to/test.env'
# env 확장자 파일을 생성하고 환경변수 내용 작성
with open(env_file, 'w') as f:
f.write('DB_HOST=host_end_point')
f.write('DB_PORT=port_number')
f.write('DB_ID=user_id')
f.write('DB_PW=user_pw')
# 환경변수 불러오기
env_file = find_dotenv()
load_dotenv(env_file)
print(os.envrion['DB_HOST'])
''' --> host_end_point 출력 '''
Reference
https://wikidocs.net/26
https://ddolcat.tistory.com/642
https://jsp-dev.tistory.com/319