[AIFFEL 울산 1기] Day 2 텍스트의 다양한 변신 (문자열, 파일 다루기)

정경민·2021년 12월 29일
0

학습 목표

  • 파이썬에서 텍스트 데이터를 어떻게 처리하는지 알아봅니다.
  • 파이썬에서 텍스트 파일과 디렉토리에 접근하는 방법을 알아봅니다.
  • 텍스트 파일의 종류를 살펴보고 다루는 방법을 각각 연습해 봅니다.

후기

오늘은 정규표현식과 다양한 파일들을 다루는 방법에 대한 내용들이 주를 이뤘습니다.
정규표현식의 경우에는 기존에도 대충 검색해서 사용해보곤 했었는데 오늘에서야 어떻게 쓰는건지 이해했네요 ^_^
코딩 테스트를 준비하다보면 생각보다 쓰이는 경우가 많은데 미리 공부했었어야 했습니다ㅜㅜ
각각의 파일마다 정의된 문법들이 다르기 때문에 당장 암기는 어려울 것 같으나... 나중에 많이 쓰게 된다면 자동으로 외워질 것이라 생각합니다.

ps. 퍼실님께서 오늘 내용들 나중에 해커톤에서 많이 쓰일 예정이라고 하신다...☆


1. 파이썬에서 모든 문자열은 모두 유니코드로 표현된다!

  • 파이썬 3부터는 문자열이 무조건 유니코드로 인코딩되므로 해당 텍스트가 인코딩되어 있는지 혹은 디코딩되어 있는지만 고려하면 된다는 것이 포인트입니다.
    -> 인코딩 되어 있는지 디코딩 되어 있는지 어떻게 구분??

2. 문자열 다루기

  • 원시 문자열(Raw string)
    -> 이스케이프 문자인 \를 이스케잎 문자로 동작하지 않고 그대로 표현
    -> 문자열 앞에 r을 붙인다.

    (ex) r'I don\'t like touch it'
    Output: I don\'t like touch it
  • startwith, endwith
    -> 코딩 예시: 'OB'로 시작하는 생산팀 직원 리스트

EmployeeID = ['OB94382', 'OW34723', 'OB32308', 'OB83461', 'OB74830', 'OW37402', 'OW11235', 'OB82345']
Production_Employee = [P for P in EmployeeID if P.startswith('OB')]   # 'OB'로 시작하는 직원 ID를 다 찾아봅니다
  • 여러 가지 공백 문자
    - 스페이스(space) : 한 칸 띄어쓰기
    - 탭(tab) \t : 네 칸 띄어쓰기. 때에 따라 두 칸 띄어쓰기로 표기되기도 합니다.
    - 줄 바꿈(new line) : 줄 바꿈
    - 라인 피드 (line feed, 개행) \n : 줄 바꿈을 엄밀히 말하면 라인 피드라고 합니다.
    - 캐리지 리턴 (carriage return, 복귀) \r : 커서를 맨 앞으로 이동시키는 것, 즉 커서를 원위치로 복귀(return)한다는 뜻입니다. 커서를 맨 앞으로 보내고,\r 뒤에 문자가 있으면 그 문자를 출력합니다.

  • 공백 문자 제거하기(trimming)
    -> strip() 이용 (ex) print(String.strip())
    -> srtip(), lstrip(), rstrip()

  • isX (Boolean)
    - isupper() : 문자열이 모두 대문자로만 되어 있으면 True, 그렇지 않으면 False를 반환
    - islower() : 문자열이 모두 소문자로만 되어 있으면 True, 그렇지 않으면 False를 반환
    - istitle(): 문자열의 첫 글자만 대문자로 되어 있으면 True, 그렇지 않으면 False를 반환
    - isalpha(): 문자열이 모두 알파벳 문자로만 되어 있으면 True, 그렇지 않으면 False를 반환
    - isalnum(): 문자열이 모두 알파벳 문자와 숫자로만 되어 있으면 True, 그렇지 않으면 False를 반환
    - isdecimal(): 문자열이 모두 숫자로만 되어 있으면 True, 그렇지 않으면 False를 반환

  • join()과 split()
    1. join()
    -> "구분자".join(반복 가능한 객체)
    -> 문자열을 반환
    2. split()
    -> 문자열.split('구분자')
    -> 리스트를 반환

  • replace()
    -> replace(s1, s2) 형태로 문자열 내 문자열 s1을 s2로 바꿉니다.
    -> 같은 문자가 여럿 있을때, 한 문자만 바꾸고 싶으면??

  • Mutable, Immutable

  1. Mutable
>>> a = [1, 2, 3]   # 리스트 객체 [1, 2, 3]을 변수 a가 가리킵니다.
>>> b = a           # 변수 b도 같은 리스트 객체를 가리키게 됩니다. 
>>> id(a), id(b)
(1629394911880, 1629394911880)
>>> a is b     
True
>>> a == b      
True

>>> a[0] = 0         # 변수 a가 가리키는 리스트 객체의 첫번째 원소값을 변경해도(새로운 원소를 추가/삭제해도)
>>> id(a), id(b)
(1629394911880, 1629394911880)
>>> a is b        # 변수 a와 b는 여전히 같은 객체를 가리킵니다. 
True
>>> a == b        # 그래서 두 변수가 가리키는 객체의 값이 동일하게 변경되어 있습니다.  
True

>>> a, b
([0, 2, 3], [0, 2, 3])  

-> list, set, dict 외에는 immutable이라고 보면 됨

  1. Immutable
>>> a = 10
# 변수 a가 정수 객체를 가리키도록 합니다.
>>> id(a)
1508732208
>>> id(10)
1508732208
>>>
>>> a = a + 1

# 변수 a가 가리키는 정수 객체에 1을 더합니다. 
>>> id(a)
1508732240    # 변수 a가 가리키는 객체만 바뀌었을 뿐
>>> id(10)    

1508732208    # 객체 10은 그대로입니다.

-> int, float, str, tuple 등 대부분 mutable

3. ★정규 표현식★

특정 규칙을 가진 문자열의 집합을 표현하는 형식 언어로, 찾고자 하는 문자열 패턴을 정의하고 기존 문자열과 일치하는지를 비교하여 문자열을 검색하거나 다른 문자열로 치환하는 데 사용

  • re 모듈을 import 해야함

  • 숫자 [0-9] = \d<-> 비숫자 = \D
    알파벳문자+숫자+_(언더바) [0-9a-zA-Z_] = \w <-> \W
    공백문자 \s <-> 비공백문자 \S

  • 구현 순서
    1. import re 를 통해 정규식 모듈을 가져옵니다.
    2. re.compile() 함수로 Regex 객체를 만듭니다.
    3. 검색할 문자열을 Regex 객체의 search() , findall() 메소드로 전달합니다.

4. 파일

  • write
    변수명 = open("파일경로", "w")
    변수명.write("작성하고 싶은 내용")
    변수명.close()
    -> open 했으면 close 하는 것이 필수

  • read
    변수명 = open("파일경로", "r")
    print(변수명.read("작성하고 싶은 내용"))
    변수명.close()

  • with 구문
    with를 통해 open된 객체는 with 문이 종료될 때 자동으로 close 되는 것이 보장되므로, 시스템 리소스의 안정적 사용을 위해 with 문 활용을 권장

	with open("파일경로", "형식") as 변수명:
		작업 코드
f.read() : 파일을 읽는다.
f.readline() : 파일을 한 줄씩 읽는다.
f.readlines() : 파일 안의 모든 줄을 읽어 그 값을 리스트로 반환한다.
f.write(str) : 파일에 쓴다. 문자열 타입을 인자로 받는다.
f.writelines(str) : 파일에 인자를 한 줄씩 쓴다.
f.close() : 파일을 닫는다.
f.seek(offset) : 해당 파일의 위치(offset)를 찾아 파일의 커서를 옮긴다. 파일의 처음 위치는 0이다.
f.tell(): 현재 커서의 위치를 반환한다.

5. 디렉토리

5.1 파이썬에서는 지원하는 디렉터리 관련 표준 라이브러리

  • sys
  • os
  • glob

5.2 모듈 및 패키지

개념
모듈(module) : 파이썬으로 만든 코드가 들어간 파일 .py
패키지(package) : 기능적으로 동일하거나 동일한 결과를 만드는 모듈들의 집합 또는 폴더. 종종 라이브러리라고도 불림
라이브러리(library) : 모듈과 패키지의 집합. 패키지보다 포괄적인 개념이나 패키지와 혼용되어 사용되기도 함.
PIP(Package Installer for Python) : 패키지 관리자로 파이썬을 설치하면 기본으로 설치됨
PyPA(Python Packaging Authority) : 파이선 패키지를 관리하고 유지하는 그룹
PyPI(The Python Package Index) : 파이썬 패키지들의 저장소
함수
sys.path : 현재 폴더와 파이썬 모듈들이 저장되는 위치를 리스트 형태로 반환
sys.path.append() : 자신이 만든 모듈의 경로를 append 함수를 이용해서 추가함. 그 후 추가한 디렉터리에 있는 파이썬 모듈을 불러와 사용할 수 있다.
os.chdir() : 디렉터리 위치 변경
os.getcwd() : 현재 자신의 디렉터리 위치를 반환
os.mkdir() : 디렉터리 생성
os.rmdir() : 디렉터리 삭제 (단, 디렉터리가 비어 있을 경우)
glob.glob() : 해당 경로 안의 디렉터리나 파일들을 리스트 형태로 반환
os.path.join() : 경로(path)를 병합하여 새 경로 생성
os.listdir() : 디렉터리 안의 파일 및 서브 디렉터리를 리스트 형태로 반환
os.path.exists() : 파일 혹은 디렉터리의 경로 존재 여부 확인
os.path.isfile() : 파일 경로의 존재 여부 확인
os.path.isdir() : 디렉터리 경로의 존재 여부 확인
os.path.getsize() : 파일의 크기 확인

6. CSV 파일

  • CSV(Comma Seperated Value): 쉼표로 구분된 파일
    • 각각의 칼럼(column)을 쉼표(,)로 구분
  • CSV 파일과 Pandas
    • 판다스(pandas)의 DataFrame은 to_csv 메서드를 지원
    • to_csv를 통해 csv 파일로 쉽게 저장 가능
    • 반대로, csv 파일을 DataFrame으로 변환시키면 데이터 분석 등 사용자가 편집하기에 용이

7. XML 파일

  • XML(Extensible Markup Language): 다목적 마크업 언어
    • 태그(tag)로 이루어진 언어이며, 상위 태그 - 하위 태그의 계층적 구조를 가짐
    • xml은 요소(element)로 이루어져 있으며,
      기본 형태는 다음과 같다.
      "<태그> 내용 </태그>"
    • 기본 형태와 더불어 속성(attribute)값을 가질 수 있다.
  • dump()
    • 생성된 XML 요소 구조를 시스템(sys.stdout)에 사용
  • XML 파싱
    • 파싱(parsing, 구문 분석)이란 어떤 문자열을 의미 있는 토큰(token)으로 분해해, 문법적 의미와 구조를 반영한 파스 트리(parse tree)를 만드는 과정
    • 파이썬에는 크게 두 가지 방법이 존재
      • ElementTree
      • BeautifulSoup

8. JSON 파일

  • JSON(JavaScript Object Notation): 웹 언어인 JavaScript의 데이터 객체 표현 방식
    • 웹 브라우저와 다른 애플리케이션 사이에서 HTTP 요청으로 데이터를 보낼 때 널리 사용하는 표준 파일 포맷 중 하나
    • 웹 API나 config 데이터를 전송할 때 많이 쓰임
    • 파이썬의 Dictionary와 유사한 형태
    • 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}]
       } 
  • JSON 파싱
    • 파이썬 Dictionary 타입을 JSON로 저장 가능
    • 반대로, JSON 파일의 내용을 파이썬 dict 객체로 읽어들일 수 있음

0개의 댓글