csv_to_python_to_csv_practice 프로젝트 : practice_by_csv_module.py
나의 클래스 모듈 : employee.py
시작 엑셀(csv)데이터 : emplyee_list.csv
시작 문서 양식(form) : form.docx ( 제목0,1,2  / paragraph / circle , check)
-시작 문서 양식 내용포함(form) : form_save.docx
결과 엑셀(csv)데이터 : result.csv
결과 문서(docx)데이터 : result.docx

image_thumb2

  1. 엑셀형태로 구성하고 싶은 데이터가 있다고 가정하고,  칼럼들을 클래스의 필드로 만든다.
  2. 상수를 제외하고, 생성자로 정의하여 클래스( , , , )로 인스턴스생성과 동시에 입력받도록 해준다.
    *만약, 상수로 먼저 선언하고서, 인자로 받아도 되고, 안받아도 되도록 설정하려면,
    (1) 생성자의 인자로서 wage_per_hour = None으로 default로 둔다.
    (2) 기본적으로 self.wage_per_hour = wage_per_hour는 바로 입력하지 않고,
    (3) if wage_per_hour: 를 통해 default인 None이 아닌 값이 넘어와서 True를 가질 때,
         상수였던 필드(wage_per_hour = 7530) 에 self.wage_per_hour = wage_per_hour를 대입하도록 한다.
      image_thumb5_thumb_thumb

  3. 칼럼 중에 함수식이 필요한 것은, 클래스 내부의 함수로 정의하여 self.필드들을 이용해서 (return에다가) 계산식을 만든다.
    ex> 퇴근시간 - 출근시간 = 근무시간
  4. 만약, 함수식 계산을 한 칼럼에 또 함수식을 써야하는 경우에는
    클래스에 정의된 함수식을 또 호출하는 함수를 생성하면 된다. 필드와 마찬가지로 return에다가 self.함수()로 호출해서 계산식을 만든다.
    ex> 일당 = 근무시간(퇴근시간 - 출근시간) * 시급
  5. 클래스를 정의한 부분을 모듈화 시키기 위해
    (1) 새로운 파이썬 파일 : employee.py 를 만들고
    (2) 클래스 정의 코드를 잘라내서 붙혀넣는다.
    (3) 기존 파이썬 파일에서는 from employee(파이썬 파일) import Employee(클래스명)으로 가져온다.

    ------CSV 읽어들이는 코드-----


  6. 이제 인스턴스 인자로 들어갈 데이터들을 엑셀파일에서 받아오기 위해, CSV (쉼표로분리)로 프로젝트내에 다른이름 저장
  7. f = open('파일명.csv', 'r')를 통해 열고 / f.close()도 미리 같이 작성
    f.readlines()를 통해 각 row을 list로 받음 -> (리스트이므로) for문을 통해 개별 출력시켜본다.
    import csv 를 통해 모듈을 가져온다(아나콘다로 설치시 미리 깔려있음)
    lines = csv.reader(f)를 통해 csv의 모든 라인을 리스트로 받아온다( f.readlines()와 달리, 4개로 미리 쪼개어져있다)
  8. 첫 줄은 칼럼명row이므로, 2번째줄 부터 읽기 위해선, while문과 비슷하게
    i =0 작성 -> for안에서 읽어진 lines를 i > 0부터 콤마로쪼개는 작업 등등을 하도록 하고, for문 마지막에 i += 1를 달아준다.
  9. 각 리스트는 콤마(,)를 통해 4개의 요소가 붙어있으므로 .split(',')를 통해 다시 리스트로 쪼개어 받는다.
    4개로 쪼개진 요소를 담는 list를 for문을 돌면서 출력시켜본다.

    4개 요소를 담고 있는 리스트는 리스트[0], [1], [2], [3] 형태로 개별접근이 가능해진다.
  10. 이제 for문을 돌면서 4개의 요소를 입력받아 생성될 인스턴스들을 관리할 리스트를 for문전에 만든다.
    ex> employee_list = []    or   employee_list = list()
  11. for문을 돌면서, 인스턴스관리 리스트에 .append()안에 인스턴스를 생성하면서, 생성자4개를 입력해준다.
    ex> employee_list.append( 클래스( 필드[0], 필드[1], 필드[2], 필드[3]) )
    * 이 때, csv에서 받은 요소들은 모두 문자열로 가져온다. 정수 데이터인 출근시간, 퇴근시간, 시급int()로 감싸주어야 클래스에서 계산된다.
    ex> employee_list.append( 클래스( 필드[0], int( 필드[1]), int(필드[2]), int(필드[3]) ) )
  12. 인스턴스관리리스트를 확인해보기 위해
    (1) print(len())로 전체 길이를 살펴보고
    (2)  <리스트를 이용한 for문>을 통해, 세부적으로 인스턴스 안의 필드나 함수를 하나씩 확인하는데, 
    print()로 , {}\t{}\t .format( 인스턴스.필드1, 인스턴스.필드2,.., 인스턴스.함수1(), 인스턴스.함수2(),) 형식으로 한 줄로 출력해보자.

  13. csv파일쓰기위해, 위에서 인스턴스 필드/함수 세부 확인한 print문을 고치면 된다. print->write 수정시 줄바꿈을 항상기억 + 칼럼명row출력
    (1) for문 전에 open()  '파일명', 'w' 이 들어갔다. + 3번째 인자로서, newline=''을 넣어줘야, csv_writer.writerow([])후에 자동 줄바꿈이 x
    (2) for문 전에 csv_file.write( 칼럼명row \n')
        csv_writer = csv.write(f)를 통해 쓰기 변수를 생성해준다.
        첫줄(칼럼명)은 csv_writer.writerow( [ 배,열,형,태] ) 로 넣어준다. 줄바꿈은 안해줘도 자동으로 된다.
    (3) for문 안에 print-> csv_file.write csv_writer.writerow([ , , , ]) 로 고치고,  새로운 칼럼{} 만들어주고, \t 를 콤마(,)로 수정하고,    \n줄바꿈 해주기
    (4) for문 끝나면 close()


    ----- 문서화 하는 코드 -----



  14. 12강 자료를 이용해, docx형식의 양식 파일(form_save.docx)을 만든다. -> 편의성을 위해, 내용은 지운다(form.docx)
  15. [설정 > Project Interpreter ]에서 add를 통해 [python-docx]를 검색하여 모듈을 추가한다
  16. docx_practice.py를 참고하여
    • import / 양식파일을 포함한 Document객체 생성 / 제목을 넣는다
    • 제목1 수준으로 소제목을 만든 뒤, 
      본문 수준으로 리스트를 작성해보자.
      인스턴스관리 리스트를 이용한 for문으로 각 행의 정보(각 인스턴스.필드, 함수)를 뽑아내는데,
      .format을 활용하여 문장형식으로 작성해보자
  17. 제목2수준으로 하나 넣어준 뒤, table을 생성해보자
    • table객체는 document.add_table( rows=1, cols=6 )로 한 행씩 몇개의 정보가 들어가는지 더해가는 기준을 만든다.
    • table.style = ' ' 로 미리 문서양식에서 만든 사용자지정양식을 기입해 스타일을 지정한다
    • 첫 행for문 전에 미리 작성해준다. 첫 행table.rows[0].cells를 통해 첫 행들의 각 셀들리스트 변수로 받아준다.
      받은 첫 행의 각 셀들의 리스트변수[0], [1].text, .. 형식으로 접근하여 문자열형식칼럼명을 적어준다.
    • 2번째 행부터는 정보가 들어가므로, 인스턴스관리 리스트를 이용한 FOR문에서 table.add_row().cells 로 각 셀들을 변수로 받는다
      그리고 각 셀들을 리스트요소 접근방식으로 접근 하되, 마찬가지로 .text를 붙히고 str( 인스턴스.필드, 함수()) 형식으로 문자열만 오로지 대입한다.
      만약, 정수로 표현되야 한다면 str()안에 int()로 감싸준다
  18. 저장은 document.save('파일명')으로 한다.

+ Recent posts