파이썬 실습

텍스트 파일 가공하기 (friends101.txt 가공)

PGNV 2021. 5. 11. 15:13

fangj.github.io/friends/season/0101.html 

 

The One Where Monica Gets a New Roomate (The Pilot-The Uncut Version)

Written by: Marta Kauffman & David Crane Transcribed by: guineapig Additional transcribing by: Eric Aasen (Note: The previously unseen parts of this episode are shown in blue text.) Joey: C'mon, you're going out with the guy! There's gotta be something wro

fangj.github.io

예제 파일 다운로드

 

컨트롤 + 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 파이썬 생활 프로그래밍 코딩