fangj.github.io/friends/season/0101.html
예제 파일 다운로드
컨트롤 + A한다음에 컨트롤 + C해서 복사해서 메모장에 붙여 놓고 다른 이름으로 저장해서 원하는 경로에 저장한다.
(파일 이름은 : 'friends101.txt')
import os, re
os.chdir(r'C:\2021-1-AI-Park') #friends101.txt 파일을 저장한 폴더 경로 입력
파일을 저장한 폴더 경로 입력함
f = open('friends101.txt', 'r', encoding = 'utf8') #인코딩 오류가 발생할 수 있으니 utf8인코팅함
script101 = f.read() # f.read()읽기모드로 script101객체 저장
print(script101[:100]) # script101 텍스트 파일을 슬라이싱해서 출력함
인코딩 오류 발생할 수 있으니 utf8 인코딩하고 f.read() 읽기모드로 script101객체 저장 후
script101 텍스트 파일을 슬라이싱해서 출력
Line = re.findall(r'Monica:.+', script101)
findall 함수는 찾은 조건식을 모두 리스트로 만들어줍니다.
'Monica:' 다음 아무 문자나 반복되는(.+) 패턴을 script 101에서 찾아 리스트로 반환합니다
print(Line[:3])
명령어를 제대로 인식했는지 세 문장만 슬라이싱해서 출력합니다 .
>>> for item in Line[:3]:
... print(item)
for문을 사용하면 좀더 매끄럽게 출력할수 있습니다.
f.close()
txt파일을 닫아줍니다.
이번에는 모니카 Monica의 대사를 텍스트 파일로 저장해보겠습니다.
대사를 저장할 파일 'monica.txt'를 쓰기 모드로 만듭니다.
f = open('monica.txt', 'w', encoding = 'utf-8')
monica = ''
monica객체 선언할때 빈 문자열을 저장하면 문자열 형식으로 객체가 만들어집니다.
for i in Line:
monica += i
Line 리스트의 모든 원소를 가져와 monica 문자열에 추가하겠습니다.
f.write(monica)
#출력: 4542 #파일에 쓴 문자 개수가 출력됩니다.
f.close() #작업이 끝났으면 파일을 닫습니다.
f.write(monica) 를 출력하면 monica.txt 파일에 쓴 문자 개수가 출력됩니다.
그리고 f.close() 통해 작업이 끝났으면 꼭닫아줍니다.
monica.txt파일을 보면 가독성이 안좋게 붙어있습니다.
대사마다 줄 바꿔줘야겠군요.
줄바꿈 문자인 '\n' 를 사용해서 대사가 끝날 때마다 줄을 바꿔줍니다.
monica = ''
for i in Line:
monica += i + '\n'
훨씬 가독성이 좋아졌습니다.
monica[:100] #슬라이싱을 해서 100번째 까지보면 \n이 추가된게 보입니다.
슬라이싱을 해서 100번째까지 보면 \n이 추가된게 보입니다.
f = open('monica.txt', 'w', encoding = 'utf-8')
f.write(monica)
#출력: 4615
f.close()
\n이 추가해서 파일의 문자 개수가 4542개에서 4615개로 늘어낫습니다.
이번에는 등장인물 이름 모우기 해보겠습니다
char = re.compile(r'[A-Z][a-z]+:')
'등장인물:' 패턴의 문자열을 모울려면 char 객체를 만들어 '대문자로 시작+소문자 반복+콜록(:)' 패턴을 찾는 검색 조건을 지정합니다.
re.findall(char, script101)
이번에는 finall을 사용해 '등장인물:' 형태로 된 패턴 문자열을 모두 모아봅니다.
출력된 결과를 보면 Monica, Rachel등 많은 인물의 이름이 중복 되어 있는게 보입니다.
set키워드를 사용하면 중복된 원소를 지울 수 있습니다
set(re.findall(char, script101))
훨씬 간결해졌습니다.
하지만 여기서 두가지 문제를 더 해결해야합니다. Note나 All처럼 등장인물이 아닌데 형식이 맞아서 출력된것도 있고,
등장인문 뒤에 나오는 콜론(:)도 지워야합니다.
먼저 콜론 부터 지워보겠습니다.
rachel = 'Rachel:' #rachel객체에 'Rachel:' 문자열을 저장합니다
rachel = re.sub(':', '', rachel) #rachel문자열에서 ':'을 ''로 바꿉니다
rachel #콜론(:)이 사라진지 확인하기위해 출력합니다
#출력 : Rachel
위에는 정규표현식 문법을 실험하는 방법입니다.
더 쉽게 콜론(:)을 지우는 방법도 있습니다.
이미 콜론이 모든 원소의 맨 마지막에 있다는걸 알고 있습니다
그래서 문자열 슬라이싱 기능을 이용하면 원하는 위치의 문자를 제외하고 값을 출력할 수 있습니다.
y = set(re.findall(char, script101)) #등장인물 리스트를 집합으로 바꿔 y객체에 저장합니다
z = list(y) #for문에 사용하기 위해 다시 리스트로 바꿉니다
character = [] #등장인물 리스트를 새로 담을 객체 character를 만듭니다
for i in z:
character += [i[:-1]] #맨 뒤 콜론(:)을 지우고 character에 저장합니다
character #제대로 지워졌는지 character를 출력해봅니다.
깔끔하게 콜론(:)이 지워진게 보입니다.
이번에는 특정 단어의 예문만 모아 파일로 저장해보겠습니다.
import os, re #os, re 모듈을 import 합니다
os.chdir(r'C:\2021-1-AI-Park') #자신이 드라마 대사를 저장한 .txt파일에 접근합니다
f = open('friends101.txt', 'r') #friends.txt파일을 'r'읽기모드로 열어 객체 f에 저장합니다
f.read(100) #100번째 글자까지만 읽어봅니다
f.seek(0) #읽은 다음 커서를 맨 앞으로 이동합니다.
#출력: 0
이번에는 객체 f안에 모든 문장을 리스트로 만들어 줍니다.
readlines는 객체에서 한 줄에 들어간 문장을 하나의 원소로 하는 리스트 명령어입니다.
sentences = f.readlines() #객체 f안의 모든 문장을 원소로 하는 리스트
sentences[:3] #각 문장이 원소로 잘들어갔는지 확인합니다.
sentences리스트에 모든 문장을 원소로 저장했습니다.
sentences리스트에서 대사만 추출해 보겠습니다. '사람이름: 대사' 패턴의 문자열이 나오는 문장입니다
for i in sentences[:20]: #먼저 문장 20개만 가져와 실험해 봅니다
if re.match(r'[A-Z][a-z]+:', i): #match 문으로 문장 맨 앞에서 패턴을 찾습니다.
print(i)
sentences 객체의 원소 20개중에서 대사만 골라 출력 되었습니다.
대사만 있는 리스트를 만들어보겠습니다
Lines = [i for i in sentences if re.match(r'[A-Z][a-z]+:', i)]
#sentences 객체의 원소 i 중 if 문을 충족하는 것을 그대로 Lines 리스트에 저장합니다
Lines[:10] #정상적으로 저장되었는지 출력해봅니다.
would가 있으면 저장하라는 if 조건문을 추가해줍니다.
would = [i for i in sentences if re.match(r'[A-Z][a-z]+:', i)and re.search('would', i)]
#if문 조건에 and re.search('would, i)를 추가해 would 객체에 저장함
would #모든문장에 would가 있는지 확인해봅니다.
이번에는 take가 들어 가있으면 저장하라는 코드를 작성해보겠습니다
take = [i for i in sentences if re.match(r'[A-Z][a-z]+:', i) and re.search('take', i)]
#take객체에 take가 들어간 문장만 저장합니다
take #모든 문장에 take가 있는지 확인합니다.
이번에는 take 객체의 원소를 차례대로 출력해봅니다.
for i in take:
print(i)
이번에는 추출한 문장을 파일로 저장해봅시다.
writelines : 한꺼번에 모든 줄 쓰기
readlines : 한꺼번에 모두 읽어오기
이번에는 writelines를 사용해서 저장해봅니다
newf = open('would.txt', 'w') #'would.txt' 파일을 쓰기 모드(w)로 생성
newf.writelines(would) #would 리스트의 원소를 꺼내 씁니다
newf.close() #파일을 닫습니다
파일 경로로 들어가서 보면 would.txt 파일이 생긴것을 확인 할수있습니다.
Reference : Do it 파이썬 생활 프로그래밍 코딩
'파이썬 실습' 카테고리의 다른 글
보스턴 주택 가격 예측 네트워크 코드 분석 (0) | 2021.05.06 |
---|---|
도미와 빙어 지도학습 실습 (0) | 2021.04.29 |