Python/Basic

[Python] 파일 읽고 쓰기

Ddolgom 2022. 4. 17. 23:37
반응형

파이썬에서 기본적으로 공부를 할때, print()문을 써서 가장 먼저 "화면 출력"부터 배우게 된다.

가장 많이 봐왔을법한 print("hello python')은 어느 교재나 인터넷에서라도 가장 첫 페이지부터 나오게 된다.

 

파일을 읽고 써보자!

 

 

그 전에 먼저 파일을 통한 입출력 방법에 대해서 기술하고자 한다.

 

단순하게 IDE나 colab에서 코드를 짜서만 할수 없는 일들이 있다. 

외부 파일을 불러와야하는 경우가 대부분으로 txt파일 또는 인공지능에서 필요한 데이터셋의 파일의 형식인 csv.

 

그리고 딥러닝에서 학습시킨 model을 파일로 저장할때, h5파일을 불러오는 일은 굉장히 중요하다. 그리고 Open CV등을 하게 된다면 이미지 파일을 읽고 여는 것도 중요하다.

h5파일은, 딥러닝 모델과 계산을 통해 얻은 가중치(weight)값을 가지고 있는 파일로 딥러닝 과정에서 중요하게 쓰인다.

 

이러한 파일을 생성하고 읽는 일은 상당히 중요하다.

 

1. 파일 생성하기

f = open('new file.txt', 'w') #  open(파일이름, 파일 열기 모드), f는 객체
f.close()

파일을 생성하기 위해서 파이썬 내장 함수인 open을 사용하였고, 파일이름과 파일열기모드를 입력값으로 받고 결괏값으로 파일 객체를 돌려 받았다.

 

파일 열기 모드 설명
r 읽기 모드 - 파일을 읽을때만 사용
w 쓰기 모드 - 파일에 내용을 입력할때 사용
a 추가 모드 - 파일의 마지막에 새로운 내용 추가
(원본파일 삭제없이 추가)

파일을 쓰기 모드로 열면 해당 파일이 이미 존재할 경우 원래 원본이 모두 사라지고, 해당 파일이 없었으면 새로운 파일이 생성된다.

 

위 예시에서는 new file.txt라는 새로운 파일이 현재 위치의 디렉토리에 생성된다.

 

f = open('/root/new file.txt', 'w') # 디렉토리 위치 지정 root폴더 안에 생성된다.
f.close()

 

f.close()

위에서 f.close()는 열려 있는 파일 객체를 닫아 주는 역할을 한다.

프로그램을 종료할 때 파이썬 프로그램이 열려 있는 파일의 객체를 자동으로 닫아 주기도 하지만, close()를 사용하여 열려 있는 파일을 닫아 주는 것이 좋다. 쓰기 모드로 열렸던 파일을 닫지않고 다시 사용하려고 하면 오류가 발생하기 때문이다.

 

2. 파일을 쓰기 모드로 열어 출력값 적기

# write_data.py

f = open('/root/new file.txt','w')
for i in range(1, 101): # 1부터 100까지 대입
  data = '%d번째 줄입니다.\n' % i # 문자열 포맷 코드 활용
  f.write(data) # data를 파일 객체 f에 써라! 

f.close()

위와 같은 코드를 작성하게 되면  new file. txt파일에 다음과 같은 문구들이 생성이 된다.

 

맨 밑에는 "100번째 줄입니다."가 생성되어 있다. range (1, 101)은 1부터 100까지 이다. 101 아님.

위의 txt파일은 colab에서 열어서 확인을 한 결과물이다.

 

로컬에서 진행을 한다면 윈도우의 명령 프롬프트 창에서 root위치에서 다음과 같이 입력을 하면

메모장(txt 파일)이 열리면서 확인이 가능하다.

python write_data.py

 

서두에서 언급하였던 "화면 출력"의 방식은 다음과 같다.

for i in range(1, 101):
	data = '%d 번째 줄입니다. \n' % i
    print(data)

초보자에게는 2가지의 방식의 차이점을 훑는 것을 추천한다.

 

 

 

 

3. 프로그램의 외부에 저장된 파일을 읽는 여러가지 방법

 

1. readline 함수 사용하기

첫번째 방법은 readline 함수를 사용하는 방법이다. 

# readline.py

f = open('/root/new file.txt','r')
line = f.readline()
print(line)
f.close()

위 예는 open() 함수로 파일을 읽기 모드로 열어서 readline() 함수를 사용하여 파일의 첫 번째 줄을 읽어 출력하는 경우이다. 

 

1번째 줄입니다.

라는 문구가 화면에 출력이 되는데, 전체 100번째 줄까지 출력을 하고 싶으면, 다음과 같이 입력하면 된다.

 

# readline_all.py

f = open("/root/new file.txt', 'r')
while True: # 무한 loop
	line = f.readline()
    if not line: break
    print(line)
f.close()

While True라고 하는 무한 loop 구조 안에서 f.readline()을 사용해 파일을 계속해서 한 줄씩 읽어 들이는데, 

만약에 line이 없으면 break를 수행하고 무한 loop에서 벗어난다.

 

1번째 줄입니다.
2번째 줄입니다.
`
`
`
`
`
100번째 줄입니다.

다음과 같이 출력이 된다.

 

 

2. readlines 함수 사용하기 (readline이 아님 readlines임)

f = open('/root/new file.txt' , 'r')
lines = f.readlines()
for line in lines:
	print(line)
    
f.close()

다음 코드는 readlines *복수형 을 사용하여 작성하였다.

 

바로 위와 같은 결과를 나타낸다.

 

3. read 함수 사용하기 

f = open('/root/new file.txt', 'r')
data = f.read()
print(data)
f.close()

 

 

4. 파일에 새로운 내용 추가하기

맨 위쪽 Table에서 파일 열기 모드에는 총 3가지를 기술하였는데, 원래 있던 값을 유지하면서 새로운 값만을 추가하려면 'a' (추가모드, add에서 나온 a)를 사용한다.

 

#add_data.py

f = open('/root/new file.txt', 'a') # a 사용
for i in range(101, 201):
	data = '%d 번째 줄입니다.\n' % i
    f.write(data)
    
f.close()

열기모드에서 'a'로 바꿔주고 실행을 해주면 다음과 같이 추가된 내용을 확인할 수 있다.

 

 

                                                      빨간줄 아랫 부분이 추가된 내용이다. 

 

5. f.close()문 사용하지 않고 자동으로 처리하기 (번외편)

with문과 함께 사용하면, f.close()를 입력했던 번거러움을 줄일 수 있다.

파일을 열고 닫는 것을 자동으로 처리하는 것이다.

 

with open('nmixx.txt', 'w') as f:
	f.write('Nmixx - o.o.')

다음과 같이 with 문을 사용하면 with 문을 벗어나는 순간 열린 파일 객체 f가 자동으로 close가 된다.

 

 

6. 명령 인자값 받아서 매개변수 주기

윈도우 터미널 창에서 python 파일을 실행하려면 다음과 같이 실행을 한다. 

python kepler.py # kepler라는 파이썬 파일을 실행

여기에서 파이썬 파일에 인자값을 줄 수 있다. 다음과 같이 말이다.

python kepler.py wadada # wadada라는 인자값을 1개 주었다.

 이 인자값을 프로그램이 처리를 어떻게 하는지 알아보고자 한다.

 

import sys # sys 모듈을 불러오기

print(sys.argv)

kepler.py에서 sys 모듈을 불러온후, sys.argv라는 것을 출력해보았다.

 

 

 

python 이후에 작성된 kepler.pywadada가 모조리 출력된다.

['kepler.py', 'wadada']

 

보편적으로 다음과 같이 사용할 수 있다.

# kepler2.py

import sys

num1 = int(sys.argv[1])
num2 = int(sys.argv[2])

print(num1, '더하기', num2, '는?', (num1+num2))
(base) root:\python> python kepler2.py 1 2

1 더하기 2 는? 3

위에서 인자값을 2개 받았으며 값을 명확히 알고 있는 경우로 처리하는 방식이다. 위와 같은 경우의 방법은 단순히 linux기반의 CLI 방식뿐만 아니라 윈도우 환경에서의 CLI방식에서 충분히 쓰일수 부분이고 실질적으로 많이 활용이 되는 방식은 아니지만, 알아 놓으면 유용하다.

 

reference : 점프투 파이썬 (개정판), [Python] 파이썬 명령 인자값 받는 방법 (sys.argv) (tistory.com)

반응형