<jupyter_start><jupyter_text>7. 텍스트의 다양한 변신 (문자열, 파일 다루기)**텍스트 데이터는 어떻게 처리하는지, 텍스트 파일의 종류는 무엇이 있는 지 살펴보고 연습해 본다.**  7-1. 들어가며  7-2. 텍스트 데이터를 문자열로 저장한다는 것 (1) 인코딩과 디코딩<jupyter_code>my_str = 'Welcome!'
ur_str = "You're welcome."

print(my_str)
print(ur_str)

# 아래 주석을 제거해 각 변수의 자료형을 확인해보세요 :)
# print(type(my_str))
# print(type(ur_str))
print(ord('a'))    
print(ord('A'))
print(chr(97))
print(ord('가'))
print(chr(0xAC00))   
#- 0xAC00은 44032의 16진수 표현입니다.
#- 파이썬 3-#
#- bytes와 string으로 구분됩니다.

str1 = b'hello'
str2 = 'hello'
str3 = u'hello'
print(type(str1), type(str2), type(str3))
# 결과 : <class 'bytes'>,  <class 'str'>,  <class 'str'><jupyter_output><empty_output><jupyter_text>7-3. 텍스트 데이터를 문자열로 저장한다는 것 (2) 문자열 다루기<jupyter_code>s = 'I don't like Python!'
#- 줄 바꿈
print("사회적\n거리두기")
print('--------------------------')

#- 탭(tab)
print("사회적\t거리두기")
print('--------------------------')

#- 작은따옴표 포함
print('오늘부터 \'사회적 거리두기\'')
#- 예제 코드2
print('Please don\'t touch it')
print(r'Please don\'t touch it')
EmployeeID = ['OB94382', 'OW34723', 'OB32308', 'OB83461', 
                                  'OB74830', 'OW37402', 'OW11235', 'OB82345'] 
Production_Employee = [P for P in EmployeeID if P.startswith('OB')]   # 'OB'로 시작하는 직원 ID를 다 찾아봅니다
Production_Employee
import os
image_dir_path = os.getenv("HOME") + "/data/pictures"   
# 각자의 사진이 보관된 디렉토리를 골라 주세요. 
# 클라우드의 경우에는 사진이 이미 있으므로 코드를 실행시켜주세요. 
photo = os.listdir(image_dir_path )
png = [png for png in photo if png.endswith('.png')]
print(png)
print("사회적 거리두기")
print('--------------------------')
print("사회적\t거리두기")
print('--------------------------')
print("사회적\n거리두기")
print('--------------------------')
print("사회적\r거리두기")
txt = "      Strip white spaces.      "
print('[{}]'.format(txt))
print('--------------------------')

#- 양쪽 공백 제거 : strip()
print('[{}]'.format(txt.strip()))
print('--------------------------')

#- 왼쪽 공백 제거 : lstrip()
print('[{}]'.format(txt.lstrip()))
print('--------------------------')

#- 오른쪽 공백 제거 : rstrip()
print('[{}]'.format(txt.rstrip()))
#- 모든 문자를 대문자로 변환 : upper()
txt = "I fell into AIFFEL"
txt.upper()
#- 모든 문자를 소문자로 변환 : lower()
txt.lower()
#- 첫 글자만 대문자로 변환 : capitalize()
txt.capitalize()
print("aiffel".isupper())
print("aiffel".islower())
print("PYTHON".istitle())
print("python101".isalpha())
print("python101".isalnum())
print("101".isdecimal())
#- join()
stages = ['fundamentals', 'exploration', 'goingdeeper']
",".join(stages)
# 큰따옴표 안에 다양한 구분자(빈칸, 언더바, 온점 등)를 넣어 보세요.
" ".join(stages)
#- split()
'fundamentals,exploration,goingdeeper'.split(',')
sent = 'I can do it!'
sent.replace('I', 'You')
sent = 'I fell into AIFFEL'
print(sent)
print(id(sent))
sent.upper()
print(sent)
print(id(sent))
sent = 'I fell into AIFFEL'
print(sent)
print(id(sent))
sent = sent.upper()
print(sent)
print(id(sent))<jupyter_output><empty_output><jupyter_text>7-4. 텍스트 데이터를 문자열로 저장한다는 것 (3) 정규 표현식<jupyter_code>sent = 'I can do it!'
rep = sent.replace("I", "You")
rep
import re
sent = 'I can do it!'
pattern = re.sub("I", "You", sent)
pattern
#1단계 :  "the"라는 패턴을 컴파일한 후 패턴 객체를 리턴합니다. 
pattern = re.compile("the")    

# 2단계 : 컴파일된 패턴 객체를 활용하여 다른 텍스트에서 검색을 수행합니다.
pattern.findall('of the people, for the people, by the people')
re.findall('the', 'of the people, for the people, by the people')
src = "My name is..."
regex = re.match("My", src)
print(regex)
if regex:
    print(regex.group())
else:
    print("No!")
#- 연도(숫자)
text = """
The first season of America Premiere League  was played in 1993. 
The second season was played in 1995 in South Africa. 
Last season was played in 2019 and won by Chennai Super Kings (CSK).
CSK won the title in 2000 and 2002 as well.
Mumbai Indians (MI) has also won the title 3 times in 2013, 2015 and 2017.
"""
pattern = re.compile("[1-2]\d\d\d")
pattern.findall(text)
#- 전화번호(숫자, 기호)
phonenumber = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d')
phone = phonenumber.search('This is my phone number 010-111-1111')
if phone:
  print(phone.group())
print('------')
phone = phonenumber.match ('This is my phone number 010-111-1111')
if phone:
  print(phone.group())
#- 전화번호(숫자, 기호)
phonenumber = re.compile(r'\d{3}-\d{3}-\d{4}')
phone = phonenumber.search('This is my phone number 010-111-1111')
if phone:
  print(phone.group())
print('------')
phone = phonenumber.match ('This is my phone number 010-111-1111')
if phone:
  print(phone.group())
#- 전화번호(숫자, 기호)
phonenumber = re.compile(r'(\d{3}-){2}\d{4}')
phone = phonenumber.search('This is my phone number 010-111-1111')
if phone:
  print(phone.group())
print('------')
phone = phonenumber.match ('This is my phone number 010-111-1111')
if phone:
  print(phone.group())
#- 이메일(알파벳, 숫자, 기호)
text = "My e-mail adress is <EMAIL>, and <EMAIL>"
pattern = re.compile("[0-9a-zA-Z]+@[0-9a-z]+\.[0-9a-z]+")
pattern.findall(text)<jupyter_output><empty_output><jupyter_text>7-5. 파일과 디렉터리 (1) 파일<jupyter_code>f = open("hello.txt","w") 
#- open(파일명, 파일모드)
#- 파일을 열고 파일 객체를 반환합니다. 
for i in range(10):
    f.write("안녕")
    #- write() 메서드로 '안녕'을 10번 씁니다.
f.close()
#- 작업이 끝나면 close() 메서드로 닫아줍니다. *필수!

print("완료!")
with open("hello.txt", "r") as f:
  print(f.read())
quotes = ["\n안녕하세요.\n", "반갑습니다.\n", "오랜만입니다.\n"]

with open("hello.txt", "a") as f:              # 위에서 만든 파일에 이어서 씁니다. 
    f.writelines(quotes)
with open('hello.txt', 'r') as f:
    hello = f.readlines()
    print(f'위치 : {f.tell()}')
    print(hello)
    print("----------------------------------------------------")
    f.seek(10)
    print(f'위치 : {f.tell()}')<jupyter_output><empty_output><jupyter_text>7-6. 파일과 디렉터리 (2) 디렉터리  7-7. 파일과 디렉터리 (3) 모듈과 패키지<jupyter_code>#- 현재 실행되고 있는 파이썬 실행 파일의 디렉터리를 반환합니다.
import sys
sys.executable
#- 임포트할 때 불러 오는 모듈들이 위치한 경로입니다.
sys.path<jupyter_output><empty_output><jupyter_text>7-8. 여러가지 파일 포맷 다루기 (1) CSV 파일<jupyter_code>billboardchart = {
  				 1 : ["Tho Box","<NAME>","2019-12-19"],
                 2 : ["Don't Start Now", "<NAME>", "2019-11-01"],
                 3 : ["Life Is Good", "Future Featuring Drake", "2020-02-10"],
                 4 : ["Blinding", "The Weeknd", "2019-11-29"],
                 5 : ["Circles", "Post Malone","2019-08-30"]}

with open("billboardchart.csv","w") as f:
    for i in billboardchart.values():
        data = ",".join(i)
        f.write(data+"\n")

print("슝~")
import csv

header = ["title", "singer", "released date"]

with open("billboardchart.csv","r") as inputfile:
    with open("billboardchart_out.csv","w", newline='\n') as outputfile:
        fi = csv.reader(inputfile, delimiter=',')
        fo = csv.writer(outputfile, delimiter=',')
        fo.writerow(header)
        for row in fi:
            fo.writerow(row)

print("슝~")
#- 1. 데이터를 준비합니다.
fields = ["title", "singer", "released date"]
rows = [ ["Tho Box","<NAME>","2019-12-19"],
               ["Don't Start Now", "<NAME>", "2019-11-01"],
               ["Life Is Good", "Future Featuring Drake", "2020-02-10"],
               ["Blinding", "The Weeknd", "2019-11-29"],
               ["Circles", "Post Malone","2019-08-30"]]

print("슝~")
#- 2. 판다스를 이용해 데이터를 csv 파일로 저장합니다.
import pandas as pd

df=pd.DataFrame(rows, columns=fields)
df.to_csv('pandas.csv',index=False)

print("슝~")
#- 3. 동일한 내용을 csv.writer를 이용해 수행해 봅니다.
import csv 

filename = "test.csv"
with open(filename, 'w+', newline='\n') as csv_file: 
    csv_writer = csv.writer(csv_file) 
    csv_writer.writerow(fields) 
    csv_writer.writerows(rows)

print("완료")

#- test.csv 파일을 직접 열어서 눈으로 살펴 보세요. -#
df = pd.read_csv('pandas.csv')
df.head()<jupyter_output><empty_output><jupyter_text>7-9. 여러가지 파일 포맷 다루기 (2) XML 파일<jupyter_code>import xml.etree.ElementTree as ET

person = ET.Element("Person")
name = ET.Element("name")
name.text = "이펠"
person.append(name)

age = ET.Element("age")
age.text = "28"
person.append(age)

ET.SubElement(person, 'place').text = '강남'

ET.dump(person)
person.attrib["id"] = "0x0001"
name.tag = "firstname"
ET.dump(person)
lastname = ET.Element('lastname', date='2020-03-20')
lastname.text = '아'
person.insert(1,lastname)
ET.dump(person)
person.remove(age)
ET.ElementTree(person).write('person.xml')
!ls
from bs4 import BeautifulSoup
import os

path = os.getenv("HOME") + "/aiffel/ftext/data/books.xml"  # 로컬을 사용하시려면 경로는 수정해 주세요. 
with open(path, "r", encoding='utf8') as f:
    booksxml = f.read() 
    #- 파일을 문자열로 읽기
 
soup = BeautifulSoup(booksxml,'lxml') 
#- BeautifulSoup 객체 생성 : lxml parser를 이용해 데이터 분석

for title in soup.find_all('title'): 
#-  태그를 찾는 find_all 함수 이용
    print(title.get_text())<jupyter_output><empty_output><jupyter_text>7-10. 여러가지 파일 포맷 다루기 (3) JSON 파일<jupyter_code>import json

person = {
      "first name" : "Yuna",
      "last name" : "Jung",
      "age" : 33,
      "nationality" : "South Korea",
      "education" : [{"degree":"B.S degree", "university":"Daehan university", "major": "mechanical engineering", "graduated year":2010}]
       } 

with open("person.json", "w") as f:
    json.dump(person , f)

print("슝~")
import json

with open("person.json", "r", encoding="utf-8") as f:
    contents = json.load(f)
    print(contents["first name"])
    print(contents["education"])<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.21470232199845934, 'fraction_numerical': 0.036425663035105096, 'mean_word_length': 3.3545759463344513, 'pattern_counts': {'":': 4, '<': 42, '<?xml version=': 0, '>': 42, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 7}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 1, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '8', 'dir': 'jupyter-structured-clean-dedup', 'id': '566909', 'license': 'MIT', 'n_tokens_mistral': 4454, 'n_tokens_neox': 4773, 'n_words': 886, 'path': 'FUNDAMENTALS/Node_07/[F-07] Only_LMS_Code_Blocks.ipynb', 'repo_name': 'HRPzz/AIFFEL', 'size': '9126'}