<jupyter_start><jupyter_text>os 모듈* 운영체제(OS)에서 제공하는 기본적인 기능을 사용할 수 있는 여러 명령과 함수가 들어있다.* 대표적으로 현재 파이썬이 실행되는 위치를 확인한다거나, 특정 폴더로 이동하고 싶을 때, 그리고 현재 폴더에 있는 파일들을 리스트 형태로 저장할 때 많이 사용* 파이썬을 배울 때 특정 위치에서 작업하고 그 폴더에 필요한 자료를 생성할 때 유용하다.<jupyter_code>import os<jupyter_output><empty_output><jupyter_text>현재 위치를 확인할 때는 getcwd를 사용<jupyter_code>print(os.getcwd())<jupyter_output>C:\Users\sooyeon\pandasData<jupyter_text>현재 위치를 변경할 때는 chdir를 사용<jupyter_code># os.chdir('/sooyeon/project_file/practice')
# print(os.getcwd())<jupyter_output><empty_output><jupyter_text>현재 위치 어떤 파일이 있는지 확인할 때 listdir를 사용<jupyter_code># print(os.listdir())<jupyter_output><empty_output><jupyter_text>파일 열고 닫기* 파일 열기 모드 'w' : 파일에 내용을 새로 쓸 때 사용* 파일 열기 모드 'r' : 파일에 내용을 읽을 때 사용* 파일 열기 모드 'a' : 파일에 내용을 추가할 때 사용 1. open함수를 사용하여 a.txt파일을 쓰기 모드로 만들고 f 객체에 저장f = open('a.txt','w') 2. f객체에 write함수를 사용하여 'abc'를 저장f.write('abc')3. f객체를 close로 닫기f.close()<jupyter_code>f = open('a.txt', 'w')
f.write('나는 오늘 학교에 갔다')
f.close()
f = open('a.txt', 'r')
print(f.read())


f.seek(0)
print(f.read())

f = open('a.txt','a')
f.write(' 학교에 가지 않을 날이 올까?')
f.close()
f = open('a.txt','r')
print(f.read())<jupyter_output>나는 오늘 학교에 갔다
나는 오늘 학교에 갔다
나는 오늘 학교에 갔다 학교에 가지 않을 날이 올까?<jupyter_text>with 문으로 객체를 만들지 않고 파일 입출력<jupyter_code># with open(파일 이름, 파일 열기 모드)as f:
    # f에 수행할 명령
with open('test.txt','w') as f:
    f.write('나는 오늘 학교에 갔습니다.')

f = open('test.txt','r')
print(f.read())<jupyter_output>나는 오늘 학교에 갔습니다.<jupyter_text>정규표현식 result에 re.findall(r'\([A-Za-z가-힣]+, \d+\)', example)를 저장하고 출력<jupyter_code>import re
example = '이동민 교수님은 다음과 같이 설명했습니다(이동민, 2019). 그런데 다른 교수님은 이 문제에 대해서 다른 견해를 가지고 있었습니다(최재영, 2019). 또 다른 견해도 있었습니다(Lion, 2018)'


result = re.findall(r'\([A-Za-z가-힣]+, \d+\)', example)
print(result)<jupyter_output>['(이동민, 2019)', '(최재영, 2019)', '(Lion, 2018)']<jupyter_text>match 메서드<jupyter_code>import re
pattern = r'ab'
script = 'abcd'
re.match(pattern, script)
re.match(r'ab', 'abcd')
print(re.match(r'ab', 'abcd').group())
pattern = r'life'
script = 'life'
print(re.match(pattern,script).group())
print(re.match(r'life', 'life').group())
def refineder(pattern, script):
    if re.match(pattern,script):
        return "Match!"
    else:
        return "Not a match!"
pattern = r'Life'
script = 'Life is so cool'

print(refineder(pattern, script))
pattern = r'life'
script = 'Life is so cool'

print(refineder(pattern, script))<jupyter_output>Not a match!<jupyter_text>match는 텍스트 중간에 있는 패턴을 찾지 못한다,<jupyter_code>pattern = r'is'
script = 'Life is so cool'
#6번을 해보세요!
print(refineder(pattern, script))<jupyter_output>Not a match!<jupyter_text>search 메서드re.search(패턴, 문자열)<jupyter_code>import re
pattern = r'is'
script = 'Life is so cool'

print(re.search(pattern, script).group())
pattern = r'Life'
script = 'Life is so cool'
print(re.search(pattern, script).group())

pattern = r'cool'
script = 'Life is so cool'
print(re.search(pattern, script).group())<jupyter_output>Life
cool<jupyter_text>findall 메서드re.findall(패턴, 찾으려는 문자열)* findall은 특정 패턴을 문자열에서 모두 찾아서 리스트 형태로 반환한다는 점에서 앞의 두 함수와 차이점* 두 함수는 제대로 찾았는지 확인하는 절차가 필요한 반면 findall은 찾는 값이 없으면 결과값이 빈 리스트로 나온다는 점에서 유용하다.<jupyter_code>number = 'My number is 511223-1****** and yours is 521012-2******'
print(re.findall('\d{6}',number))
example1 = '저는 91년에 태어났습니다. 97년에는 IMF가 있었습니다. 지금은 2020년입니다.'

a = re.findall(r'\d.+?년',example1) # '년'이라는 글자를 찾으면 패턴 찾기를 멈춘다.
b = re.findall(r'\d+.년',example1) # 숫자를 반복시킨 후 '년' 으로 끝나는 문자를 찾는다.

print(a)
print(b)
example = '이동민 교수는 다음과 같이 설명했습니다(이동민, 2019). 그런데 다른 학자는 이 문제에 대해서 다른 견해를 가지고 있었습니다(최재영, 2019). 또 다른 견해도 있었습니다(Lion, 2018).'

c = re.findall(r'\(.+?\)',example)
print(c)<jupyter_output>['(이동민, 2019)', '(최재영, 2019)', '(Lion, 2018)']<jupyter_text>split 메서드* re.split(패턴, 문자열)<jupyter_code>import re
sentence = 'I have a lovely dog, really. I am not telling a lie. What a pretty dog! I love this dog.'


data = 'a:3;b:4;c:5'
data.split(';')<jupyter_output><empty_output><jupyter_text>sentence문장을 split함수를 사용해서 마침표, 느낌표, 물음표마다 나눈 결과를 출력* r을 쓰면 마침표, 느낌표, 물음표마다 역슬래시(\)를 붙이지 않아도 됨<jupyter_code>re.split(r'[.!?]',sentence)<jupyter_output><empty_output><jupyter_text>data를 ;기준으로 나눈 뒤 각 요소를 :로 나눈 값을 출력<jupyter_code>for i in re.split(r';',data):
    li = re.split(r':',i)
    print(li)<jupyter_output>['a', '3']
['b', '4']
['c', '5']<jupyter_text>sub 메서드* re.sub(찾을 패턴, 대체할 문자, 찾을 문자열)* sub메서드는 찾을 문자열에서 찾을 패턴을 전부 대체할 문자로 대체하는 기능* sub기능만 사용한다고 변수에 대체된 결과가 자동으로 저장되지 않는다.* 변수에 sub 결과값을 직접 저장<jupyter_code>word = '<PASSWORD>'
re.sub(r'l', 'o', word)
print(word)
word = 'ooollloooolllllooolollo'
word = re.sub(r'l', 'o', word) # sub의 결과를 저장
print(word)<jupyter_output>ooooooooooooooooooooooo<jupyter_text>sentence에 sub를 사용하여 ‘dog’를 ‘cat’으로 바꾼 값을 저장하고 출력<jupyter_code>sentence = "I have a lovely dog, really. I am not telling a lie. What a pretty dog! I love this dog."
sentence = re.sub(r'dog', 'cat',sentence)
print(sentence)<jupyter_output>I have a lovely cat, really. I am not telling a lie. What a pretty cat! I love this cat.<jupyter_text>word에 sub를 사용하여 개행을 공백으로 바꾼 값을 저장하고 출력<jupyter_code>words = 'I am home now. \n\n\nI am with my cat.\n\n'
words = re.sub(r'\n', '',words)
print(words)<jupyter_output>I am home now. I am with my cat.<jupyter_text>ly로 끝나는 단어 추출* 공백이 아닌 문자나 숫자는 \w* 숫자에 상관없이 반복하는 문자는 +>‘\w+ly'란 패턴을 찾는다<jupyter_code>sentence = 'I have a lovely dog, really. I am not telling a lie'

re.findall(r'\w+ly',sentence)<jupyter_output><empty_output><jupyter_text>---<jupyter_code>littlePrince = '''여섯 살 적에 나는 '체험한 이야기'라는 제목의, 원시림에 관한 책에서 기 막힌 그림 하나를 본 적이 있다. 맹수를 집어삼키고 있는 보아뱀 그림이었다. 위의 그림은 그것을 옮 겨 그린 것이다. 그 책에는 이렇게 씌어 있었다. '보아뱀은 먹이를 씹지도 않고 통째로 집어삼킨다. 그리고는 꼼짝도 하지 못하고 여섯 달 동안 잠을 자 면서 그것을 소화시킨다.' '''
short = lambda x : x[:10]
print(short(littlePrince))
sen = [i for i in littlePrince.split('.')]
sen<jupyter_output><empty_output><jupyter_text>---  드라마 대본 불러오기<jupyter_code>import os, re, codecs<jupyter_output><empty_output><jupyter_text>파이썬에서 유니코드를 다룰 때는 일반적으로 `str.decode()`와 `unicode.encode()` 메서드를 사용하여 unicode 타입과 str 타입을 상호 변환한다.<jupyter_code>f = codecs.open('friends101.txt','r',encoding='utf-8')
k = f.read()
print(k[:100])
print(k[:300])
print(k[:1000])<jupyter_output>The One Where Monica Gets a New Roommate (The Pilot-The Uncut Version)
Written by: <NAME> & <NAME>
Transcribed by: guineapig
Additional transcribing by: <NAME>
(Note: The previously unseen parts of this episode are shown in blue text.)

[Scene: Central Perk, Chandler, Joey, Phoebe, and Monica are there.]

Monica: There's nothing to tell! He's just some guy I work with!

Joey: C'mon, you're going out with the guy! There's gotta be something wrong with him!

Chandler: All right Joey, be nice.  So does he have a hump? A hump and a hairpiece?

Phoebe: Wait, does he eat chalk?

(They all stare, bemused.)

Phoebe: Just, 'cause, I don't want her to go through what I went through with Carl- oh!

Monica: Okay, everybody relax. This is not even a date. It's just two people going out to dinner and- not having sex.

Chandler: Sounds like a date to me.

[Time Lapse]

Chandler: Alright, so I'm back in high school, I'm standing in the middle of the cafeteria, and I realize I am total[...]<jupyter_text>특정 등장인물의 대사만 모으기<jupyter_code>import os, re, codecs
f = codecs.open('friends101.txt', 'r', encoding = 'utf-8')
script101 = f.read()<jupyter_output><empty_output><jupyter_text>Line변수에 script101에서 findall로 모니카의 대사를 모두 찾아 저장<jupyter_code>Line = re.findall(r'Monica:.+''.+',script101)<jupyter_output><empty_output><jupyter_text>Line리스트 요소 중 앞의 세 개만 출력<jupyter_code>Line[:3]<jupyter_output><empty_output><jupyter_text>Line리스트 요소 중 앞의 세 개만 출력하되 반복문을 사용하여 각 대사별로 개행이 되게 출력<jupyter_code>for i in range(0,3):
    print(Line[i]+'\n')
for i in range(0,3):
    li = Line[i]+'\n'
    print(li)<jupyter_output>Monica: There's nothing to tell! He's just some guy I work with!

Monica: Okay, everybody relax. This is not even a date. It's just two people going out to dinner and- not having sex.

Monica: And they weren't looking at you before?!<jupyter_text>monica객체를 만들고 Line에 저장된 monica의 대사들을 개행 처리하여 추가<jupyter_code>for i in range(0,len(Line)):
    monica = Line[i]+'\n'
    print(monica)
m = open('monica.txt.','a')
m.write(monica[])
m.close()<jupyter_output><empty_output><jupyter_text>---<jupyter_code>Line = re.findall(r'Monica:.+', script101)
print(Line[:3])
for item in Line[:3]:
        print(item)
f.close()
f = open('monica.txt', 'w', encoding = 'utf-8')
monica = ''
for i in Line:
    monica += i
monica[:100]
f.write(monica)
f.close()<jupyter_output><empty_output><jupyter_text>객체 f를 사용해 monica.txt 파일에 monica 문자열 입력했을 때어떤 숫자 `파일에 쓴 문자의 개수` 가 나온다면 정상적으로 입력된 것  한 줄씩 정렬하도록 출력<jupyter_code>monica = '' # monica 객체를 다시 선언
for i in Line:
    monica += i + '\n' # monica에 저장하는 모든 i값에 '\n'을 더해 monica에 저장함
f = open('monica.txt', 'w', encoding = 'utf-8')
f.write(monica) # '\n'을 추가해 파일에 쓴 문자 개수가 조금 늘어난다
f.close()
monica[0:100]<jupyter_output><empty_output><jupyter_text>등장인물 리스트 만들기* 각 등장인물들이 ‘Monica:’와 같이 표기되어 있다.* 패턴 : '대문자로 시작 + 소문자 반복 + 콜론(:)* 패턴을 만들 때, `compile` 메서드 사용> pattern = re.compile('[a-z]+')정규표현식을 이용해 소문자가 반복되는 패턴을 pattern에 저장하는 코드* 등장인물들의 이름이 중복되는 문제를 해결하기 위해 set 자료구조를 사용<jupyter_code>a = [1, 2, 3, 4, 5, 2, 2]
print(set(a))<jupyter_output>{1, 2, 3, 4, 5}<jupyter_text>---<jupyter_code># 초기 설정
import os, re, codecs
f = codecs.open('friends101.txt', 'r', encoding = 'utf-8')
script101 = f.read()<jupyter_output><empty_output><jupyter_text>char 객체에 re.compile(r'[A-Z][a-z]+:')를 저장<jupyter_code>char = re.compile(r'[A-Z][a-z]+:')<jupyter_output><empty_output><jupyter_text>>`r'[A-Z][a-z]+:'` 의 의미는 대문자로 시작하고 소문자를 반복하며 `:`로 마무리 되는 패턴을 의미 findall과 char객체를 사용하여 script101에서 모든 등장인물을 찾고 set으로 중복을 제거하여 y에 저장<jupyter_code>y = set(re.findall(char,script101))
print(type(y))
y
z = list(y)
print(type(z))
z
character = [ name[:-1] for name in z ]
character<jupyter_output><empty_output><jupyter_text>한 줄로 작성<jupyter_code>characterr = [ name[:-1] for name in list(set(re.findall(re.compile(r'[A-Z][a-z]+:'),script101))) ]
characterr<jupyter_output><empty_output><jupyter_text>지문만 출력하기* 지문이란 등장인물이 어떻게 움직여야 하는지를 알려 주는 부분<jupyter_code># 초기 설정
import os, re, codecs
f = codecs.open('friends101.txt', 'r', encoding = 'utf-8')
script101 = f.read()<jupyter_output><empty_output><jupyter_text>지문에 해당하는 정규표현식`r'\([A-Za-z].+[a-z|\.]\)'`<jupyter_code>script = re.compile(r'\([A-Za-z].+[a-z|\.]\)')

script1 = re.findall(script,script101)
print(script1[0:6])<jupyter_output>['(The Pilot-The Uncut Version)', '(Note: The previously unseen parts of this episode are shown in blue text.)', '(They all stare, bemused.)', '(mortified)', '(explaining to the others)', '(to Ross)']<jupyter_text>---  특정 단어의 예문만 모아 파일로 저장하기* readlines`readlines`은 해당 객체에서 한 줄에 들어간 문장을 하나의 원소로 하는 리스트를 만드는 명령어<jupyter_code>import os, re, codecs
f = codecs.open('friends101.txt', 'r', encoding = 'utf-8')
f.read(100)
f.seek(0)
sentences = f.readlines()
sentences[:3]<jupyter_output><empty_output><jupyter_text>match 사용 >re.match(r'[A-Z][a-z]+:', i)<jupyter_code>for i in sentences[:20]:
    if re.match(r'[A-Z][a-z]+:', i):
        print(i)<jupyter_output>Monica: There's nothing to tell! He's just some guy I work with!

Joey: C'mon, you're going out with the guy! There's gotta be something wrong with him!

Chandler: All right Joey, be nice.  So does he have a hump? A hump and a hairpiece?

Phoebe: Wait, does he eat chalk?

Phoebe: Just, 'cause, I don't want her to go through what I went through with Carl- oh!<jupyter_text>---  split 없이 - 화자 & 대사<jupyter_code>liness = [i for i in sentences if re.match(r'[A-Z][a-z]+:', i)]
liness[:10]
would = [i for i in liness if re.search('would', i)]
would<jupyter_output><empty_output><jupyter_text>---  split - 대사만<jupyter_code>lines = [i.split(': ')[1] for i in sentences if re.match(r'[A-Z][a-z]+:', i)]
lines[:10]
pattern = r'would'
would = [i for i in lines if re.search(pattern, i)]
would<jupyter_output><empty_output><jupyter_text>---  한줄 코드<jupyter_code>would = [ i for i in sentences if re.match(r'[A-Z][a-z]+:', i) and re.search('would', i)]
would<jupyter_output><empty_output><jupyter_text>--- >다른 단어 포함 : go, take, could  go<jupyter_code>go = [ i for i in sentences if re.match(r'[A-Z][a-z]+:', i) and re.search('go', i)]
go<jupyter_output><empty_output><jupyter_text>take<jupyter_code>take = [ i for i in sentences if re.match(r'[A-Z][a-z]+:', i) and re.search('take', i)]
take<jupyter_output><empty_output><jupyter_text>could<jupyter_code>could = [ i for i in sentences if re.match(r'[A-Z][a-z]+:', i) and re.search('could', i)]
could<jupyter_output><empty_output><jupyter_text>---  for 문 출력<jupyter_code>for i in take:
    print(i)<jupyter_output>Ross: I told mom and dad last night, they seemed to take it pretty well.

Paul: Well, ever-ev-... ever since she left me, um, I haven't been able to, uh, perform. (Monica takes a sip of her drink.) ...Sexually.

Joey: I will not take this abuse. (Walks to the door and opens it to leave.)

Frannie: Are you kidding? I take credit for Paul. Y'know before me, there was no snap in his turtle for two years.<jupyter_text>---  would.txt 파일 생성* writelines 사용* `writelines`는 `readlines`와 정확히 반대로 동작함* 리스트에 들어 있는 원소를 하나씩 꺼내서 한 줄씩 나열<jupyter_code>newf = open('would.txt','w') # 'would.txt' 파일을 쓰기 모드(w)로 생성
newf.writelines(would) # would 리스트의 원소를 꺼내 한 줄씩 쓴다.
newf.close() # 파일 닫기<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.15664913598797897, 'fraction_numerical': 0.014575507137490609, 'mean_word_length': 5.047705588368923, 'pattern_counts': {'":': 0, '<': 167, '<?xml version=': 0, '>': 172, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 1, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '45', 'dir': 'jupyter-structured-clean-dedup', 'id': '373058', 'license': 'MIT', 'n_tokens_mistral': 7227, 'n_tokens_neox': 8042, 'n_words': 1603, 'path': 'practice/Text file processing.ipynb', 'repo_name': 'Soooyeon-Kim/Data-Analysis', 'size': '13340'}