10. 다수의 인스턴스 생성을 위한 엑셀에 인자 입력-> csv로 저장 -> 파일읽기-> 인스턴스 생성 -> 파일 쓰기
2018. 7. 4. 22:41
기존에 만들었던 엑셀형태의 데이터를 -> 클래스를 통해 인스턴스로 칼럼들을 채우도록하고 -> 리스트로 관리하기를 다시 반복해보자.
그런데 인스턴스를 계속 파이참에서 하나씩 생성하기는 좀 그렇다.
엑셀을 사용해서 생성해보자.
- 엑셀에서, 칼럼명 없이, 생성자 순( name, work_start, work_finish, wage_per_hour)으로 작성하자.
- 다음으로, 저장을 할 때, 파이참프로젝트 폴더내 csv(쉼표로분리)로 저장하자.
*csv utf-8(쉼표로 분리)는 아니다.
파이참이 utf-8을 선호를 하지만, csv에서 만큼은 한글관련해서 깨져버리는 것을 확인했었다. - 이제 파이참 프로젝트 내에 생성된 csv파일을 읽어보자.
- 이전에는 파일쓰기를 해서 -> open('파일명', 'w') 였지만, 이번에는 파일읽기 이므로, open('파일명', 'r') 이다.
- 까먹을 수 있으니, f = open()작성과 함께 밑에는 f.close()도 미리 작성해주자.
- 잘은 모르겠지만, 파일을 여는 f라는 변수의 타입을 확인해보자. 어떠한 클래스의 하나이며, 그래서 f.write함수도 쓸 수 있었다. - csv파일을 쓸 때에 f.write()가 있었다면,
csv파일을 읽을 때는 f.readlines()를 이용한다. 문자열의 .join('')처럼, csv을 모두 읽어들인 다음, list를 반환한다.
- 읽어들인 list를 len()으로 길이를 확인해보면, 엑셀에서 작성한 row수과 같다. - open 'r' -> readlines -> lines변수에 읽어들인 리스트들을 for문을 이용하여 하나씩 불러내서 확인해보자
각 리스트안에는 인스턴스 생성할 때 필요한 인자들이 콤마를 통해 붙어있다.
우리는 콤마로 구분된 놈들을 4개로 다시 나누어서, 인스턴스생성시 인자로
들어가도록 해야한다
- 먼저, for문을 들어가기 전에 인스턴스를 관리할 빈 리스트를 생성해 놓는다.
- for문 안에서는, line.split(',')를 이용해 콤마를 기준으로 각 라인을 4개로 쪼갠 뒤, info라는 리스트변수에 담아놓고, print로 확인해보았다.
- 제대로 각 line들이 4개로 쪼개어진 것을 확인했다면,
info라는 리스트의 각 요소를 [0], [1], [2], [3]으로서 접근하여 인스턴스를 생성과 동시에 append해준다. - 그런데, 첫번째 인스턴스인 employ_list[0].worked_hours를 print해보면 에러가 난다.
- 대입은 되긴 되나,, 사실 name을 제외하면 다 정수이다.
- 파일을 읽었을 때는, 모두 str로 인식되기 때문이다. ( csv의 15 -> 파이참 1과 5가 붙어있는 문자열로 인식)
그렇기 때문에, 함수안의 계산식 str- str 의 에러가 나는 것이다.
- for문 속에서, name인자 위치의 info[0]을 제외하고 전부 int( )함수로 감싸주어, 정수로 만들어주자. - 확인을 위해 인스턴스 리스트(employee_list)를 출력시켜보자.
(1) 전체적으로는 len()함수로 길이를 확인한다.
(2) 세부적으로는 for문을 돌면서, 각 인스턴스의 필드들을, print( , , , )로 한번에 확인한다.
인스턴스들의 인자들을 받아들이기 위해서,
첫 줄 부터 데이터를 입력하여 칼럼명row가 매우 아쉽다.
- 만약 첫줄에 칼럼명을 입력하고 실행한다면 에러가 난다.
- 에러라인으로 가보면, 출근시간 인자에 int( '숫자' ) 가 아닌 int( '출근시간' ) 으로서, 문자열을 정수로 바꿔버렸기 때문
엑셀(csv)의 2번 째 줄 부터 읽는 방법은?
- while문 처럼, for문 전에, i = 0이라는 변수를 들어오기 전에 미리 생성하고,
- for문 안에서는, if i > 0 일때만, 쪼개어서, 인스턴스 생성하는 작업을 하도록 하고
if문 끝나는 곳에서 i += 1 을 넣어준다.
클래스의 인스턴스를 이용해 생성된 엑셀 형태의 데이터에
파일쓰기를 통해 근무시간과 일당 칼럼을 더해서 csv로 배출해보자.
- 인스턴스 리스트(employee_list)를 세부적으로 확인하기 위해 for문안에서 각 인스턴스의 필드를 print(, , , )했던 것을
--> 그대로 파일쓰기에 활용한다.
*앞에 빠진 시급도 채워넣었다. - print-> f.write로 고칠 때는 csv파일이므로 '문, 자, 열'을 콤마로 나눠야하므로 '{}, {}, {}'.format( , , )의 형태가 필요하다
이제 employee_list.csv 로 읽고 - > 파이썬에서 데이터를 추가처리( 근무시간 , 일당 계산) -> employee_result.csv 파일로 쓰기 과정을 가진다.
즉, 읽는 파일을 수정하면 쓰는 파일도 변경된다.
노동법에 의해 4시간마다 30분 break_time 가지는 것을 고려한
근무시간 계산 함수를 수정해보자.
'빅데이터 관련 프로그래밍 > Python3 기초 및 업무자동화' 카테고리의 다른 글
11. 파이썬 CSV모듈 (읽기, 쓰기) + 클래스 분할하기) (0) | 2018.07.05 |
---|---|
참고 : 엑셀의 CSV파일을 읽고->클래스를 활용하여 함수까지계산 -> CSV파일로 쓰기 (0) | 2018.07.05 |
9. 문자열 클래스의 함수(split과 join / replace / upper와 lower / startswith와 endswith) (0) | 2018.07.04 |
참고 : 클래스를 이용하여 데이터 입력하고 쓰기 (0) | 2018.07.04 |
8. 클래스(class)와 인스턴스(instance) 및 생성자 (0) | 2018.07.04 |