프로젝트

[프로젝트] 전역일 계산기 진행 상황 Part 1

골슼 2022. 8. 13. 18:50

https://culgg2mm.tistory.com/m/5
이 피드를 올리고나서 다시 돌아온~ GG2Mm입니다!
저번주에 전역일 계산기를 만들어보게다는 계획을 올리고도 한 주가 지났네요.
아무래도 처음으로 진행하는 저만의 소심한 프로젝트이기도 해서 시작을 하는데 주저하기도 했었고, 백준 문제를 푸느라 프로젝트에는 많은 집중을 기울이지 못했어요.
그러다 오늘 잠깐 틈이 나서 이렇게 조금 만들어 봤어요!

전역일 계산기의 용도, 사용 목적

전역일 계산기는 말 그대로, 현재 병사가 모은 휴가 일 수를 토대로 전역 전 휴가를 출발할 수 있는 날을 알려주는 프로그램입니다!
군인이라면 다들 공감하겠지만, 언제 집을 갈 것인가는 굉장히 중요한 이슈에요.
그래서 저는 이 프로그램을 제 친구들, 동기들, 선임들 모두가 이용할 수 있는 간편한 프로그램으로 만들어 배포하거나, 하나의 컴퓨터에 각자가 자신의 기록을 기록할 수 있는 브릿지 역할을 하게 만들고 싶었어요.

포함 된 요소들

그래서 사용자의 입장을 생각하다 보니 기존에 생각했던 것보다 신경 쓸 부분이 많았고, 그래서 이번에는 '사용자 개인의 파일을 만들기/ 읽기' 기능만 만들었는데에도 불구하고 많은 시간이 걸렸어요.

너 파일이 있니?
각 개인의 정보를 담아야 하기 때문에 다른 사람의 파일을 쓰면 안될거에요.
그래서 프로그램은 '너꺼 파일 있니?' 물어보며 응답에 따라 각기 다른 요소를 실행합니다.

y_or_n = input("Do you have your own file?(Y/N) : ")
import os

그리고 텍스트 파일 저장 디렉토리 저장 등을 고려해 os 모듈을 import 해줬어요.

뇨 저 파일 없어요
만약 파일이 없다면, 프로그램의 입장에서는 굉장히 간단해져요.
그저 유저의 파일 생성을 도와주면 됩니다.
이때 주의해야 할 것은, 프로그램이 저장될 저장 위치를 소스코드 내의 save_path에 잘 입력해줘야 한다는 겁니다.
저는 이 프로그램을 이용해 만든 파일을 모두 /home/ 디렉토리에 저장한다고 생각하고 파일을 작성했어요.

if y_or_n == 'N': #User have any of its own file, so need to make one
    save_path = "/home/" #Directory you wanna save your file
    title_file = input("Enter your file's title : ")
    real_name = os.path.join(save_path, title_file+".txt") #Name include path and format of file
    file_edit = open(real_name, 'w')
    print('Now you can access to your own file!')


저 파일 이미 만들었어요!
파일이 있다고 응답한다면, 당연히 그냥 파일 이름을 대라고 하면 되는데요. 사실 자기 파일 이름 하나 하나 외우고 있는 사람 많지 않잖아요.
그래서 이미 생성된 파일의 이름을 모두 보여줄 수 있도록 해요!
이 기능을 위해서, 텍스트 파일을 생성할 때 모두 같은 디렉토리에 저장되도록 한거에요.
이제 디렉토리에 있는 텍스트 파일 이름과 해당 파일의 번호를 보여주고, 이 번호를 입력해서 자신이 원하는 파일에 접근하도록 했어요.
원하는 파일에 접근하면 그 이후에는 파일 내용을 읽어줘서 해당 파일에 추가할 내용이 있는지 확인할 수 있게 만들었어요.
보시죠!

elif y_or_n == 'Y': #User have its on file
    
    file_names = os.listdir()
    txt_file = []
    for i in file_names: #Extract txt file
        if os.path.splitext(i)[1] == '.txt':
            txt_file.append(os.path.splitext(i)[0])
    
    print('[File List]')
    for j in range(len(txt_file)): #Show file list
        print(f'{j+1:2} {txt_file[j]}')
    file_number = input('Input your file number : ')
    
    if not file_number.isnumeric(): #Remove exceptional Case 
        print('Don\'t play with me')
        quit()
    elif int(file_number) > len(txt_file):
        print('Don\'t play with me')
        quit()
    else:
        save_path = "/home/" #Directory where your file is saved
        title_file = txt_file[int(file_number) - 1]
        real_name = os.path.join(save_path, title_file+'.txt')
        
        file_read = open(real_name, 'r') #Show users what the files are written
        print('You can check your file contents')
        while True:
            line = file_read.readline()
            if not line:
                break
            print(line)
        file_read.close()


조금, 디렉토리에 접근해서 파일 이름들을 뽑아오는 listdir()메서드 같은 것만 제외하면 굉장히 직관적이죠?

!@#~
사용자 입장을 생각하다보니 신경 써야할게 많더라고요.
만약 초기 Y또는 N을 입력하라는 지시문을 사용자가 이해하지 못하고, 혹은 대문자가 아닌 소문자 값을 넣어준다면 제대로 사용자에게 설명을 해주어야 하기에 마지막에 이런 명령문을 넣어줍니다.

else: #Only Y and N can be read
	print('Enter Y or N')
	quit()
					

정말 간단하쥬?

마무리

이렇게 오늘은 사용자가 파일에 접근하는 1차적인 과정만 설계해보았어요. 후... 만만치가 않네요.
그럼 이어지는 내용은 다음에 더 포스팅하도록 할게요!
안녕!