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