[파이썬 핵심 기초 다지기] 파일 입출력

julian·2025년 2월 20일

python

목록 보기
12/74
post-thumbnail

📌 사용 환경

Python 3.10.2
conda 24.9.0
JupyterLab 4.2.5


1. 파일 입출력

형식은 간단하다.

open(파일명, 모드)
close()  # 열었으면 닫아줘야 한다.  

사용했으면 닫아주는 것의 반복이다.

만든 파일이 소스 밖으로 나가는 것은 리소스를 사용한 것이다. 만약 네트워크로 나가는데 close를 안한다면? 에러가 발생한다!

1.1. 읽기

read(): 파일을 객체로부터 모든 내용을 읽는 함수다. 파일 내용 전체를 한번에 읽어온다.
readline(): 한 줄씩 읽어온다.
readlines(): 전체 내용을 한번에 리스트로 저장한다.

파일 입출력을 하기 전 먼저 txt파일을 하나 생성했다.

그런데 경로에 대해 조금 알아야하는데, 절대경로와 상대경로가 있다.

절대경로는 본인의 로컬상 주소를 말한다.
D:\...\PythonBasic\file\input.txt

반면에 상대경로는 호출하는 파일이 중심이되어 호출하는 파일을 기준으로 하는데,
./는 현재 폴더 ../: 상위 폴더 이다.

그렇다면 만약 현재 작업중인 파일의 디렉터리에
01_Python.ipynb 파일(작업공간)과 calc.py 파일의 2개의 파일과 file이라는 폴더가 있고,
file 폴더 안에 input.txt라는 파일이 있다고 가정하자.
그리고 01_Python.ipynb파일에서 file폴더 안에 있는 input.txt를 가져오려면?
./file/input.txt 와 같이 호출해야한다.

이런 상황에서 이제 코드로 보자.
현재 작업공간은 01_Python.ipynb 파일이다.

1.1.1. read()

  • 파일을 객체로부터 모든 내용을 읽는 함수

절대 경로.

절대 경로로 가져오는 방법도 3가지가 있다.

a="D:\\...\\PythonBasic\\file\\input.txt"
b="D:/.../PythonBasic/file/input.txt"
c=r"D:/.../PythonBasic/file/input.txt"

f=open(c, "r", encoding="UTF-8")  # File 열기
data=f.read()

# ✅ 출력 결과
# How are you?
# 저는 잘 지냅니다.
  • a: \ 기호를 파이썬에서는 받아들이지 못하므로(이스케이프 문자) 두번씩 써줘야한다.
  • b: \ 기호를 / 기호로 바꾼다.
  • c: 경로 그대로 작성하고 앞에 r을 붙여준다.

상대 경로

path="./file/input.txt"
f=open(path, "r", encoding="UTF-8")  # File 열기
data=f.read()  # 객체로부터 모든 내용을 읽는 함수

print(data)

# 사용했으니까 닫기
f.close()

# ✅ 출력 결과
# How are you?
# 저는 잘 지냅니다.

1.1.2. readline()

  • 한줄씩 읽기
# 열기
f=open(path, "r", encoding="UTF-8")
# 한줄씩 읽는 함수
data_line=f.readline()
print(data_line)
# 닫기 (리소스 반환)
f.close()

# ✅ 출력 결과
# How are you?

보통 채팅 프로그램을 만들때 이런식으로 이용할 것이다.
물론 반복문을 이용해서 한줄씩 읽어와서 전체를 다 읽어올 수도 있다.

# 열기
f=open(path, "r", encoding="UTF-8")
# 한줄씩 읽는 함수
while True:
    data_line2=f.readline()
    if data_line2:
        print(data_line2)
    else:
        break
# 닫기 (리소스 반환)
f.close()

# ✅ 출력 결과
# How are you?
# 
# 저는 잘 지냅니다.

readlines()는 개행문자가 함께 저장되기 때문에 한 줄이 더 띄어진 모습을 볼 수 있다.
따라서 이를 고치려면?

# 열기
f=open(path, "r", encoding="UTF-8")
# 한줄씩 읽는 함수
while True:
    data_line2=f.readline()
    if data_line2:
        print(data_line2, end="")
    else:
        break
# 닫기 (리소스 반환)
f.close()

# ✅ 출력 결과
# How are you?
# 저는 잘 지냅니다.

혹은 strip()을 사용한다.

# 열기
f=open(path, "r", encoding="UTF-8")
# 한줄씩 읽는 함수
while True:
    data_line2=f.readline()
    if data_line2:
        print(data_line2.strip())
    else:
        break
# 닫기 (리소스 반환)
f.close()

# ✅ 출력 결과
# How are you?
# 저는 잘 지냅니다.

1.1.3. readlines()

  • 전체 내용 한번에 리스트에 담는다.
# 열기
f=open(path, "r", encoding="UTF-8")
# 한줄씩 읽는 함수
data_lines=f.readlines()
print(data_lines)
# 닫기 (리소스 반환)
f.close()

#  ✅ 출력 결과
# ['How are you?\n', '저는 잘 지냅니다.']

물론 for문을 이용해 한줄씩 print할 수도 있다.

# 열기
f=open(path, "r", encoding="UTF-8")
# 한줄씩 읽는 함수
data_lines=f.readlines()
for line in data_lines:
    print(line, end="")
# 닫기 (리소스 반환)
f.close()

# ✅ 출력 결과
# How are you?
# 저는 잘 지냅니다.

1.1.4. ⭐ with

  • 파일을 열고 닫는 과정을 자동으로 설정 즉, 닫기 리소스 반환을 알아서 한다.

당연히 편하니까 많이 사용한다.

with open(path, "r", encoding="UTF-8") as f:
    data_lines2=f.readlines()

    for line in data_lines2:
        print(line, end="")
        
# ✅ 출력 결과
# How are you?
# 저는 잘 지냅니다.

1.2. 출력

  • write(): 문자열을 파일에 출력한다.
  • writelines(): 여러 줄의 문자열을 한번에 파일에 출력한다. (list)

1.2.1. write()

문자열을 파일에 출력한다.

path="./file/output1.txt"  # 파일 자동으로 생성됨
with open(path, "w", encoding="UTF-8") as f:
    f.write("안녕하세요~\n")
    f.write("좋은 하루 보내세요.\n")

1.2.2. writelines()

여러 줄의 문자열을 한번에 파일에 출력한다. (list)

path="./file/output2.txt"
with open(path, "w", encoding="UTF-8") as f:
    lines=["안녕하세요~\n",
           "좋은 하루 보내세요.\n",
           "행복하세요!\n"]
    f.writelines(lines)

지정한 경로가 없을시 default로 현재 작업 위치에 저장된다.

with open("output3.txt", "w", encoding="UTF-8") as f:
    f.writelines(lines)

1.3. 추가

  • 기존 내용을 유지하고 뒤에 추가
  • 파일이 없을 경우 새롭게 생성
with open("output3.txt", "a", encoding="UTF-8") as f:
    f.write("저녁 추천 메뉴는 김치전입니다~!")

게시판에서 업로드 하는 사람과 다운로드 하는 사람이 있다.
게시판에 글을 올리면 컴퓨터에 있는 내용을 웹상으로 업로드한다.
그리고 다운받는 사람은 웹상에 있는 것을 다운받게된다.

그것처럼 지금까지 텍스트를 내보내고 읽어왔지만, 업로드 및 다운로드를 해서 해당 파일을 ms워드 같은 것으로 오픈하는데,
만약 이미지나 ms워드 같은 것들은 binary 형태로 업로드 및 다운로드를 한다.

그런 주고 받는 것을 해보자.

1.4. Text 파일 입출력

작성되어 있는 txt파일 읽어와서 출력이 아닌 새로운 파일로 내보내기

# 파일 읽기
rpath="./file/input.txt"
with open(rpath, "r", encoding="UTF-8") as f:
    data=f.read()
    # 여기서 print 하지 않고 그냥 써보자.

# 파일 쓰기
wpath="./file/in_output.txt"
with open(wpath, "w", encoding="UTF-8") as f:
    f.write(data)

1.5. Image 파일 입출력

이 짱구 이미지 파일를 입출력해보자.

앞서 말했듯이 Image 파일은 binary 형태로 입출력한다.

# 이미지 파일 읽기
rpath="./file/jjangu.png"
with open(rpath, "rb") as f:  # binary 형태로 read
    data=f.read()
    
# 이미지 파일 쓰기
wpath="./file/jjangu_output.png"
with open(wpath, "wb") as f:  # binary 형태로 write
    f.write(data)


💪 퀴즈

Q1. 다음 중 파일을 읽고 내용이 있는지 확인하는 코드에 대한 설명으로 옳지 않은 것은?
1) f.read() 함수는 파일의 내용을 모두 한 번에 읽어온다.
2) f.readline() 함수는 파일에서 한 줄씩 읽어온다.
3) f.readlines() 함수는 파일의 모든 줄을 리스트로 반환하며, 각 줄마다 개행 문자가 포함된다.
4) f.read()를 사용한 뒤 f.readline()을 호출하면 read()에서 이미 읽은 내용을 다시 읽을 수 있다.

A1. 4

Q2. 다음 중 파일을 덮어쓰는 방식을 고르시오.
1) open(path, "w", encoding="UTF-8")
2) open(path, "r", encoding="UTF-8")
3) open(path, "a", encoding="UTF-8")
4) open(path, "rb", encoding="UTF-8")

A2. 1

Q3. Image 파일을 불러오는 방식으로 옳은 것은?
1) with open('image.jpg', 'rb') as f: data = f.read()
2) with open('image.jpg', 'wb') as f: f.write(data)
3) with open('image.jpg', 'r') as f: data = f.read()
4) with open('image.jpg', 'w') as f: f.write(data)

A3. 1

Q4. 코드가 실행된 후 data 변수에 저장된 내용으로 옳은 것은?

with open("test.txt", "w", encoding="UTF-8") as f:
    f.write("Hello World!")
    
with open("test.txt", "r", encoding="UTF-8") as f:
    data = f.read()

1) "Hello World!"
2) "World!"
3) "Hello"
4) None

A4. 1

Q5. 상대경로에 대한 설명으로 올바르지 않은 것은?
1) 상대경로는 현재 작업 중인 파일을 기준으로 경로를 설정한다.
2) ../는 상위 폴더를 의미한다.
3) 상대경로에서 ./는 현재 폴더를 의미한다.
4) 상대경로는 무조건 절대경로보다 길어야 한다.

A5. 4

profile
AI Model Developer

0개의 댓글