brunch

You can make anything
by writing

- C.S.Lewis -

by 반병현 Dec 26. 2018

수 천 개의 텍스트 파일을 1초 안에 합쳐 보자 (2)

반복문, 텍스트 입출력

  이 글은 이전 강좌에서 못다 한 과제를 마저 수행하기 위한 강좌입니다. 이전 강좌를 읽고 오시는 것을 추천합니다.


https://brunch.co.kr/@needleworm/35



  자, 이제 personal_info 폴더 안에는 2천 개의 가짜 개인정보가 저장되어 있을 것이다. 한번 이 파일들을 각각 열어 보라. 이렇게 많은 정보들을 하나로 합치는 작업은 절대 수월하지는 않을 것이다. 과연 이 작업에 얼마나 오랜 시간이 걸릴까?


textmerge 폴더에서 git bash를 실행한다

  textmerge 폴더에서 마우스 우클릭을 하고, git bash here을 눌러 주자. 그리고 아래 명령어를 입력한다.


  python main.py


  엔터키를 누르는 바로 그 순간 작업이 끝난다.


결과물

  끝이다. 2000건의 개인정보는 이미 합쳐져 있다.


  이렇게 금방 끝날 일인데 수작업으로 하나하나 합쳐 오라는 업무지시를 내리는 직장이 현실세계에 분명 존재할 것이다. 이 따위 일에 인력을 낭비하다니. 인건비가 소중한 줄 모르는 직장이다. 이런 업무는 파이썬에게 하청을 줘 버리고, 끙끙 앓으면서 몇 주 동안 일하는 척 하자. 그리고 그동안 다른 역량을 쌓아 이직을 준비하자.



  이번에는 코드가 엄청 짧으니 작동원리를 한 번은 보고 들어가자. main.py를 더블클릭해서 코드를 불러오자.


1~6번 줄

  지난번과 마찬가지로 1~4번 줄은 이 코드에 대한 설명을 기재했다. 작성자의 이름과 최근 수정일이 기재되어 있다.


  6번 줄에서는 os  모듈을 import 하고 있다. 이번 코드에서는 os모듈이 내장하고 있는 listdir()이라는 함수를 사용할 것이다.


8~9번 줄

  8번 줄에서는 하나로 합칠 파일들이 들어있는 폴더 이름을 적어주고 있다. 우리는 personal_info라는 폴더 안에 들어있는 내용물을 하나로 합칠 것이므로 'personal_info'를 적어준다. 맨 끝에 있는 슬래시(/)는 경로를 표시하는 약속이다. A라는 폴더 안의 B라는 파일을 우리는 A/B라고 표현한다. 인터넷 주소창에서도 슬래시(/)를 볼 수 있다. 더 상세한 것은 '파일 경로 표기 방법'이라고 구글에 검색해 보자.


  9번 줄에서는 outfile의 이름을 적어주고 있다. 하나로 합쳐진 파일을 저장할 때, 저장될 파일의 이름을 적는 것이다. 우리는 여기서 결과물을 "merged_personal_info.txt"라는 이름의 텍스트 파일로 저장할 것이다.


11~13번 줄

  11번 줄에서는 open 함수를 이용해, outfile_name이라는 이름을 가진 파일을 쓰기 모드로 열었다. 지난번 강좌에서도 사용했던 것이므로 설명은 생략하겠다. 궁금하신 분들은 '파이썬 파일 입출력'이라고 구글에 검색하기 바란다.


  13번 줄에서는 os모듈의 listdir()이라는 함수를 호출했다. os.listdir()은 폴더 내에 있는 파일 이름을 알려주는 함수다. 업무 자동화의 핵심이 되는 녀석이다. 조금 더 상세히 설명해 주도록 하겠다.

    아래 과정을 따라 파이썬을 실행하자.


  (1) 시작 + r
  (2) cmd 입력 후 엔터

  (3) python 입력

  (4) 아래 명령어 입력

     import os

     os.listdir()

  

os.listdir()의 실행 결과

  위 그림과 같이 폴더 내에 있는 모든 파일들과 폴더의 이름이 리스트 형태로 리턴된다. 리스트가 무엇인지는 구글에 '파이썬 리스트'라고 검색해서 알아보도록 하자.


  다시 코드의 11번 줄로 돌아가자. 11번 줄에서는 os.listdir(directory) 명령어를 실행한다. 이러면 아래와 같은 과정이 실시된다.


  (1) directory라는 위치로 찾아가서 (directory라는 폴더를 열고)

  (2) 내용물을 스캔해서

  (3) 리스트 형태로 리턴한다.


  그러니 위 코드에서는 "personal_info/"라는 폴더를 찾아가서 그 내용물을 하나하나 스캔해서 파일 이름을 몽땅 모아서 리턴해 주는 것이다. 우리 예제에서는 가짜 개인정보 파일들의 이름을 하나하나 불러와 저장해 둘 것이다. 이렇게 불러온 리스트는 files라는 이름으로 메모리에 저장해 둔다.


  이래서 os.listdir()은 자동화에 있어서 가장 중요한 함수 중 하나다. 여러 파일을 불러와야 할 때는 물론이고, 자동으로 파일을 저장하는 과제에서 과연 파일 저장이 제대로 이루어지고 있는지를 검증하는 용도로 사용할 수 있다. 이런 중요한 함수는 당연히 따로 검색해 보실 것이라 믿어 의심치 않는다.


15 ~ 23번 줄

  15번 줄에서는 for 문이 등장한다. for 문의 용도와 사용법 정도는 당연히 따로 검색해 보셨으리라 믿는다. 자세한 것은 구글에 "파이썬 반복문"이라 검색해 보자. 15번 줄에서는 files의 내용물을 앞에서부터 하나씩 불러와 filename이라는 이름을 붙이고, 순서가 진행되며 files의 마지막 내용물까지 작업에 동원되면 반복을 종료한다. 여기서는 os.listdir()로 불러왔던 파일 이름을 하나씩 하나씩 가져와서 filename이라는 이름으로 불러왔다.


  16번 줄에서는 filename을 검증한다. filename에 '.txt'라는 문자가 포함되어 있는지를 체크하는 것이다. 우리가 실수로 섞어 둔 다른 파일이나, 시스템에서 생성한 보이지 않는 이상한 파일들이 섞여 들어오는 문제를 미연에 방지하는 것이다. 이렇게 작업을 수행하는 과정에서 문제가 일어날 여지를 미리 차단하는 습관을 들이는 것이 중요하다. 상세한 것은 '파이썬 조건문'을 검색해 보자.


  17번 줄에서는 continue라는 문법이 등장한다. 이는 지금 당장 하던 것을 중단하고 반복문의 다음 루프를 실행하라는 명령이다. 자세한 것은 "파이썬 continue"를 검색하자.


  18번 줄에서는 directory 안에 있는 filename이라는 파일을 불러온다. 즉 personal_info/라는 디렉터리 내부의 filename이라는 파일을 실행해 file이라는 이름의 변수로 만든다. 11번 줄이나 지난 강좌에서 사용한 open과의 차이점은 'w'라는 문자가 없다는 점이다. 자세한 것은 이미 "파이썬 파일 입출력"을 검색하면서 읽어봤을 것이라 믿는다.


  19번 줄에서는 for문을 이용해 file을 위에서부터 한 줄씩 불러온다. 역시 "파이썬 파일 입출력"을 검색해 보고 왔을 것이므로 상세한 설명은 생략한다.


  20번 줄에서는 out_file에 write() 함수를 이용해서 line을 입력한다. 즉, 불러온 파일을 한 줄씩 out_file에 옮겨 적는 과정이라고 생각하면 된다. 사람이 일일이 정보를 옮겨 적는 과정이 여기서 자동으로 굴러가고 있는 것이다.


  21번 줄에서는 서로 다른 사람의 개인정보를 구분하기 위해 공백을 두 줄 삽입해 줬다. '\n'은 '한 줄을 띄워 쓴다'는 의미다. 파이썬에서 "\n"을 삽입하는 것은 워드에서 엔터키를 치는 것과 같다.


  22번 줄에서는 불러온 file을 닫는다.


  23번 줄에서는 out_file을 닫는다. 작성이 끝났으므로 닫으면서 저장된다.


  위 코드는 비교적 복잡해 보이지만 아래 작업을 자동으로 수행한 것에 지나지 않는다.


  (1) personal_info에 어떤 파일들이 있는지 확인하고

  (2) out_file을 하나 만든 다음

  (3) personal_info에 있는 파일을 하나씩 불러와

  (4) 내용물을 한 줄씩 out_file에 베껴 적는다.

  (5) 모든 파일에 대해서 위 작업을 마쳤으면 out_file도 종료해 준다.


  사람이 수작업으로 했다면 아래와 같았을 것이다.

  (1) personal_info 폴더를 열고

  (2) 합쳐진 데이터를 저장할 파일을 하나 만든 다음

  (3) personal_info에 있는 파일을 하나씩 실행해서

  (4) 내용물을 out_file에 베껴 적는다.

  (5) 모든 파일에 대해서 위 작업이 끝나면 out_file을 저장한다.


  어떤가. 사람이 직접 하는 일을 같은 순서로, 파이썬을 이용해 컴퓨터에게 하청을 준 것이다. 어쩌면 한 달 이상 걸렸을 노가다를 끝내는 데에는 23줄의 코드면 충분하다. 파이썬 책을 사서 독학한다면 맨 앞에서부터 챕터 3~4개만 읽으면 충분히 만들 수 있는 수준이다. 하루 한두 시간씩 일주일 공부하면 될까?


  이런데도 파이썬을 안 배우고, 단순 반복 작업을 지시하는 직장에 몇 주 동안 고생하고 싶은 생각이 드는가? 파이썬과 함께 마음의 평안을 얻어 우리 모두 해탈의 길로 나아가자.


  


  

합쳐진 파일

  personal_info 폴더 내에 다른 텍스트 파일을 넣어 둔다면 그 파일들도 하나로 합칠 수 있다. 다른 폴더 안의 내용물을 합치고 싶다면 코드 8번 줄의 directory를 수정해서 코드를 돌려 보자.



  그런데 합쳐진 파일이 모양새가 영 마음에 들지 않을 수 있다. 저걸 엑셀로 정리하면 예쁠 텐데. 자동으로 합치면서 엑셀 파일로 만들어 주는 방법은 없을까? 파이썬은 못 하는 게 없으니 당연히 가능할 것이다.


  다음 시간에는 단순히 파일을 합치는 것이 아니라, 텍스트 파일을 합치면서 양식이 갖춰진 엑셀 파일로 변환하여 저장하는 방법까지 다루어 보도록 하겠다.


  앞으로는 독자 여러분들이 반복문과 조건문은 당연히 할 줄 안다고 가정하고 진도를 나갈 것이다.



  이번 화는 겉멋을 부리지 않았다. 왜냐하면 겉멋을 부릴 필요가 없기 때문이다. 여러분은 엔터키를 한 번 누르는 것으로 수 천 개의 파일을 한 번에 합칠 수 있는 능력을 가지게 되었다. 상황에 따라 몇 달 동안 작업해야 할 일을 1초 만에 끝낼 수도 있는 초능력자가 된 것이다.


  이 자체가 멋있는 일인데 굳이 겉멋을 부릴 필요가 있겠는가!




반병현 소속상상텃밭 직업개발자
구독자 2,185
매거진의 이전글 수 천 개의 텍스트 파일을 1초 안에 합쳐 보자 (1)

매거진 선택

키워드 선택 0 / 3 0
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari