ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [파이썬 자동화] 수 천 개 텍스트 파일을 엑셀로 합치기
    파이썬 자동화 리뷰 2020. 3. 20. 08:00
    반응형

    https://brunch.co.kr/@needleworm/40#comment



    지난 글

    [파이썬 자동화 리뷰] - [파이썬 자동화] 랜덤 자료 만들기

    [파이썬 자동화 리뷰] - [파이썬 자동화] 수 천 개의 텍스트 파일 하나로 합치기







    기존에 합친 파일은 텍스트 파일로 저장된다. 이 텍스트 파일을 main.py에서 

    .txt를 .csv로 변경하고 다시 한 번 main.py를 실행해주면




    엑셀로 실행 시킬 수 있는 csv 파일이 만들어진다. 

    하지만 위에서 볼 수 있듯이 보기 편하게 셀에 하나씩 들어있지 않고 완전 난장판이다. 

    그래서 더 보기 편하게 만들기 위해 새로운 알고리즘이 필요하다.













    위 부분은 이전 글에서 이미 다룬 내용이므로 넘어가도 무방하다.




    이제 어떻게 알고리즘을 구성해야 할 지 생각해야 한다.

    엑셀은 A열 B열 C열.. 이 콤마(,)로 연결된다.

    1행 2행 3행은 한 줄을 띄어주면(\n) 된다.



    즉, 우리의 목표는 이렇게 만들어야 한다는 것이다.

    공통된 name, age, e-mail 등은 A열 B열 C열로 들어가도록 맨 위에 콤마로 연결해주고

    그 다음 행부턴 한 줄을 띄어서 콤마로 연결해준다.


    자 이제 이걸 어떻게 이렇게 만드느냐가 문제다.




    위 글의 저자의 방법은 이렇다.


    ① 개인 정보를 한 줄씩 불러서 (이것을 line 이라고 한다.)


    ② 텍스트파일에 있던 내용에서 ':' 을 기준으로 앞 부분은 중복이 되고 뒷 부분만 달라지므로 ':' 을 기준으로 앞과 뒤를 나눠 준다. -> split 이용


    ③ 앞 부분은 처음에만 써주고(헤더역할 수행), 뒷 부분은 사람이 바뀌면 엔터키를 눌러주는 식으로 데이터를 정리해준다.


    ④위 과정을 반복해서 수행하고, 이 과정을 마치면 파일을 닫는다.







    일단 헤더 자료들을 넣을 텅 빈 리스트를 만들어준다.

    그 다음, 나중에 반복문에 들어갈 outfile를 헤더가 있냐 없냐로 반복문을 계속 수행할지 말지 결정하기 때문에 일단 지금은 이해하기 어렵다. 그런갑다 하고 일단 넘어가자.






    18번 줄

    files 에 있는 파일 목록들을 불러와서 -> filename 으로 변수 처리 한 다음 반복문을 시행한다.


    19~20번 줄

    filename 에 있는 파일 목록들 중에서 .txt 가 아닌 것들은 건너뛴다.


    21번 줄

    filename 에 있는 파일들을 열어서 file 이라는 변수로 초기화를 시켜주고


    22번 줄

    ':' 뒷 내용을 넣을 또 다른 텅 빈 리스트를 만들어준다.


    23~28번 줄


    file을 한 줄씩 차례대로 불러와서 조건문을 실행해준다.

    만약 그 한 줄에 ':'있으면

    ':'을 중심으로 앞,뒤로 나눠줘!


    *strip : 공백과 같은 필요 없는 것을 없애주는 것

    *append : 이걸 contents (append 앞에 있는 것) 에 추가시킨다.


    즉, ':'을 중심으로 뒤에 있는 것을 contents에 추가시키는 것.


    그 다음은 ':' 앞에 있는 내용을 헤더에 추가시킬 차례다.

    그러기 위해선 조건문이 필요한데, 이 때 contents와 헤더의 길이를 비교한다.

    헤더는 아직 내용이 추가되지 않았기 때문에 당연히 길이는 0 이며, contents는 앞에서

    내용이 추가됐기 때문에 조건문은 반드시 참이된다.

    따라서 당연히 조건문을 지나 28번 줄에 가면 헤더에 나머지(':' 앞에 있는 내용)가 추가된다.



    30~33번 줄


    위 내용을 반복하고 나면 다음은 헤더의 내용에 콤마를 추가해 분류해줄 차례다.


    * .join() : 괄호 안에 있는 내용들 사이 사이에 점(.) 앞에 있는 내용을 넣어준다.


    위에서 헤더들(headers)에 ':' 앞에 있는 내용을 추가하면 이제 각 헤더들 사이에 콤마를 넣어줘서

    엑셀에 있는 A열 B열 C열로 지정을 해줘야 한다.


    그 다음(32번 줄) out_file(엑셀파일)에 그 헤더(header)를 써주고

    outfile_has_header를 False -> True 로 바꿔준다.


    위에서 '반복문에 들어갈 outfile를 헤더가 있냐 없냐로 반복문을 계속 수행할지 말지 결정한다'는 

    내용이 바로 여기다.


    이미 outfile_has_header를 False 로 지정해줬기 때문에 30번 줄을 실행하는데는 문제가 없다.

    30번 줄부터 32 번 줄까지 실행하고 나면 더 이상 반복하지 않기 위해 False -> True 로 바꿔준다.

    바뀌고 나면 반복문은 더 이상 수행되지 않는다.


    35~36번 줄

    헤더에 콤마를 넣어줬으니 이제 contents에 콤마를 넣어줄 차례다.

    콤마를 넣어준 다음 엔터(\n)를 추가해서 작성해준다.


    38~39번 줄

    반복문이 끝나면 file을 닫고

    out_file(엑셀파일)을 닫는다.




    300x250

    댓글

Learner Runner. 배운 것을 공유하고 생각을 나누는 블로그입니다.