2025.03.15(토) 슈퍼코딩 AI/DATA Day 17 일일보고 - 기본 문법 : 파일입출력

Honey_Bunny·2025년 3월 15일

슈퍼코딩

목록 보기
17/23

파일입출력

  • 외부의 파일에 저장된 데이터를 읽어 올때, 또는 파이썬 프로그램에서 데이터를 파일에 저장할 때 파일 입출력을 사용한다.
  • print()로 모니터 화면(또는 stdout)에 출력된 것은 파일로 redirect 시킬수도 있으나, 이것은 파이썬의 기능이 아니라 OS에서 제공하는 기능이다.

파일 열고 닫기

  • 파이썬에서의 파일을 열때는 open() 함수로 파일을 열어서 파일객체를 만든다
  • 파일객체를 통해 파일의 데이터를 읽거나 쓴 후에는 파일객체를 닫아야 하는데 이때는 close() 함수를 사용한다.

f = open("test.txt", "w", encoding="utf-8")
f.close()
  • "test.txt" 는 파일명
  • "w" 는 파일 열기 모드
  • "utf-8" 은 인코딩 모드 이다. 항상 encoding을 사용하는것은 좋은 습관이다.

파일이 닫혔는지 열려 있는지는 f.cosed 를 통해 알수 있다.

f = open("test.txt", "w", encoding="utf-8")
print("open() 다음에:", f.closed)
# f.closed : 내장 변수
출력 - open() 다음에 : False 
f.close()
print("close() 다음에:", f.closed)
출력 - close() 다음에 : True 

파일명과 파일경로

  • 파일명에는 절대경로 일 경우 드라이브 와 폴더를 포함 한다. C:/my_folder/test.txt"
  • Windows에서도 슬래시(forward slash, /)를 사용하여 폴더를 구분할 수 있다.
  • 역슬레시(backward slash, )를 사용하려면 C:\my_folder\test.txt"처럼 역슬레시를 2개씩 사용해야 한다.
  • 폴더 이름이 생략되면 현재위치(Current Working Directory)를 간주한다.
  • 다음과 같이 current working directory 를 알아 볼수 있다.

curent working directory

import os
cwd = os.getcwd()
print(cwd)
출력 : /content
= 경로를 안썼을 때 /content 로케이션에 저장됨.
  • 절대경로 및 정규화된 경로
import os

path를 절대경로(abspath) 로 만들기

path1 = "myfile.txt"
full_path = os.path.abspath(path1)
print("abs path:", full_path)
출력 - abs path : /content/myfile.txt

path를 normalize 하기

path2 = "myfolder/../myfile.txt"
normalized_path = os.path.normpath(path2)
print("normalized path:", normalized_path)
출력 - normalized path : myfile.txt

path를 join 하기

folder_path = "myfolder"
file_path = "myfile.txt"
joined_path = os.path.join(folder_path,"sub_folder", file_path)
print("join path:", joined_path)
출력 - join path : myfolder/sub_folder/myfile.txt

good practive (좋은 practive)

path3 = os.path.join(cwd, "myfolder", "myfile.txt")
print("good practive path:", path3)
출력 - good practive path : /content/myfolder/myfile.txt
  • 파일이 존재하는지 확인 하기
import os
filename = "myfile.txt"
is_exist = os.path.exists(filename)
print(f"{filename} 존재 여부: {is_exist}") # 읽기 전에 반드시 디렉토리에 존재하는지 확인해야됨.
출력 - myfile.txt 존재 여부 : False 

파일모드

  • "r" : 읽기 모드 - 파일을 읽기만 할 때
  • "w" : 쓰기 모드 - 파일에 쓰기만 할 때, 또는 새로운 파일을 생성 할 때
  • "a" : 추가 모드 - 파일의 마지막에 새로운 데이터를 붙여 쓰기 할 때
  • "r+" : 읽고 쓰기 모드 - 파일을 읽고 쓰기를 같이 할 때
  • 파일 모드가 생략되면 "r"이 가정된다

파일에 출력(write)하기

  • 파일에 데이터를 쓸때에는 wite()함수를 사용하여 데이터를 출력한다.
  • 주의 하여야 할 것은 wite() 함수를 사용할때에는 모든 데이터를 문자열 데이터로 변환하여 출력해야 한다.
  • 줄 바꿈 문자 \n 또는 \r\n 도 문자열에 포함하여야 한다.

파일에 문자열 데이터 출력하기

f = open("myfile.txt", 'w', encoding="utf-8")
for i in range(1, 11):
    data = f"{i}번째 줄입니다.\n"
    f.write(data)
f.close()
print("done")
print("is exists : ", os.path.exists("myfile.txt"))
출력 : done
출력 : is exists : True

파일에서 데이터 읽기


read()

  • read() 함수를 통해 파일의 모든 데이터를 하나의 문자열로 읽어 온다.
  • 파일의 크기가 클 때에는 메모리를 많이 잡아먹거나 메모리 에러가 날 수 있으니 주의하여 사용하여야 한다.

위에서 myfile.txt 에 출력한 내용을 읽어 오기
먼저 위의 코드를 실행하여 myfiletxt에 데이터를 출력한 다음에 아래 코드드를 실행하세요.

f = open("myfile.txt", 'r', encoding="utf-8")
data = f.read()
print(data)
print(repr(data)) # 한줄의 데이터로 읽기.
f.close()
출력 : 1번째 줄입니다.
출력 : 2번째 줄입니다.
출력 : 3번째 줄입니다.
출력 : 4번째 줄입니다.
출력 : 5번째 줄입니다.
출력 : 6번째 줄입니다.
출력 : 7번째 줄입니다.
출력 : 8번째 줄입니다.
출력 : 9번째 줄입니다.
출력 : 10번째 줄입니다.
출력 : '1번째 줄입니다.\n2번째 줄입니다.\n3번째 줄입니다.\n4번째 줄입니다.\n5번째 줄입니다.\n6번째 줄입니다.\n7번째 줄입니다.\n8번째 줄입니다.\n9번째 줄입니다.\n10번째 줄입니다..\n')

readlines()

  • readlines()함수로 파일의 모든 데이터를 문자열 리스트로 읽어 온다
  • 파일에서 1줄의 데이터가 리스트의 하나의 아이템이 된다.
  • 각각의 아이템(줄)에 줄바꿈 문자가 포함되어 있다.

f = open("myfile.txt", 'r', encoding="utf-8")
lines = f.readlines() # 전체 줄을 한번에 읽어와서 반환
print("총 줄수:", len(lines))
print(lines)
f.close()
출력 - 총 줄수 : 10
출력 - ['1번째 줄입니다.\n','2번째 줄입니다.\n','3번째 줄입니다.\n','4번째 줄입니다.\n','5번째 줄입니다.\n','6번째 줄입니다.\n','7번째 줄입니다.\n','8번째 줄입니다.\n','9번째 줄입니다.\n','10번째 줄입니다.\n',] 

한 줄씩 출력

for line in lines:
  print(line.strip()) # 줄바꿈 문자도 포함되어 있기 때문에.
출력 - 1번째 줄입니다.
출력 - 2번째 줄입니다.
출력 - 3번째 줄입니다.
출력 - 4번째 줄입니다.
출력 - 5번째 줄입니다.
출력 - 6번째 줄입니다.
출력 - 7번째 줄입니다.
출력 - 8번째 줄입니다.
출력 - 9번째 줄입니다.
출력 - 10번째 줄입니다.
  • 위에서 line.strip() 하지 않으면 줄바꿈 문자가 포함되어 있어 print()할때 두줄씩 줄바꿈이 된다

readline()

  • readline()함수로 파일에서 한 줄씩 읽어 온다.
  • 읽어온 문자열에는 줄 바꿈 문자가 포함되어 있다.
  • 더이상 읽을 데이터가 없으면 None 값을 return 한다.

한 줄씩 읽기

f = open("myfile.txt", 'r', encoding="utf-8")
line = f.readline()
while line: # None이 아닌경우에만 실행 / None일 경우 False
  print(line.strip())
  line = f.readline()
f.close()
출력 : '1번째 줄입니다.\n'
출력 : '2번째 줄입니다.\n'
출력 : '3번째 줄입니다.\n'
출력 : '4번째 줄입니다.\n'
출력 : '5번째 줄입니다.\n'
출력 : '6번째 줄입니다.\n'
출력 : '7번째 줄입니다.\n'
출력 : '8번째 줄입니다.\n'
출력 : '9번째 줄입니다.\n'
출력 : '10번째 줄입니다.\n'

with 키워드를 사용하여 파일 자동으로 열고 닫기

  • with 키워드를 사용하면 close()를 하지 않아도 자동으로 파일을 닫을 수 있다.
  • 도중에 예외가 발생하더라도 파일이 올바르게 닫히므로, with 키워드를 사용하는 좋은 습관이다.
with open(파일 이름, 파일 열기 모드) as f:
    파일 객체 f를 사용하여 파일 read 또는 write

한 줄씩 읽기

with open("myfile.txt", 'r', encoding="utf-8") as f: # open한 파일이 f로 간다는 뜻.
  line = f.readline() # 빠져나가면 자동으로 f.close()가 된다. / 버그를 줄일 수 있음.
  while line: 
    print(line.strip())
    line = f.readline() # 돌아가는 동안은 f.closed = False 멈쳤을 때는 f.closed = True
출력 - 1번째 줄입니다.
출력 - 2번째 줄입니다.
출력 - 3번째 줄입니다.
출력 - 4번째 줄입니다.
출력 - 5번째 줄입니다.
출력 - 6번째 줄입니다.
출력 - 7번째 줄입니다.
출력 - 8번째 줄입니다.
출력 - 9번째 줄입니다.
출력 - 10번째 줄입니다.

using with with open

with open("myfile.txt", "w", encoding="utf-8") as f:
  f.write("Hello, World!")
with open("myfile.txt", "w", encoding="utf-8") as f:
  print(f.read())
출력 : Hello, World!! 

파일 입출력 연습문제 1

주어진 파일 이름으로 파일을 생성하고, 주어진 내용을 파일에 씁니다.
만약 파일이 이미 존재한다면, 기존 내용을 덮어씁니다.
에러 발생시 예외 처리는 하지 않아도 됩니다.
Args:
    filename: 생성할 파일의 이름 (문자열)
    content: 파일에 쓸 내용 (문자열)

파일 입출력 연습문제 1 : 파일 생성 및 쓰기

import os
def create_and_write_file(filename, content):
    """
    주어진 파일 이름으로 파일을 생성하고, 주어진 내용을 파일에 씁니다.
    만약 파일이 이미 존재한다면, 기존 내용을 덮어씁니다.
    Args:
        filename: 생성할 파일의 이름 (문자열)
        content: 파일에 쓸 내용 (문자열)
    """
# f = open(filmename, "w", encoding="utf-8") # "w"버전으로 open하는 것부터가 clean을 하고 진행하는 것.
# f.write(content)
# f.close()
with  open(filename, "w", encoding="utf-8") as f:
 f.write(content)
print(f"파일 '{filename}'이 성공적으로 생성 및 쓰기 완료되었습니다.")

예시 사용

filename = "my_file.txt"

파일 생성 및 쓰기

create_and_write_file(filename, "This is the first line. \nThis is the second line.")
출력 :  파일 'myfile.txt'이 성공적으로 생성 및 쓰기 완료되었습니다.

파일 입출력 연습문제 2

주어진 파일 이름의 파일을 읽고, 파일의 내용을 출력합니다.
파일이 존재하지 않으면 오류 메시지를 출력합니다.
에러 발생시 예외 처리는 하지 않아도 됩니다.
Args:
    filename: 읽을 파일의 이름 (문자열)

파일 입출력 연습문제 2 : 파일 읽기 및 내용 출력

import os
def read_and_print_file(filename):
    """
    주어진 파일 이름의 파일을 읽고, 파일의 내용을 출력합니다.
    파일이 존재하지 않으면 오류 메시지를 출력합니다.
    Args:
        filename: 읽을 파일의 이름 (문자열)
    """
    if os.path.exist(filename):
      # file이 존재할 경우
      with open(filename, "r", encoding="utf-8") as f :
	data = f.read()
	print(data)
    else:
      # file이 존재하지 않을 경우
        print(f"파일 '{filename}'을 찾을 수 없습니다.")

예시 사용

filename = "my_file.txt"

파일 생성 및 쓰기 연습문제 1 실행

# create_and_write_file(filename, "This is the first line.\nThis is the second line.")

파일 읽기 및 내용 출력

read_and_print_file(filename)

없는 파일 케이스

read_and_print_file("non_existent_file.txt")
출력 : This is the first line.
출력 : This is the second line.
출력 : 파일 'non_existent_file.txt'을 찾을 수 없습니다.

파일 입출력 연습문제 3

주어진 파일 이름의 파일의 끝에 주어진 내용을 추가합니다.
파일이 존재하지 않으면 새 파일을 생성하고 내용을 씁니다.
Args:
    filename: 추가 쓸 파일의 이름 (문자열)
    content: 파일에 추가할 내용 (문자열)

파일 입출력 연습문제 3: 파일 추가 쓰기

def append_to_file(filename, content):
    """
    주어진 파일 이름의 파일의 끝에 주어진 내용을 추가합니다.
    파일이 존재하지 않으면 새 파일을 생성하고 내용을 씁니다.
    Args:
        filename: 추가 쓸 파일의 이름 (문자열)
        content: 파일에 추가할 내용 (문자열)
    """
    with open(filename, "a", encoding = "utf-8") as f:
      f.write(content)
    print(f"파일 '{filename}'에 내용이 성공적으로 추가되었습니다.")

예시 사용

filename = "my_file.txt"

파일 생성 및 쓰기 연습문제 1 실행

# create_and_write_file(filename, "This is the first line.\nThis is the second line.")

파일 읽기 및 내용 출력 연습문제 2 실행

# read_and_print_file(filename)

파일에 내용 추가

append_to_file(filename, "\nThis is an appended line.")

파일 읽기 및 내용 출력 (추가된 내용 확인)

read_and_print_file(filename)
출력 : 파일 'my_file.txt'에 내용이 성공적으로 추가되었습니다.
출력 : This is the first line.
출력 : This is the second line.
출력 : This is an appended line.
출력 : 'This is the first line.\nThis is the second line.\nThis is an appended line.'

파일 입출력 연습문제 4

주어진 파일에서 특정 줄을 읽어서 반환합니다.
파일이 없으면 오류 메시지를 출력합니다.
line_number가 유효하지 않으면 오류 메시지를 출력합니다.
오류가 발생하면 None 값을 반환 합니다.
Args:
  filename: 파일 이름 (문자열)
  line_number: 읽을 줄 번호 (정수, 1부터 시작)

파일 입출력 연습문제 4: 파일에서 특정 줄 읽기

def read_specific_line(filename, line_number):
    """
    주어진 파일에서 특정 줄을 읽어서 반환합니다.
    파일이 없으면 오류 메시지를 출력합니다.
    line_number가 유효하지 않으면 오류 메시지를 출력합니다.
    오류가 발생하면 None 값을 반환 합니다.
    Args:
      filename: 파일 이름 (문자열)
      line_number: 읽을 줄 번호 (정수, 1부터 시작)
    """
    if os.path.exists(filename):
      # file exists
	if line_number == null:
	   print(f"라인번호 {line_number}가 유효하지 않습니다.")
	   return None	
    else:
        print(f"파일 '{filename}'을 찾을 수 없습니다.")
        return None

예시 사용 `

filename = "my_file.txt"

파일 생성 및 쓰기 연습문제 1 실행

# create_and_write_file(filename, "This is the first line.\nThis is the second line.")

파일 읽기 및 내용 출력 연습문제 2 실행

# read_and_print_file(filename)

파일에 내용 추가 연습문제 3 실행

# append_to_file(filename, "\nThis is an appended line.")

파일 읽기 및 내용 출력 (추가된 내용 확인) 연습문제 3 실행

# read_and_print_file(filename)

특정 줄 읽기

line2 = read_specific_line(filename, 2)
print(f"2번째 줄: {line2}")
line3 = read_specific_line(filename, 3)
print(f"3번째 줄: {line3}")
line5 = read_specific_line(filename, 5)
print(f"5번째 줄: {line5}")
file_not_exist = read_specific_line("non_existent_file.txt", 1)
print(f"10번째 줄: {line_not_exist}")
출력 - 2번째 줄: This is an appended line.
출력 - 3번째 줄: This is an appended line.
출력 - 5번째 줄: This is an appended line.
출력 - 파일 'non_existent_file.txt'을 찾을 수 없습니다.
출력 - 10번째 줄: None

profile
현재 : C# WPF 개발자 / 목표 : AI 의료 영상 분석 연구원

0개의 댓글