Python 3.10.2
conda 24.9.0
JupyterLab 4.2.5
형식은 간단하다.
open(파일명, 모드)
close() # 열었으면 닫아줘야 한다.
사용했으면 닫아주는 것의 반복이다.
만든 파일이 소스 밖으로 나가는 것은 리소스를 사용한 것이다. 만약 네트워크로 나가는데 close를 안한다면? 에러가 발생한다!
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 파일이다.
절대 경로.
절대 경로로 가져오는 방법도 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?
# 저는 잘 지냅니다.
\ 기호를 파이썬에서는 받아들이지 못하므로(이스케이프 문자) 두번씩 써줘야한다. \ 기호를 / 기호로 바꾼다. 상대 경로
path="./file/input.txt"
f=open(path, "r", encoding="UTF-8") # File 열기
data=f.read() # 객체로부터 모든 내용을 읽는 함수
print(data)
# 사용했으니까 닫기
f.close()
# ✅ 출력 결과
# How are you?
# 저는 잘 지냅니다.
# 열기
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?
# 저는 잘 지냅니다.
# 열기
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?
# 저는 잘 지냅니다.
당연히 편하니까 많이 사용한다.
with open(path, "r", encoding="UTF-8") as f:
data_lines2=f.readlines()
for line in data_lines2:
print(line, end="")
# ✅ 출력 결과
# How are you?
# 저는 잘 지냅니다.
문자열을 파일에 출력한다.
path="./file/output1.txt" # 파일 자동으로 생성됨
with open(path, "w", encoding="UTF-8") as f:
f.write("안녕하세요~\n")
f.write("좋은 하루 보내세요.\n")

여러 줄의 문자열을 한번에 파일에 출력한다. (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)

with open("output3.txt", "a", encoding="UTF-8") as f:
f.write("저녁 추천 메뉴는 김치전입니다~!")

게시판에서 업로드 하는 사람과 다운로드 하는 사람이 있다.
게시판에 글을 올리면 컴퓨터에 있는 내용을 웹상으로 업로드한다.
그리고 다운받는 사람은 웹상에 있는 것을 다운받게된다.
그것처럼 지금까지 텍스트를 내보내고 읽어왔지만, 업로드 및 다운로드를 해서 해당 파일을 ms워드 같은 것으로 오픈하는데,
만약 이미지나 ms워드 같은 것들은 binary 형태로 업로드 및 다운로드를 한다.
그런 주고 받는 것을 해보자.
작성되어 있는 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)


이 짱구 이미지 파일를 입출력해보자.
앞서 말했듯이 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