본문 바로가기

공부/16산학프로젝트

[16산학프로젝트/Python]엑셀파일의 특정 행을 csv파일에 저장하기

엑셀 파일(.xlsx)에 고객들의 질문('QUESTION')과 그 질문의 주제('TOPIC'), 그에대한 답변('ANSWER')등이 담겨있다.

여기서 나는 고객들의 질문과 그 질문의 주제만 가져와서

csv파일에 나란히 2개의 행으로 저장하려고 한다.


우선 엑셀파일의 데이터를 처리할 수 있는 모듈인 xlrd를 import한다.





질문들의 주제('TOPIC')를 리스트에 저장했다.

여기서 나는 고객들의 질문('QUESTION') 또한 리스트에 저장하여

이 리스트들을 csv파일에  한 줄 씩 담고 싶은 것이다.




<예시>







그래서 코드를 짜보았다(급 전개)



에러 발생!


뭔고하니... 인코딩 에러다


\U0001f31f


뭐지?


바로...


🌟

요놈이었다. 대체 누가 상담 글에 저런 이모티콘을 쓰는거냐곸ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

아니지... 그럴 수도 있지


그러면 해결책을 생각해보자!


1. 이모티콘을 인코딩할 수 있는 인자값이나 다른 메소드들이 있지 않을까?


2. 정규식을 사용해서 우리가 받아들일 특수기호들 말고는 없애버릴까?










2. 정규식을 사용해서 우리가 받아들일 특수기호들 말고는 없애버리기


: 정규식을 다루는데 사용되는 re 모듈의 sub메소드를 사용해서 내가 미리 정한 문자(pattern)외에는 지워버려보자



line 21에서 볼 수 있듯이, pattern이라는 변수에 내가 읽어들이고 싶지않은('^'표시에 주의) 문자들만 저장을 하고,


line 28에서 sub메소드의 인자로 pattern변수를 대입한다.


sub(pattern, repl, string)메소드는 stirng에서 pattern과 일치하는 부분에 대하여 repl로 교체하여 결과 문자열을 반환한다.



<참고> (출처 : http://devanix.tistory.com/296)

[ re모듈의 주요 메소드 ]

[메소드]

[설명]

compile(pattern[, flags])

pattern을 컴파일하여 정규식 객체를 반환

match(pattern, string[,flags])

string의 시작부분부터 pattern이 존재하는지 검사하여

MatchObject 인스턴스를 반환

search(pattern, string[,flags])

string의 전체에 대해서 pattern이 존재하는지 검사하여

MatchObject 인스턴스를 반환

split(pattern, string[, maxplit=0])

pattern을 구분자로 string을 분리하여 리스트로 반환

findall(pattern, string[, flags])

string에서 pattern을 만족하는 문자열을 리스트로 반환

finditer(pattern, string[, flags])

string에서 pattern을 만족하는 문자열을 반복자로 반환

sub(pattern, repl, string[, count=0])

string에서 pattern과 일치하는 부분에 대하여

repl로 교체하여 결과 문자열을 반환

subn(pattern, repl, string[, count=0])

sub와 동일하나, 결과로(결과문자열, 매칭횟수)를

튜플로 반환

escape(string)

영문자 숫자가 아닌 문자들을 백슬래쉬 처리해서 리턴.

(임의의 문자열을 정규식 패턴으로 사용할 경우 유용)





최종 코드