[Python] 파일 읽고 쓰기

Jeongyun Heo·2020년 12월 16일
0

Python

목록 보기
9/36

점프 투 파이썬 참고: https://wikidocs.net/26

파일을 통한 입출력 방법
파일을 새로 만든 다음, 프로그램이 만든 결괏값을 새 파일에 적어본다
파일에 적은 내용을 읽고, 새로운 내용을 추가한다


✍️  파일 생성하기

프로그램을 실행한 디렉터리에 "새파일.txt" 파일이 생성됨

a = open("새파일.txt", 'w') ⬅️ w (쓰기 모드)
a.close() ⬅️ close() 열려 있는 파일 객체를 닫아 주는 역할

파일 객체 = open(파일 이름, 파일 열기 모드)

✏️   파일 열기 모드

파일 열기 모드설명
r (읽기 모드)파일을 읽기만 할 때
w (쓰기 모드)파일에 내용을 쓸 때
a (추가 모드)뒤에 새로운 내용 추가됨

파일을 w(쓰기 모드)로 열면
해당 파일이 이미 존재할 경우 원래 있던 내용이 모두 사라지고 새로 입력되므로
내용을 추가할 때는 a(추가 모드)로 열기

디렉터리에 해당 파일이 없는 상태에서 w(쓰기 모드)로 열면
새로운 파일이 현재 디렉터리에 생성됨

✅   파일 경로 지정 가능

a = open("C:/doit/새파일.txt", 'w') ⬅️ w (쓰기 모드)
a.close() ⬅️ close() 열려 있는 파일 객체를 닫아 주는 역할

📕  close()
열려 있는 파일 객체를 닫아 주는 역할
close()를 사용해서 열려 있는 파일을 직접 닫아 주는 것이 좋다.
w(쓰기 모드)로 열었던 파일을 닫지 않고 다시 사용하려고 하면 오류가 발생하기 때문이다.


✍️   파일을 쓰기 모드로 열어 출력값 적기

파일을 열고 프로그램의 출력값을 파일에 직접 써본다

a = open("새파일.txt", 'w')
for i in range(1, 11):
    data = "%d번째 줄입니다.\n" % i  ⬅️ 줄바꿈 문자 \n 사용해야 다음 줄에 입력됨
    a.write(data) ⬅️ write 함수 사용
a.close()

👉 새파일.txt 열어보면 아래와 같이 내용 입력되어 있음
1번째 줄입니다.
2번째 줄입니다.
3번째 줄입니다.
4번째 줄입니다.
5번째 줄입니다.
6번째 줄입니다.
7번째 줄입니다.
8번째 줄입니다.
9번째 줄입니다.
10번째 줄입니다.

✅   터미널에서 실행

/Users/banana/projects/PythonWorkspace ⬅️ 파일 경로 입력
python 파일명.py ⬅️ 위에 적은 내용 들어있는 파이썬 파일
open 새파일.txt ⬅️ 새로 생성된 파일 열어보기

터미널에서 실행시켜보니까 내가 입력한 파일 경로에
파이썬 파일에 적은 대로 새로운 파일이 생성되었고
새로운 파일 안에는 파이썬 파일에 적은 대로 내용이 입력되어 있었다


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

파이썬에는 외부 파일을 읽어 들여 프로그램에서 사용할 수 있는 여러 가지 방법이 있다.

✅   readline() 함수

readline()을 사용해서 파일의 첫 번째 줄을 읽어 출력한다.

a = open("test.txt", 'r')  ⬅️ r (읽기 모드)
line = a.readline()  ⬅️ readline 함수 사용
print(line)
a.close()

👉 test.txt 파일의 가장 첫 번째 줄이 화면에 출력된다.

모든 줄을 읽어서 화면에 출력하고 싶다면 다음과 같이 작성

a = open("test.txt", 'r')  ⬅️ r (읽기 모드)
while True:
    line = a.readline() ➡️ readline()은 더 이상 읽을 줄이 없을 경우
    if not line:  ➡️ 빈 문자열('')False, not False니까 True
        break  ➡️ 빈 문자열인 경우 while문을 빠져나온다
    print(line)
a.close()

readline()은 더 이상 읽을 줄이 없을 경우 빈 문자열('')을 리턴한다
⭐️ 문자열, 리스트, 튜플, 딕셔너리 값이 비어있으면 거짓, 비어있지 않으면 참
⭐️ 숫자는 값이 0일 때 거짓

✅   사용자의 입력을 받아서 그 내용을 출력하는 경우

while 1:
    data = input()
    if not data:  ➡️ 아무것도 입력 안 하면 False, not False니까 True
        break  ➡️ 아무 값도 입력하지 않으면 while문 빠져나옴
    print(data)

✅   readlines 함수

s가 하나 더 붙어 있음에 유의
readlines 함수는 파일의 모든 줄을 읽어서 각각의 줄을 요소로 갖는 리스트로 돌려준다.

a = open("test.txt", 'r')
lines = a.readlines()  ➡️ 모든 줄을 요소로 갖는 리스트를 돌려준다
for line in lines:  ➡️ lines 리스트에서 첫 번째 요소부터 마지막 요소까지
    print(line)
a.close()

👉 모든 줄이 출력됨. 근데 한 줄씩 사이에 공백 있게 출력됨.

✅   read 함수

read()는 파일의 내용 전체를 문자열로 돌려준다.

a = open("test.txt", 'r')
data = a.read()  ➡️ 파일의 내용 전체를 문자열로 돌려준다
print(data)  ➡️ 파일 내용 전체 출력
a.close()

👉 파일의 모든 내용이 출력됨. readlines와 다르게 줄 사이에 공백 없음.

✍️   파일에 새로운 내용 추가하기

'w'(쓰기 모드)로 파일을 열 때 이미 존재하는 파일을 열면 그 파일의 내용이 모두 사라지게 된다.
원래 있던 값을 유지하면서 새로운 값만 추가하고 싶으면 'a'(추가 모드)로 열면 된다

a = open("test.txt", 'a')  ⬅️ a (추가 모드)
for i in range(11, 21):  ⬅️ 11 이상 21 미만
    data = "%d번째 줄입니다.\n" % i  ⬅️ 줄바꿈 문자 \n 사용해야 한 줄에 하나씩 입력됨
    a.write(data) ⬅️ write 함수 사용
a.close()

👉 기존 내용 안 지워지고 그 뒤에 추가됨
1번째 줄입니다.
2번째 줄입니다.
3번째 줄입니다.
4번째 줄입니다.
5번째 줄입니다.
6번째 줄입니다.
7번째 줄입니다.
8번째 줄입니다.
9번째 줄입니다.
10번째 줄입니다. ➡️ 여기까지 기존에 있던 내용
11번째 줄입니다.
12번째 줄입니다.
13번째 줄입니다.
14번째 줄입니다.
15번째 줄입니다.
16번째 줄입니다.
17번째 줄입니다.
18번째 줄입니다.
19번째 줄입니다.
20번째 줄입니다.

✅   터미널에서 실행

/Users/banana/projects/PythonWorkspace ⬅️ 파일 경로 입력
python 파일명.py ⬅️ 위에 적은 내용 들어있는 파이썬 파일
open 새파일.txt ⬅️ 새로 생성된 파일 열어보기

✍️   with문과 함께 사용하기 (with as)

close() 없이 자동으로 파일 닫기
with문을 사용하면 with 블록을 벗어나는 순간 열린 파일 객체가 자동으로 close되어 편리하다.

▶️ 기존 방식
a = open("test.txt", 'w') ⬅️ 파일 열고
a.write("Life is too short, you need python")
a.close() ⬅️ 파일 닫아준다

with문을 사용하여 다시 작성하면

with open("test.txt", 'w') as a:
    a.write("Life is too short, you need python")

with 블록을 벗어나는 순간 파일 닫음


✍️  sys 모듈로 매개변수 주기

터미널(명령 프롬프트 창)에서 매개변수를 직접 입력하여 프로그램을 실행

sys 모듈의 argv는 명령 창에서 입력한 인수를 의미한다.

argv[0]  ➡️ 파일 이름
argv[1]부터 파일 이름 뒤에 따라오는 인수가 차례로 argv의 요소가 된다.

# sys1.py
import sys

args = sys.argv[1:]
for i in args:
    print(i)

터미널에 python 현재파일명 인수1 인수2 인수3 ... 직접 입력 하고 엔터

MacBookAir PythonWorkspace % python sys1.py one two three

👉
one
two
three


✏️  연습문제

🔷  사용자의 입력을 파일(test.txt)에 저장하는 프로그램을 작성해 보자. (단 프로그램을 다시 실행하더라도 기존에 작성한 내용을 유지하고 새로 입력한 내용을 추가해야 한다.)

f1 = open("test.txt", 'a')
data = input() + "\n"
f1.write(data)
f1.close()
f1 = open("test.txt", 'a')
f1.write(input())
f1.write("\n")
f1.close()

🔷  다음과 같은 내용을 지닌 파일 test.txt가 있다. 이 파일의 내용 중 "java"라는 문자열을 "python"으로 바꾸어서 저장해 보자.

※ replace 함수를 사용해 보자.

f = open("test.txt", 'r')
data = f.read()
f.close()

result = data.replace("java", "python")

f = open("test.txt", 'w')
f.write(result)
f.close()

0개의 댓글