Day20. 파이썬 중급문풀 (8)

Junghwan Park·2023년 5월 2일
0

스터디노트

목록 보기
21/54

[연습문제] 텍스트 파일(01)

  • 회원 계정별 텍스트 파일을 생성한 후 회원 본인 파일에
    '한 줄 일기'를 쓰고 읽는 프로그램을 만들어보자.

[모듈파일]

import time

def writeDaiary(u, f , d):  # 다이어리 쓰기 기능    u:경로, d:내용
    lt = time.localtime()   # 다이어리가 언제 쓰였는지
    timeStr = time.strftime('%Y-%m-%d %I:%M:%S %p', lt)   # 시간의 출력 형식 설정

    filePath = u + f
    with open(filePath, 'a') as f:  # with ~ as
        f.write(f'[{timeStr}] {d}\n')

def readDiary(u, f):    # 다이어리 읽기 기능

    filePath = u + f
    datas = []
    with open(filePath, 'r') as f:  # with ~ as
        datas = f.readlines()

    return datas

[실행파일]

import diary

members = {}
uri = 'C:/pythonTxt/'

def printMembers(): # 회웑 정보를 출력하는 함수
    for m in members.keys():
        print(f'ID : {m} \t PW : {members[m]}')

while True:
    selectNum = int(input('1. 회원가입 2. 한줄일기쓰기, 3. 일기보기, 4. 종료'))

    if selectNum == 1:
        mId = input('input ID : ')
        mPw = input('input PW : ')
        members[mId] = mPw  # mId가 키값 mPw가 벨류값
        printMembers()

    elif selectNum == 2:
        mId = input('imput ID : ')
        mPw = input('input PW : ')

        if mId in members and members[mId] == mPw:
            print('login success!!')
            fileName = 'myDiary_' + mId + '.txt'
            data = input('오늘 하루 인상 깊은 일을 기록하세요. ')
            diary.writeDaiary(uri, fileName, data)

        else:
            print('login fail!!')
            printMembers()

    elif selectNum == 3:
        mId = input('imput ID : ')
        mPw = input('input PW : ')

        if mId in members and members[mId] == mPw:
            print('login success!!')
            fileName = 'myDiary_' + mId + '.txt'
            datas = diary.readDiary(uri, fileName)
            for d in datas:
                print(d, end = '')  # 위에서 개행 해줬으므로 개행을 막아줌 !

        else:
            print('login fail!!')
            printMembers()

    elif selectNum == 4:
        print('종료 합니다.')
        break

[연습문제] 텍스트 파일(02)

  • 텍스트 파일에 수입과 지출을 기록하는 가계부를 만들어보자.

잔고만 기록하는 파일, money.txt
입출금 기록하는 파일 두가지가 필요!

import time

def getTime():  # 현재 시간을 가지고 오는 함수
    time.localtime()
    st = time.strftime('%Y-%m-%d %H:%M:%S')
    return st

while True:

    selectNumber = int(input('1.입금, \t 2.출금, \t 3.종료 '))

    if selectNumber == 1:
        money = int(input('입금액 입력 : '))
        with open('C:/pythonTxt/bank/money.txt', 'r') as f:  # 잔금만 있는 money.txt 읽기
            m = f.read()

        with open('C:/pythonTxt/bank/money.txt', 'w') as f:  # 금액을 갱신해야함으로 'w' 모드
            f.write(str(int(m) + money))    # 계산된 값을 읽기위해 str로 스트링 해준다

        memo = input('입금 내역 입력 : ')
        with open('C:/pythonTxt/bank/poketMoneyRegister.txt', 'a') as f:  # 입금 내역을 기록하는 파일 'a' 모드를 사용한다 ! 그 이유 잘 기억하기
            f.write('-----------------------------------------\n')
            f.write(f'{getTime()} \n')
            f.write(f'[입금] {memo} : {str(money)}원 \n')
            f.write(f'[잔액] {str(int(m) + money)}원 \n')

        print('입금 완료!!')
        print(f'기존 잔액 : {m}')
        print(f'입금 후 잔액 : {int(m) + money}')

    elif selectNumber == 2:
        money = int(input('출금액 입력 : '))
        with open('C:/pythonTxt/bank/money.txt', 'r') as f:  # 잔금만 있는 money.txt 읽기
            m = f.read()

        with open('C:/pythonTxt/bank/money.txt', 'w') as f:  # 금액을 갱신해야함으로 'w' 모드
            f.write(str(int(m) - money))  # 계산된 값을 읽기위해 str로 스트링 해준다

        memo = input('출금 내역 입력 : ')
        with open('C:/pythonTxt/bank/poketMoneyRegister.txt', 'a') as f:  # 출금 내역을 기록하는 파일 'a' 모드를 사용한다 ! 그 이유 잘 기억하기
            f.write('-----------------------------------------\n')
            f.write(f'{getTime()} \n')
            f.write(f'[출금] {memo} : {str(money)}원 \n')
            f.write(f'[잔액] {str(int(m) - money)}원 \n')

        print('출금 완료!!')
        print(f'기존 잔액 : {m}')
        print(f'출금 후 잔액 : {int(m) - money}')
    elif selectNumber == 3:
        print('종료 합니다.')
        break
    else:
        print('다시 입력하세요!!')

[연습문제] 텍스트 파일(03)

  • 사용자가 입력한 숫자의 약수를 텍스트 파일에 기록해 보자.
# 약수

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

divisor = []
for number in range(1, (inputNumber + 1)):
    if inputNumber % number == 0:   # 약수
        divisor.append(number)

if len(divisor) > 0:    # 0보다 크면 약수가 존재 하는 것
    try:    # 예외처리
        with open('C:/pythonTxt/divisor.txt', 'a') as f:    # 덮어씌우는 'a'
            f.write(f'{inputNumber}의 약수: ') # 사용자가 입력한 숫자의 약수
            f.write(f'{divisor}\n')

    except Exception as e:
        print(e)
    else:
        print('divisor write complete!!')


# 소수

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

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

    if flag:
        prime.append(number)

if len(prime) > 0:    # 0보다 크면 소수가 존재 하는 것
    try:    # 예외처리
        with open('C:/pythonTxt/prime.txt', 'a') as f:    # 덮어씌우는 'a'
            f.write(f'{inputNumber}까지의 소수: ') # 사용자가 입력한 숫자의 약수
            f.write(f'{prime}\n')
            f.write(f'{len(prime)}개')   # 개수 출력

    except Exception as e:
        print(e)
    else:
        print('prime write complete!!')

[연습문제] 텍스트 파일(04)

  • 두 개의 수를 입력하면 공약수를 텍스트 파일에 작성해보자.
num1 = int(input('1보다 큰 정수 입력: '))
num2 = int(input('1보다 큰 정수 입력: '))

common = []
for i in range(1, (num1 + 1)):
    if (num1 % i == 0) and (num2 % i == 0): # 공약수
        common.append(i)

if len(common) > 0: # 0보다 크면 공약수가 하나라도 있다는 것
    try:
        with open('C:/pythonTxt/common.txt', 'a') as f:
            f.write(f'{num1}과 {num2}의 공약수 : ')
            f.write(f'{common}\n')

    except Exception as e:
        print(e)

else:
    print('common factor write complete!!')


# 수 두개의 최대공약수

num1 = int(input('1보다 큰 정수 입력: '))
num2 = int(input('1보다 큰 정수 입력: '))

maxComNum = 0

for i in range(1, (num1 + 1)):
    if (num1 % i == 0) and (num2 % i == 0): # 공약수
        maxComNum = i   # 가장 마지막 값이 들어간다

try:
    with open('C:/pythonTxt/maxComNum.txt', 'a') as f:
        f.write(f'{num1}과 {num2}의 최대공약수 : {maxComNum}\n')

except Exception as e:
    print(e)

else:
    print('max common factor write complete!!')

3개를 입력받는 것도 해볼 것!


[연습문제] 텍스트 파일(05)

  • 섬마을에 과일, 생선, 야채를 판매하는 배가 다음 주기로 입항한다고 할 떄,
    모든 배가 입항하는 날짜를 텍스트 파일에 기록해보자.

(첫 입항일은 2021년 1월 1일 오전 10시로 한다.)


과일 선박 : 3일주기
생선 선박 : 4일주기
야채 선박 : 5일주기

# 최소공배수, 최대공약수 구해서 해결

ship1 = 3
ship2 = 4
ship3 = 5
maxDay = 0

for i in range(1, (ship1 + 1)):
    if ship1 % i == 0 and ship2 % i == 0:
        maxDay = i  # 1,2번 선박의 최대공약수가 구해진다

mindDay = (ship1 * ship2) // maxDay # 1,2번 선박의 최소공배수

newDay = mindDay
for i in range(1, (newDay + 1)):
    if newDay % i == 0 and ship3 % i == 0:
        maxDay = i  # 3번 선박까지 포함한 최대공약수

minDay = (newDay * ship3) // maxDay

print(f'minDay : {minDay}')
print(f'maxDay : {maxDay}')

from datetime import datetime
from  datetime import timedelta # 날짜 관련 모듈

n = 1
baseTime = datetime(2021, 1, 1, 10, 0, 0)   # 기준일   2021년 1월 1일 10시 0분 0초 설정

with open('C:/pythonTxt/arrive.txt', 'a') as f:
    f.write(f'2021년 모든 선박 입항일{baseTime}\n')
    f.write(f'{baseTime}\n')

nextTime = baseTime + timedelta(days = minDay)    # 1월1일에서 최소공배수 60일이 지난 날짜 구하는 변수, timedelta()가 알아서 계산해준다

while True:

    with open('C:/pythonTxt/arrive.txt', 'a') as f:
        f.write(f'{nextTime}\n')

    nextTime = nextTime + timedelta(days = minDay)
    if nextTime.year > 2021:
        break   # 2021년이 지나면 멈춘다

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

profile
안녕하세요 반갑습니다^^

0개의 댓글