[Python][중급] 연습 문제 _텍스트파일

·2023년 3월 14일
0

[Python] 연습 문제

목록 보기
7/12
post-thumbnail

📌 파이썬 연습문제 [텍스트파일]

📋 텍스트 파일 읽기/쓰기

import datetime
import time

path = "C:/Users/YUN/Python/"

💡클래스 User

class User:
    def __init__(self, id, pw):
        self.id = id
        self.pw = pw
        self.diary = ''

💡클래스 ManagerUser

class ManagerUser:
    def __init__(self):
        self.users = {}

    def join(self, user):
        if user.id in self.users:
            print(f'{user.id}는 이미 존재하는 ID 입니다.')
        else:
            self.users[user.id] = user

        for id in self.users.keys():
            allUser = self.users[id]
            print(f'ID : {allUser.id}\t | \tPW : {allUser.pw}')

    def writeDiary(self, user):
        if user.id in self.users:
            checkUser = self.users[user.id]
            if checkUser.pw == user.pw:
                print('\t Login Success \t')
                # time = datetime.datetime.now()
                lt = time.localtime()
                timeStr = time.strftime('%Y-%m-%d %I:%M:%S %p', lt)
                # 파일 쓰기
                txt = input('오늘 하루 인상 깊은 일을 기록하세요 : ')
                with open(path + f'_{user.id}.txt', 'a') as file:
                    file.write(f'[{timeStr}] {txt}\n')
                    user.diary = f'{path}_{user.id}.txt'

                self.users[user.id] = user
            else:
                print(f'올바르지 않은 패스워드입니다.')
        else:
            print(f'{user.id} 존재하지 않는 ID 입니다')

    def viewDiary(self, user):
        if user.id in self.users:
            checkUser = self.users[user.id]
            if checkUser.pw == user.pw:
                print('\t Login Success \t')

                # 파일 읽기
                with open(checkUser.diary, 'r') as file:
                    line = file.readline()
                    while line != '':
                        print(line)
                        line = file.readline()
            else:
                print(f'올바르지 않은 패스워드입니다.')

        else:
            print(f'{user.id} 존재하지 않는 ID 입니다')

---------------------------------------------------

💡main

manage = ManagerUser()

while True:

    try:
        n = int(input('1. 회원가입  2. 한줄일기쓰기 3. 한줄일기보기 4. 종료 : '))
        if n not in [1, 2, 3, 4]:
            print('다시 입력하세요')
            continue
        if n == 4:
            print('\t 종료합니다 \t')
            break

    except Exception as e:
        print(e)
        continue

    id = input('input ID : ')
    pw = input('input PW : ')
    user = User(id, pw)

    if n == 1:
        manage.join(user)
    if n == 2:
        manage.writeDiary(user)
    if n == 3:
        manage.viewDiary(user)
📋 수입과 지출을 기록하는 가계부

import time

path = "C:/Users/YUN/Python/"

💡클래스 AccountBook

class AccountBook:
    def __init__(self):
        self.deposit = 0
        self.type = ''
        self.balance = 0

    def doDeposit(self):
        money = int(input('입금액 입력 : '))
        self.type = input('입금 내역 입력 : ')
        print('입금완료!!!!')
        print(f'기존 잔액 : {self.balance}')
        self.balance += money
        print(f'입금 후 잔액 : {self.balance}')

        self.writeRecipt(0, money)

    def doWithdraw(self):
        money = int(input('출금액 입력 : '))
        self.type = input('출금 내역 입력 : ')
        if money < self.balance:
            print('출금완료!!!!')
            print(f'기존 잔액 : {self.balance}')
            self.balance -= money
            print(f'입금 후 잔액 : {self.balance}')

            self.writeRecipt(1, money)
        else:
            print('잔액이 부족합니다.')

    def writeRecipt(self, n, money):  # n==0 입금 n==1 출금
        lt = time.localtime()
        strf_time = time.strftime('%Y-%m-%d %I:%M:%S')
        if n == 0:
            recipt = f'{"-" * 30}\n{strf_time}\n[입금] {self.type} : {money}원\n[잔액] ' \
                     f'{self.balance}원\n{"-" * 30}\n'
            with open(path + 'accountBook.txt', 'a') as f:
                f.write(recipt)

        if n == 1:
            recipt = f'{"-" * 30}\n{strf_time}\n[출금] {self.type} : {money}원\n[잔액] ' \
                     f'{self.balance}원\n{"-" * 30}\n'
            with open(path + 'accountBook.txt', 'a') as f:
                f.write(recipt)

---------------------------------------------------

💡main

account = AccountBook()
while True:
    n = int(input('1. 입금 2. 출금 3. 종료 : '))
    if n == 1:
        account.doDeposit()
    elif n == 2:
        account.doWithdraw()
    elif n == 3:
        break
    else:
        print('다시 입력')
📋 사용자가 입력한 숫자의 약수를 텍스트 파일에 기록

 def divisor(num):
     divisors = []
     for i in range(1, num + 1):
         if num % i == 0:
             divisors.append(i)

     return divisors

---------------------------------------------------

💡main

 path = "C:/Users/YUN/Python/"

 n = int(input('0보다 큰 정수 입력 : '))
 if n > 0:
     with open(path + 'divisor.txt', 'a') as f:
         f.write(f'{n}의 약수 : {divisor(n)}\n')
         print('divisor write complete')
 else:
     print('0보가 큰 수를 입력하세요')

 with open(path + 'divisor.txt', 'r') as f:
     line = f.readline()
     while line != '':
         print(f'{line}')
         line = f.readline()
📋 사용자가 입력한 숫자의 소수를 텍스트 파일에 기록

def isPrime(num):
    primes = []
    for i in range(2, num):
        isFlag = True
        for j in range(2, i):
            if i % j == 0:
                isFlag = False
                break

        if isFlag:
            primes.append(i)
    return primes

---------------------------------------------------

💡main

path = "C:/Users/YUN/Python/"

n = int(input('0보다 큰 정수 입력 : '))
if n > 0:
    with open(path + 'primes.txt', 'a') as f:
        f.write(f'{n}까지의 소수 : {isPrime(n)}\n')
        print('prime write complete')
else:
    print('0보가 큰 수를 입력하세요')

with open(path + 'primes.txt', 'r') as f:
    line = f.readline()
    while line != '':
        print(f'{line}')
        line = f.readline()
📋 두 개의 수를 입력하면 공약수를 텍스트 파일에 작성
path = "C:/Users/YUN/Python/"

# 공약수
def commonDivisor(n1, n2):
    divisors = []
    for i in range(1, n2):
        if n1 % i == 0 and n2 % i == 0:
            divisors.append(i)
    return divisors


# 최대공약수
def maxCommonDivisor(n1, n2):
    max = 0
    for i in range(1, n2):
        if n1 % i == 0 and n2 % i == 0:
            if max < i:
                max = i
    return max

---------------------------------------------------

💡main

n1 = int(input('1보다 큰 정수 입력 : '))
n2 = int(input('1보다 큰 정수 입력 : '))

if n1 > 1 and n2 > 1:
    with open(path + 'common_divisor.txt', 'a') as f:
        f.write(f'{n1}{n2}의 최대공약수 : {maxCommonDivisor(n1, n2)}\n')
        print('common factor write complete')
else:
    print('1보다 큰 수를 입력하세요')

with open(path + 'common_divisor.txt', 'r') as f:
    line = f.readline()
    while line != '':
        print(f'{line}')
        line = f.readline()
📋 모든 배가 입항하는 날짜 구하기
# 첫 입항일은 2023년 1월 1일 오전 10시
# 과일 선박 : 3일 주기 / 생선 선박 : 4일 주기 / 야채 선박 : 5일 주기
from datetime import datetime, timedelta


def getCommonDateTerm(d1=3, d2=4, d3=5):
    minMultiple = 0
    for i in range(1, (d1 * d2 * d3) + 1):
        if i % d1 == 0 and i % d2 == 0 and i % d3 == 0:
            minMultiple = i

    return minMultiple

---------------------------------------------------

💡main

path = "C:/Users/YUN/Python/"
baseTime = datetime(2023, 1, 1, 10, 0, 0)
while True:
    with open(path + 'common_date.txt', 'a') as f:
        if baseTime.month == 1 and baseTime.day == 1:
            f.write(f'{baseTime.year}년 모든 선박 입항일\n')

        f.write(str(baseTime) + '\n')
        baseTime += timedelta(days=getCommonDateTerm())
        # 2024년이 되면 종료
        if baseTime.year == 2024:
            break

with open(path + 'common_date.txt', 'r') as f:
    line = f.readline()
    while line != '':
        print(f'{line}')
        line = f.readline()
        


📌소감


드디어 파이썬 중급 연습문제 풀이도 완료
후기_궁금증
파이썬의 리스트, 튜플, 딕셔너리의 차이 - 어떤 상황에서 각 개념들을 활용하는지 궁금증이 생겨 찾아봤다. 📑튜플, 리스트, 딕셔너리 비교에 잘 정리되어 있다.
클래스를 사용하지 않고 메소드만 이용하여 작성할때의 문제점 - 현재 연습문제 정도의 코드에서 큰 문제가 없지만 데이터 관리가 필요한 대규모 프로젝트 시 데이터 중복 문제와 휴먼 에러 발생 클래스와 메소드
datetime, time 라이브러리 - [Python] datetime 모듈
profile
개발하고싶은사람

0개의 댓글