본문 바로가기

NLP & Python

[Python] 파일 읽기


이론적으로 먼저 들어간 후 개발을 하고 싶었다..... 


 하지만 기초가 잘 써져있다고 인터넷에서 추천하는 사이트들(하기 사이트)조차 공부할 수 있는 적성이라고는 정말 0.1 도 되지 않은게 아닐까란 생각이 들정도로 볼때마다 분노폭발 (ㄴㅁ아ㅓㄻㄴ어래ㅑㄷ즐) 상태로 접하기 시작했다.


1) http://cs.kangwon.ac.kr/~leeck/NLP/ 

2) http://www.korean.go.kr/nkview/nklife/2017_4/27_0404.pdf



걍 언어로 접근하자...!!


라는 판단이 들었고, 접근방법을 바꿨다.



 텍스트 마이닝 혹은 자연어 처리쪽은 대체 언어를 뭐부터 사용해야할까 고민이 있었다. 


Python이냐, Java냐.... 그것이 문제로다.


Web 쪽으로 경력이 시작하다보니 Java 가 친숙하다보니 Python 으로 굳이 시작해야할 이유가 없다고도 느껴졌지만 검색했을때 참고될 자료 및 각종 라이브러리가 눈에 선하자, 잠시 머리 속의 Java 스위치를 꺼두어야 하나..... 싶기도 했다.


 물론 Deeplearning4j (https://deeplearning4j.org/) 도 있고, 어찌어찌 자바로도 할수 있지 않을까 판단은 들었지만, '이걸 또 뭐 고민해' 라는 생각이 들었고, 잘 모르겠으면 '일단 하기나 해' 라는 생각에 파이썬부터 시작해보았다.


 "처음 코딩을 배울때 이해 안 가면 그냥 받아 들여" 하고 지나갔던 부분이 많아 이번에는 기능 하나 만들때마다 조금 세세하게 풀어서 적는 방식으로 하려고 한다.


 우선 최근에 Data 를 만지다보니 csv (comma seprated values) 혹은 tsv (tab seprated values) 파일등을 만질 일이 잦은 것 같아 파일 읽기부터 해보려한다. 



1. Python 파일 읽기 (줄 단위)
  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
"""
CSV 파일 줄 단위 읽기
"""
 
input_file_name = "data.csv"
lines = []
 
with open(input_file_name, "r", encoding="utf-8-sig") as input_file:
    for line in input_file:
        line = line.strip()
        lines.append(line)
 
print("이 파일 {} 의 총 줄수는? {}".format(input_file_name, len(lines)))
 
cs



 아주아주~~ 간단한 예제부터 하나 가지고 와서 작성하였다. 위의 코드에서 파이썬은 자바처럼 int, string 같은 형을 선언해줄 필요없다는 장점이 있었으나, 지옥의 띄어쓰기 에러때문에 초반엔 애먹었었다.


[설명]

5번째 라인에서 파일 csv 를 읽기 위해 파일 패스를 넣은 부분이다.

6번째 라인은 자바에서는 배열을 생각하는데 파이썬은 리스트 (6번째 라인은 빈 리스트) 로 사용된다. 


* 참고

 파이썬의 리스트는 길이가 동적으로 변할 수 있고, 타입도 동적으로 변할수 있다. 


lines = [] 


 위 부분도 정확하게는 선언은 아니고, 할당이라고 한다.


또한 비워져있는 리스트는 lines = list() 로도 생성할 수 있다.


8번째 라인부터 이해가 안가서 몸져누웠던 부분이기도 한데, 실은 굉장히 심플하다.


 보통 파이썬의 파일 읽기는 


open("파일위치", 'w') 문법 이후 write 작성한 후 close 를 사용하는 형태인데


그 부분을 한번에 해결해주기 위해 나온 것이


with open 문법이다. (python 2.5 부터 지원)



with open("파일위치""w") as f:
    f.write("open 문법은 설명 안 해주냐?")
 
"""
open(파일이름, 파일 열기 모드)
r : 읽기 모드 - 읽기만 할 때 사용
w : 쓰기 모드 - 파일에 내용을 쓸때 사용
a : 추가모드 - 파일의 마지막에 새로운 내용을 추가할때 사용
read, write, append 겠지?
"""
cs



9번째 라인에서 만나는 for 문은 반가웠었다.



   for line in input_file:             
        line = line.strip()
        lines.append(line)
 
"""
for 변수 in 리스트 (또는 튜플, 문자열):
    수행 문장1
    수행 문장2
"""
# 주석은 샾 혹은 """ 내용 """ 를 사용한다.
# lstrip()은 문자열에서 왼쪽 공백을 모두 삭제
# rstrip()은 문자열에서 오른쪽 공백을 모두 삭제 
# strip()은 양쪽 공백을 모두 삭제. Java 에서는 trim() 과 같다.
cs



 Shell 에서 사용하는 for 문이나 혹은 Java 의 확장 포문(물론 : 이지만...) 과 비슷한 방법이라 이해하기 어렵지는 않았다. input_file 파일 내용을 line 에 담아 반복하는 부분이다.


10번째 라인은 line 변수의 strip 을 사용하는 부분인데 위의 코드에 나와있는 대로 양쪽 공백을 제거하는 부분이다.


11번째 라인은 6 번째 라인에 할당한 리스트 lines 에 line 의 내용을 추가하는 부분이다.


대망의 13번째 라인은 파일을 읽고 리스트에 담은 내용을 출력한다. 


print 조차 그냥 넘어가지 않겠다는 마음으로 추가 기재!


# 1) 일반적인 print 사용법
= 123
print(a)
# >>> 123
 
# 2) 쌍따옴표(")는 문자열 더하기와 같다.
print("삶은" "너무나" "고달프다"
# >>> 삶은 너무나 고달프다
 
# 3) 띄어쓰기는 콤마(,)를 사용
print("하늘에서""음식이""떨어졌으면""좋겠다")
# >>> 하늘에서 음식이 떨어졌으면 좋겠다.
 
# 4) format() 의 사용
print("사자는 {} 을 뜯지 않는 {} 이지".format('풀''법'))
# >>> 사자는 풀을 뜯지 않는 법이지
cs




2. Python 파일 읽기 (전체)



1
2
3
4
5
6
7
8
9
10
11
12
input_file_name = "data.csv"
lines = []
"""
with open(input_file_name, "r", encoding="utf-8-sig") as input_file:
    text = input_file.read()
lines = text.split("\n")
"""
with open(input_file_name, "r", encoding="utf-8-sig") as input_file:
    text = input_file.read()

lines = text.split("\n")
print("이 파일 {} 의 총 줄수는? {}".format(input_file_name, len(lines)))
cs



1번 코드의 경우 파일을 읽어 줄(line) 단위로 리스트에 담는 방법을 취했다.


위의 2번 코드는 text 에 파일을 모두 담아 split 하는 방안으로 구분자 기준으로 잘라서 리스트에 담는 방법이다.


split() 메소드에 대한 설명을 또 하자면.... 다음과 같다.





# split() 에 아무것도 적지 않으면 공백(스페이스, 탭, 엔터등)을 기준으로 문자열을 자른다.
text = "어흥 곶감 하나 주면 안 잡아먹지"
text.split() 
# >>> '어흥', '곶감', '하나', '주면' '안', '잡아먹지'
 
# split(',') 에 특정 값이 들어가면 해당 값 기준으로 문자열을 자른다. (예시는 콤마(,))
text = "어흥, 곶감 하나 주면, 안 잡아먹지"
text.split(',') 
# >>> '어흥', '곶감 하나 주면', '안 잡아먹지'
cs



자바에서도 split() 메소드를 이용할 수 있는데, python 에는 자바와 다른 줄바꿈문자 전용 문자열 자르기 메소드가 존재한다.










input_file_name = "data.csv"
lines = []
 
with open(input_file_name, "r", encoding="utf-8-sig") as input_file:
    text = input_file.read()
 
# lines = text.split("\n") 줄바꿈 문자열 자르기와 다음 메소드와 같다.
lines = text.splitlines()
 
print("이 파일 {} 의 총 줄수는? {}".format(input_file_name, len(lines)))
cs

바로 split("\n") 과 동일한 splitlines() 메소드이다.










하나의 기능을 모두 풀어 쓰니 뭔가 끝나지 않을 것 같았는데 어찌어찌 끝났다.

오늘 배운 것들을 요약하자면 다음과 같다.

1) 파일읽기 - open, with open

2) 리스트 할당 - lines = [] 
3) 반복문 - for ... in ... 
4) 공백제거 - strip, rstrip, lstrip
5) 문자열 더하기 - append 
6) 출력 - print, format
7) 문자열자르기 - split, splitlines


'NLP & Python' 카테고리의 다른 글

What is NLP?  (0) 2018.10.11