제로베이스 데이터 파트타임 스쿨 학습 일지 [25.04.05]

[강의 요약]

[Ch 03. 파이썬 중급] 강의 수강

34_텍스트 파일 쓰기부터 39_readlines(), readline()까지 강의 수강하였음

🐢 100일 챌린지 🔥 : [▰▰▰▰▰▰▰▰▰▰                                         ] 20/100일 (20%)

머리 좋은 사람이 너무 부럽다....

강의에서 품고 있는 내용의 총량이 100이라면

내가 한번 수강하고 얻는 내용이 40

복습했을 때 50

또 복습하면 60 정도 머리에 남는다.

스스로의 지능에 좀 현타가 옴

 

 

 

[텍스트 파일 쓰기]

  • 텍스트 파일을 다루기 위해 사용하는 기본 함수
    • open(), write(), read(), close()
  • 텍스트 파일 쓰기 흐름
    • 파일 열기 → 쓰기/읽기 → 파일 닫기

 

 

▶ write() 함수로 파일에 문자열 쓰기 

# 주석 설명 참고하면 된다.
file = open('C:/pythonTxt/test.txt', 'w')  # 파일 쓰기 모드로 열기
strCnt = file.write('Hello world~')        # 문자열 작성
print(f'strCnt: {strCnt}')                 # 쓴 글자 수 출력
file.close()                               # 파일 닫기

주의할 부분!

"w" 모드를 쓰면 기존 내용이 삭제되고 새로 작성된다.

 

 

 

▶ 실습 코드 : 일정 파일

file = open('파일경로', '모드')  
# 모드 예시: 'w' = 쓰기, 'r' = 읽기

시스템 시간 + 오늘의 일정을 한 줄로 출력한다.

[2024년 4월 7일] 제로베이스 데이터 파트타임 글 작성

 

더 나아가서 시간 단위까지 한다면?

import time

lt = time.localtime()
dateStr = '[' + time.strftime('%Y-%m-%d %I:%M:%S %p', lt) + '] '

todaySchedule = input('오늘 일정: ')

file = open('C:/pythonTxt/test.txt', 'w')
file.write(dateStr + todaySchedule)
file.close()
[2024-04-07 03:21:45 PM] 블로그 정리하기

 

 

 

 

[텍스트 파일 읽기]

  • read() 함수
    • 파일을 열고 문자열을 한 번 읽어올 때 사용
  • open() 함수
    • 'r' 모드를 지정하면 읽기 모드로 파일을 연다
  • 읽은 문자열은 변수에 저장하여 출력하거나 가공할 수 있음

 

 

▶ 예제 코드 : tes.txt 파일 읽기

file = open('C:/pythonTxt/test.txt', 'r')

str = file.read()
print(f'str: {str}')

file.close()

 

'test.txt' 파일을 읽기 전용으로 열고, read() 함수로 전체 내용을 문자열로 가져옴

마지막엔 close()로 파일을 닫는다.

 

 

 

 

▶ 실습 코드 : 특정 단어 변경하여 다시 저장

# 파일 열기
file = open('C:/pythonTxt/about_python.txt', 'r')

# 전체 내용 읽기
str = file.read()
print(f'str: {str}')

file.close()

# 특정 단어(Python)를 파이썬으로 변경 (최대 2번만)
str = str.replace('Python', '파이썬', 2)
print(f'str: {str}')

# 변경된 내용 파일에 다시 쓰기
file = open('C:/pythonTxt/about_python.txt', 'w')
strCnt = file.write(str)
file.close()

먼저 'about_python.txt' 파일에서 텍스트를 읽어오고

replace() 함수를 이용해 'Python'이라는 단어를 '파이썬'으로 최대 두 번만 바꿈

이후 바뀐 문자열을 다시 같은 파일에 덮어쓴다('w' 모드 사용해서)

 

 

 

 

 

[텍스트 파일 열기]

  • 파일 모드란?

파이썬에서 파일을 열 때는 open() 함수의 두 번째 인자인 "모드"를 통해 어떤 목적으로 파일을 다룰지 지정

 

 

▶ 예제 코드 : 'w' 모드

파일이 있으면 덮어씀

uri = 'C:/pythonTxt/'

file = open(uri + 'hello.txt', 'w')
strCnt = file.write('Hello world!!')
print(f'strCnt: {strCnt}')
file.close()
file = open(uri + 'hello.txt', 'w')
strCnt = file.write('Hello Python!!')  # 기존 내용을 덮어씀
print(f'strCnt: {strCnt}')
file.close()

 

 

▶ 예제 코드 : 'a' 모드

기존 내용 뒤에 추가

file = open(uri + 'hello.txt', 'a')
file.write('\n')
file.write('Hello data science!!')  # 파일 끝에 추가
file.close()

 

 

▶ 예제 코드 : 'x' 모드

파일이 이미 존재하면 에러

file = open(uri + 'hello.txt', 'x')  # 파일이 이미 있으면 예외 발생
file.write('Nice to meet you!!')
file.close()

이미 있는 파일을 x 모드로 열면 FileExistsError가 발생

 

 

▶ 예제 코드 : 'x' 모드

file = open(uri + 'hello.txt', 'r')
str = file.read()
print(f'str: {str}')
file.close()

 

 

 

▶ 실습 코드 : 사용자 입력으로 소수만 추출해서 파일에 저장

uri = 'C:/pythonTxt/'

def writePrimeNumber(n):
    file = open(uri + 'prime_numbers.txt', 'a')
    file.write(str(n))
    file.write('\n')
    file.close()

inputNumber = int(input("0보다 큰 정수 입력: "))

for number in range(2, inputNumber + 1):
    flag = True
    for n in range(2, number):
        if number % n == 0:
            flag = False
            break

    if flag:
        writePrimeNumber(number)

실행하면 prime_numbers.txt 파일에 2부터 사용자가 입력한 수까지의 소수가 한 줄씩 기록됨

 

 

 

 

[with ~ as 문]

  • with ~ as 문은 파일 작업 후 자동으로 close()를 호출해 주는 구조임
  • 파일을 열고 닫는 과정이 간단해지고, 실수로 파일을 닫지 않는 문제도 방지할 수 있음

 

 

▶ 예제 코드 : with문으로 바꾸기

uri = 'C:/pythonTxt/'

file = open(uri + '5_037.txt', 'a')
file.write('python study!!')
file.close()

file = open(uri + '5_037.txt', 'r')
print(file.read())
file.close()

위 코드를 with문으로 바꾸면 아래 코드가 된다.

with open(uri + '5_037.txt', 'a') as f:
    f.write('python study!!')

with open(uri + '5_037.txt', 'r') as f:
    print(f.read())

많이 사용했었는데 이렇게 하면 파일을 열고 닫는 과정이 생략되고 코드가 더 깔끔해진다.

 

 

 

▶ 실습 코드 : 로또 번호 생성기 프로그램

무작위 로또 번호를 생성해서 파일에 저장함

import random

uri = 'C:/pythonTxt/'

def writeNumbers(nums):
    for idx, num in enumerate(nums):
        with open(uri + 'lotto.txt', 'a') as f:
            if idx < (len(nums) - 2):
                f.write(str(num) + ', ')
            elif idx == (len(nums) - 2):
                f.write(str(num))
            elif idx == (len(nums) - 1):
                f.write('\n')
                f.write('bonus: ' + str(num))
                f.write('\n')

rNums = random.sample(range(1, 46), 7)
print(f'rNums: {rNums}')

writeNumbers(rNums)

결과는 다음과 같다.

39, 14, 19, 17, 27, 42
bonus: 45

내가 이런 걸로 몇 주 구매해 봤는데 운이 나쁜 건지 5천 원 당첨도 안되던 경험이 있다...

 

 

 

 

[writelines()]

  • writelines()는 리스트(List) 또는 튜플(Tuple) 형태의 여러 줄 데이터를 한 번에 파일에 쓰기 위한 함수
  • 각각의 요소에 줄 바꿈을 추가하고 싶다면, 요소마다 \n을 붙여주어야 함

 

 

▶ 예제 코드

languages = ['c/c++', 'java', 'c#', 'python', 'javascript']

uri = 'C:/pythonTxt/'
for item in languages:
    with open(uri + 'languages.txt', 'a') as f:
        f.write(item)
        f.write('\n')

리스트를 하나씩 꺼내서 파일에 쓰고 줄 바꿈 추가

languages = ('c/c++', 'java', 'c#', 'python', 'javascript')

uri = 'C:/pythonTxt/'
with open(uri + 'languages.txt', 'a') as f:
    f.writelines(item + '\n' for item in languages)

writelines()로 여러 줄을 한 번에 작성

 

 

 

▶ 실습 코드 : 과목별 점수 파일 저장

scoreDic = {'kor': 85, 'eng': 90, 'mat': 92, 'sci': 79, 'his': 82}

uri = 'C:/pythonTxt/'
for key in scoreDic.keys():
    with open(uri + 'scoreDic.txt', 'a') as f:
        f.write(key + '\t: ' + str(scoreDic[key]) + '\n')

딕셔너리 전체 객체를 파일에 출력함

dic = {'s1': 90, 's2': 85, 's3': 95}

uri = 'C:/pythonTxt/'
with open(uri + 'scores.txt', 'a') as f:
    print(dic, file=f)

 

 

 

 

[readlines(), readline()]

  • readlines()
    • 파일의 모든 데이터를 한 번에 읽어서 리스트 형태로 반환
  • readline()
    • 한 줄씩 읽어서 문자열로 반환
    • 반복문과 함께 사용하면 파일을 한 줄씩 순차적으로 읽을 수 있음

 

 

▶ 예제 코드 : readlines()

uri = 'C:/pythonTxt/'

with open(uri + 'lans.txt', 'r') as f:
    lanList = f.readlines()

print(f'lanList: {lanList}')
print(f'lanList type: {type(lanList)}')

결과는 리스트 형태로 출력됨

lanList: ['hello python\n', 'hello c/c++\n', 'hello java\n', 'hello javascript\n']
lanList type: <class 'list'>

 

 

▶ 예제 코드 : readline()

uri = 'C:/pythonTxt/'

with open(uri + 'lans.txt', 'r') as f:
    line = f.readline()

    while line != '':
        print(f'line: {line}', end='')
        line = f.readline()

결과는 줄 단위로 출력됨

line: hello python
line: hello c/c++
line: hello java
line: hello javascript

 

 

▶ 실습 코드 : 파일 데이터를 딕셔너리에 저장

scoreDic = {}

uri = 'C:/pythonTxt/'
with open(uri + 'scores.txt', 'r') as f:
    line = f.readline()

    while line != '':
        tempList = line.split(':')
        scoreDic[tempList[0]] = int(tempList[1].strip('\n'))
        line = f.readline()

print(f'scoreDic: {scoreDic}')

결과는 다음과 같다.

scoreDic: {'kor': 85, 'eng': 90, 'mat': 92, 'sci': 79, 'his': 82}

 

 

 

 

[나의 생각 정리]

  • readlines()는 전체 데이터를 리스트로 읽어오기에 반복 처리에 유용함
  • readline()한 줄씩 읽을 때 적합하며, 조건문과 반복문으로 세밀하게 제어 가능
  • 파일의 데이터를 프로그램 내 자료구조(딕셔너리 등)로 가공하면 재사용성과 가독성이 좋아짐
  • 텍스트 파일에서 값을 읽고 처리하는 코드를 작성할 때는 strip(), split()을 적절히 활용해야 함
  • 반복문 안에서 readline()을 사용할 경우 EOF 조건을 명확히 확인해야 오류를 방지할 수 있음

 

 

 

[적용점]

 

  • 파일 전체 내용을 리스트로 가져와 한 번에 다루고 싶을 때?
    • readlines() 사용하여 반복 처리
  • 텍스트 파일을 한 줄씩 읽으며 특정 조건에 따라 분기 처리하고 싶을 때?
    • readline() + while문으로 한 줄씩 제어
  • 파일 데이터를 딕셔너리 등 자료구조로 변환하고 싶을 때?
    • split(':') 등 문자열 함수로 가공 후 자료구조에 저장
  • 문자열 끝 개행 문자까지 깔끔하게 다듬고 싶을 때?
    • .strip('\n') 사용해 후처리
  • 과목별 점수 등 데이터를 파일로 저장 후 불러오는 프로그램이 필요할 때?
    • readline()을 통해 각 줄을 처리하여 딕셔너리로 만듦

 

 

 

 

 

“이 글은 제로베이스 데이터 스쿨 주 3일반 강의 자료 일부를 발췌하여 작성되었습니다.”