본문 바로가기
수업자료

보안융합 수행평가 풀이 2021.04.07

by ^..^v 2021. 3. 31.
728x90
반응형

 

문제

도커 컨테이너에서 제공하는 CSV 파일을 읽어서 아래와 같은 형식의 출력을 만드는 파이썬 프로그램을 제작하시오.

 

도커 컨테이너 실행

PS C:\> docker container run -p 8080:80 -d myanjini/testweb:latest

 

CSV 파일 경로

http://localhost:8080/covid19.csv

 

출력 형식

 

평가기준

1) 프로그램 실행 여부

2) 프로그램 완성도

- 지역별 합계 정보 제시 및 정확성

- 확진자 합계의 최대값, 최소값 계산 및 해당 지역 제시

- 숫자 데이터 천단위 콤마 표시

- 통계치가 없는 경우 CSV 파일에 있는 “-” 기호를 그대로 출력 (예: 세종, 제주 1월)

 

 

 

 

예시답안코드

import csv, re 
import urllib.request
import unicodedata
from io import StringIO

def fill_str_with_space(input_str='', max_size=10, fill_char=' '):
    l = 0 
    for c in input_str:
        if unicodedata.east_asian_width(c) in ['F', 'W']:
            l += 2
        else: 
            l += 1
    return fill_char*(max_size-l) + input_str

def get_format_str(s: str) -> str: 
    try: 
        s = '{:>,}'.format(int(s))
    except: 
        s = '{:>}'.format(s)
    return fill_str_with_space(s)

def print_label(datas: list) -> None:     
    for item in datas[1:]:
        print('{}'.format(get_format_str(item)), end='')
    print()

def print_data(datas: list) -> None: 
    for item in datas[1:]:
        print('{}'.format(get_format_str(item)), end='')
    print()
    
def get_sum(datas: list) -> int: 
    sum = 0
    for item in datas: 
        if item.isnumeric():
            sum = sum + int(item)
    return sum
    
def print_summary(area: list, total: list) -> None: 
    value = max(total) 
    label = area[total.index(value)] 
    print("{0}에서 {1:,}명으로 확진자가 가장 많이 발생했으며,".format(label, value)) 
    value = min(total) 
    label = area[total.index(value)] 
    print("{0}에서 {1:,}명으로 확진자가 가장 적게 발생했습니다.".format(label, value)) 

def line_to_list(line: str) -> list:
    lists = []
    datas = line.decode('utf-8').split(',')
    for data in datas:
        data = data.replace(',','')
        data = data.strip()
        lists.append(data)
    return lists

def print_covid19_data() -> None: 
    area = [] 
    total = [] 
    with urllib.request.urlopen("http://localhost:8080/covid19.csv") as webpage: 
        for line in webpage: 
            line = line_to_list(line)
            if line[0] == '구분': 
                line.append('합계')
                print_label(line) 
            else: 
                sum = get_sum(line) 
                line.append(sum)
                print_data(line) 
    
                area.append(line[1]) 
                total.append(sum) 
    
    print_summary(area, total) 
                
if __name__ == "__main__": 
    print_covid19_data()
728x90
반응형

댓글