AIFFEL(211229)_텍스트의 다양한 변신
NODE : 7. 텍스트의 다양한 변신
학습목표
- 파이썬에서 텍스트 데이터를 어떻게 처리하는지 안다.
- 파이썬에서 텍스트 파일과 디렉토리에 접근하는 방법을 안다.
- 텍스트 파일의 종류를 살펴보고 다루는 방법을 각각 연습해 본다.
📖 텍스트 데이터를 문자열로 저장한다는 것_(1) 인코딩과 디코딩
텍스트 데이터는 문자열(string)로 표현한다. 파이썬에서 문자열 리터럴(literal)은 작은따옴표('
) 혹은 큰따옴표("
)로 묶인 일련의 문자로 볼 수 있다.
데이터를 변수에 저장을 했었는데, 이렇게 변수에 데이터를 할당하면 이 데이터들은 컴퓨터의 주기억장치인 메모리(RAM)에 저장된다.
컴퓨터는 0과 1의 이진 데이터(binary data)로 표현되기 때문에 데이터도 마찬가지로 0과 1로 변환돼 다뤄지게 된다. 메모리에는 바이트로 저장된다.
* 바이트(byte) : 컴퓨터의 기본 저장 단위
1바이트(1byte)는 8비트(8bit)이며, 2의 8승 즉 256개의 고유한 값을 저장할 수 있다.
- 인코딩(encoding) : 문자열을 바이트로 변환하는 과정
- 디코딩(decoding) : 바이트를 문자열로 변환하는 과정
문자열 데이터 : 사람이 이해할 수 있는 텍스트 데이터
문자열을 이진수로 변환(인코딩)하는 방법은 문자 각각을 숫자에 대응시키고 이 숫자를 이진수로 변환하면 된다.
문자를 숫자로 대응시키는 방법은 통일되어 있으며, 국제표준 기구인 ISO(International Standards Organization)는
전 세계 문자를 모두 표시할 수 있는 표준 코드(유니코드, Unicode)를 제정했다.
유니코드는 오직 한 가지 버전만 존재하며 UTF-8, UTF-16등은 유니코드로 정의된 텍스트를 메모리에 인코딩하는 방식들을 말한다.
ord()
: 해당 문자에 대응하는 유니코드 숫자를 반환한다.
chr()
: 해당 유니코드 숫자에 대응하는 문자를 반환한다.
📎 유니코드에 대한 자세한 내용들
유니코드 영역
유니코드와 UTF-8
UTF-8과 UTF-16
유니코드 테이블
문자열은 내부적으로 유니코드 규약에 따른다. 이는 외부 데이터 및 데이터베이스로부터 데이터를 읽거나 보낼 때는 인코딩 혹은 디코딩 작업을 거쳐야 하며, 인코딩 규약은 내부적으로 유니코드(UTF-8)임을 의미한다.
파이썬 2에서는 인코딩한 후에도 아스키(ascii) -> 유니코드(unicode)변환 등의 작업을 거쳐야 했던 반면에, 파이썬 3부터는 문자열이 무조건 유니코드로 인코딩되므로 텍스트가 인코딩되어 있는지 혹은 디코딩되어 있는지만 고려하면 된다.
📖 텍스트 데이터를 문자열로 저장한다는 것_(2) 문자열 다루기
이스케이프 문자
문자열에 작은따옴표나 큰따옴표, 줄 바꿈 등의 특수문자를 포함하고 싶은데, 그 문자가 특수문자가 아닌 것처럼 처리하고 싶을 때 이스케이프 문자를 사용할 수 있다. 이스케이프 문자는 \[특정문자]
형태로 직접 입력할 수 없는 일부 문자를 문자열에 포함시킬 수 있는 특수문자이다.
이스케이프문자 | 출력 |
---|---|
\' | 홑따옴표' |
\" | 겹따옴표" |
\t | 탭 |
\n | 줄바꿈 |
\\ | 백슬래시 |
#- 줄 바꿈
print("사회적\n거리두기")
print('--------------------------')
#- 탭(tab)
print("사회적\t거리두기")
print('--------------------------')
#- 작은따옴표 포함
print('오늘부터 \'사회적 거리두기\'')
원시 문자열
이스케이프 문자를 무시하고 싶을 때는 원시 문자열(raw string)을 사용한다. 문자열을 식작하는 따옴표 앞에 r
을 붙이면 이스케이프 문자가 적용되지 않은 있는 그대로의 문자열을 나타낼 수 있다.
#- 예제 코드2
print('Please don\'t touch it')
print(r'Please don\'t touch it')
startswith, endswith
생산직은 OB
로, 사무직은 OW
로 시작되는 직원 ID가 저장된 데이터베이스가 있을 때 생산직 직원ID만 추려보고 싶을 때 .startswith()
를 사용하면 된다.
EmployeeID = ['OB94382', 'OW34723', 'OB32308', 'OB83461',
'OB74830', 'OW37402', 'OW11235', 'OB82345']
Production_Employee = [P for P in EmployeeID if P.startswith('OB')] # 'OB'로 시작하는 직원 ID를 다 찾아봅니다
Production_Employee
여러 가지 그림 파일들이 저장되어 있을 때 .png
파일만 얻고 싶다면 .endswith()
를 통해 해당 파일(들)을 찾을 수 있다.
공백 문자 처리 : trimming
공백 문자는 띄어쓰기로 표기되는 항목인데, 문자열 작업에서는 다듬기 즉, trimming이라고 불린다.
여러 가지 공백 문자
- 스페이스(space) : 한 칸 띄어쓰기
- 탭(tab) \t
: 네 칸 띄어쓰기. 때에 따라 두 칸 띄어쓰기로 표기되기도 한다.
- 줄 바꿈(new line) : 줄 바꿈
- 라인 피드 (line feed, 개행) \n
: 줄 바꿈을 엄밀히 말하면 라인 피드라고 한다.
- 캐리지 리턴 (carriage return, 복귀) \r
: 커서를 맨 앞으로 이동시키는 것, 즉 커서를 원위치로 복귀(return)한다는 뜻입니다. 커서를 맨 앞으로 보내고,\r
뒤에 문자가 있으면 그 문자를 출력합니다.
print("사회적 거리두기")
print('--------------------------')
print("사회적\t거리두기")
print('--------------------------')
print("사회적\n거리두기")
print('--------------------------')
print("사회적\r거리두기")
공백 문자 제거하기
파이썬에서는 .strip()
메서드를 사용해 공백 문자를 처리한다.
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()
: 모든 문자를 대문자로 변환한다.
- .lower()
: 모든 문자를 소문자로 변환한다.
- .capitalize()
: 첫 글자만 대문자로 변환한다.
isX
isX
형태의 메서드들은 문자열의 구성에 따라 불린(boolean)의 값을 반환(return)해준다.
- .isupper()
: 문자열이 모두 대문자로만 되어 있으면 True, 그렇지 않으면 False를 반환
- .islower()
: 문자열이 모두 소문자로만 되어 있으면 True, 그렇지 않으면 False를 반환
- .istitle()
: 문자열의 첫 글자만 대문자로 되어 있으면 True, 그렇지 않으면 False를 반환
- .isalpha()
: 문자열이 모두 알파벳 문자로만 되어 있으면 True, 그렇지 않으면 False를 반환
- .isalnum()
: 문자열이 모두 알파벳 문자와 숫자로만 되어 있으면 True, 그렇지 않으면 False를 반환
- .isdecimal()
: 문자열이 모두 숫자로만 되어 있으면 True, 그렇지 않으면 False를 반환
print("aiffel".isupper())
print("aiffel".islower())
print("PYTHON".istitle())
print("python101".isalpha())
print("python101".isalnum())
print("101".isdecimal())
.join()과 .split()
.join()
은 인자로 tuple, list, string 등 반복 가능한(iterable) 객체를 받는 메서드이다. .join()
은 각각의 원소를 모아 하나의 문자열로 합쳐 준다.
#- join()
stages = ['fundamentals', 'exploration', 'goingdeeper']
",".join(stages)
",".join(stages)
를 실행시켰을 때, 단어 사이에 쉼표(,)가 들어가 있다. 큰따옴표 사이에는 구분자라는 것을 넣을 수 있으며, 쉼표(,
), 언더바(_
), 빈칸 등을 사용할 수 있다. "구분자".join()
를 사용하면 원소들 사이에 구분자를 넣어서 하나의 문자열로 합쳐준다.
.split()
은 반대로 하나의 문자열을 구분자를 기준으로 나누어 준다. 명시적으로 구분자를 지정하지 않으면 쉼표(,
)를 기준으로 나누어 준다.
#- split()
'fundamentals,exploration,goingdeeper'.split(',')
추가적으로 .split()
은 리스트를 반환하고 .join()
은 문자열을 반환한다.
replace
- .replace()
: replace(s1, s2)
형태로 문자열 내 문자열 s1
을 s2
로 바꾼다.
불변(immutable)의 문자열
-
가변 객체(mutable object)
- 객체를 생성한 후 객체의 값을 수정할 수 있다.
- 변수는 값이 수정된 같은 객체를 가리키게 된다.
- e.g.list
,set
,dict
-
불변 객체(immutable object)
- 객체를 생성한 후 객체의 값을 수정할 수 없다.
- 변수는 해당 값을 가진 다른 객체를 가리키게 된다.
- e.g.int
,float
,complex
,bool
,string
,tuple
,frozen set
📎 객체와 mutable, immutable의 차이
객체
mutable, immutable의 차이
🔎
📖 텍스트 데이터를 문자열로 저장한다는 것_(3) 정규 표현식
거의 모든 운영 체제가 어떤 특정한 단어를 검색할 때 자주 사용하는 단어 검색 기능 ctrl + F
을 지원한다. 이러한 기능이 바로 정규 표현식(regular expression, regex)에 근거해 만들어진 기능이다.
정규 표현식은 대부분의 운영 체제, 다양한 프로그래밍 언어, 그리고 텍스트 편집기와 같은 프로그램들이 지원하고 있다.
문자열 VS 정규 표현식
정규 표현식을 사용한 문자 대체
import re
sent = 'I can do it!'
pattern = re.sub("I", "You", sent) # 정규표현식을 사용해 I를 You로 대체
pattern
정규 표현식은 특정 규칙을 가진 문자열의 집합을 표현하는 형식 언어로, 찾고자 하는 문자열 패턴을 정의하고 기존 문자열과 일치하는지를 비교하여 문자열을 검색하거나 다른 문자열로 치환하는데 사용한다.
패턴화된 문자열이 나타날 때마다 .startswith()
, .endswith()
,.replace()
등과 같은 문자열 메서드를 매번 사용하면 굉장히 힘들다. 그러나 정규 표현식을 사용하면 간단하게 문자열 검색과 치환이 가능하다.
정규 표현식 시작하기
import re
파이썬에서는 표준 라이브러리인 re
모듈을 import
해서 정규 표현식을 사용할 수 있다.
compile()
정규 표현식의 사용법은 크게
-
찾고자 하는 문자열의 패턴을 정의하고
-
정의된 패턴과 매칭되는 경우를 찾아 다양한 처리
2단계로 나누어 진다.
이중 1.에 해당하는 과정을 컴파일(compile)이라고 한다.
#1단계 : "the"라는 패턴을 컴파일한 후 패턴 객체를 리턴합니다.
pattern = re.compile("the")
# 2단계 : 컴파일된 패턴 객체를 활용하여 다른 텍스트에서 검색을 수행합니다.
pattern.findall('of the people, for the people, by the people')
하지만 정규 표현식을 활용하기 위해 꼭 re.compile()
을 호출해야 하는 것은 아니며 아래 코드는 명시적 컴파일 과정 없이 한 줄로 동일하게 처리한다.
re.findall('the', 'of the people, for the people, by the people')
아래쪽 경우가 간결하나 명시적으로 패턴 객체를 생성한 경우 해당 객체를 반복 사용 가능하다는 점이 장점이 될 때가 있다.
메서드
위 2단계에서 패턴 객체를 활용해서 호출 가능한 메서드와 속성을 알아본다.
- search()
: 일치하는 패턴 찾기 (일치 패턴이 있으면 MatchObject를 반환한다.)
- match()
: search()
와 비슷하지만, 처음부터 패턴이 검색 대상과 일치해야 한다.
- findall()
: 일치하는 모든 패턴 찾기 (모든 일치 패턴을 리스트에 담아서 반환한다.)
- split()
: 패턴으로 나누기
- sub()
: 일치하는 패턴으로 대체하기
- group()
: 실제 결과에 해당하는 문자열을 반환한다.
패턴 : 특수문자, 메타문자
패턴이야말로 정규 표현식을 강력하게 해주는 도구이다. 특수문자 혹은 메타문자라 불리는 [], -, ., ?, *, +, {}, /
등을 이용해 특수한 패턴을 만들 수 있다.
- []
: 문자
- -
: 범위
- .
: 하나의 문자
- ?
: 0회 또는 1회 반복
- *
: 0회 이상 반복
- +
: 1회 이상 반복
- {m, n}
: m ~ n
- \d
: 숫자, [0-9]
와 동일
- \D
: 비 숫자, [0-9]
와 동일
- \w
: 알파벳 문자 + 숫자 + _
, [a-zA-Z0-9_]
와 동일
- \W
: 비 알파벳 문자 + 비숫자, [^a-zA-Z0-9_]
와 동일
- \s
: 공백 문자, [ \t\n\r\f\v]
와 동일
- \S
: 비 공백 문자, [^ \t\n\r\f\v]
와 동일
- \b
: 단어 경계
- \B
: 비 단어 경계
- \t
: 가로 탭(tab)
- \v
: 세로 탭(vertical tab)
- \f
: 폼 피드
- \n
: 라인 피드(개행문자)
- \r
: 캐리지 리턴(원시 문자열)
구현 순서
- .import re
를 통해 정규식 모듈을 가져온다.
- re.compile()
함수로 Regex 객체를 만든다.
- 검색할 문자열을 Regex 객체의 .search()
, .findall()
메소드로 전달한다.
📖 파일과 디렉터리_(1) 파일
메모리에 저장되는 데이터는 로드 및 액세스 속도가 빠르다는 장점이 있지만, 일정 전원이 공급되어야만 데이터가 보존된다.
즉, 프로그램이 실행되는 동안에만 데이터가 저장된다.
중요한 정보가 담긴 데이터를 영구적으로 보존할 필요가 있기 때문에 보조기억장치에 데이터를 저장한다. 이를 파일(file)이라 한다.
파일
파일을 열고 객체로 만들어 주는 작업
f = open("hello.txt","w")
#- open(파일명, 파일모드)
#- 파일을 열고 파일 객체를 반환합니다.
for i in range(10):
f.write("안녕")
#- write() 메서드로 '안녕'을 10번 씁니다.
f.close()
#- 작업이 끝나면 close() 메서드로 닫아줍니다. *필수!
print("완료!")
read
with open("hello.txt", "r") as f:
print(f.read())
여기서 with
구문을 사용해서 파일을 열어서 파일 객체를 f
로 받아서 f.read()
를 통해 내용을 읽었다. f.close()
를 명시적으로 호출하지 않고 있다. 이것은 실수가 아니라, with
를 통해 open
된 객체는 with
문이 종료될 때 자동으로 close
되는 것이 보장되기 때문이다. 시스템 리소스의 안정적 사용을 위해 with
문 활용을 권장한다.
파일 관련 메서드
- f.read()
: 파일을 읽는다.
- f.readline()
: 파일을 한 줄씩 읽는다.
- f.readlines()
: 파일 안의 모든 줄을 읽어 그 값을 리스트로 반환한다.
- f.write(str)
: 파일에 쓴다. 문자열 타입을 인자로 받는다.
- f.writelines(str)
: 파일에 인자를 한 줄씩 쓴다.
- f.close()
: 파일을 닫는다.
- f.seek(offset)
: 해당 파일의 위치(offset)를 찾아 파일의 커서를 옮긴다. 파일의 처음 위치는 0이다.
- f.tell()
: 현재 커서의 위치를 반환한다.
📖 파일과 디렉터리_(2) 디렉터리
디렉터리
파일을 다룰 때 중요한 것이 바로 파일이 저장된 위치이다. 파일이 어느 폴더(디렉터리)에 저장되어 있는가가 매우 중요하다.
파일명이 project.txt
이고 그 경로가 C:\Users\person\Documents
라는 것은 C 드라이브
에 있는 Users
폴더에 속한 person
폴더에 있는 Documents
폴더에 project.txt
라는 파일이 저장되어 있다는 뜻이다.
이러한 경로의 최상위 폴더를 루트 디렉터리(root directory)라고 부른다.
- window 운영 체제 : C:\
- Linux 계열 운영 체제 : /
📎 리눅스 더 알아보기
리눅스 파일 시스템
리눅스 기본 명령어
📖 파일과 디렉터리_(3) 모듈과 패키지
파이썬 파일은 어디에 저장될까?
파이썬에서 지원하는 디렉터리 관련 표준 라이브러리는 아래와 같다.
- sys
- os
- glob
이 모듈들을 import
해서 디렉터리 관련 작업을 하는 것이다.
주로 .pip
이나 .conda
명령어를 통해 설치한 라이브러리 관련 파일의 위치를 확인한다.
파이썬 모듈 및 패키지 개념 정리
- 모듈(module) : 파이썬으로 만든 코드가 들어간 파일 .py
- 패키지(package) : 기능적으로 동일하거나 동일한 결과를 만드는 모듈들의 집합 또는 폴더. 종종 라이브러리라고도 불림
- 라이브러리(library) : 모듈과 패키지의 집합. 패키지보다 포괄적인 개념이나 패키지와 혼용되어 사용되기도 함.
- PIP(Package Installer for Python) : 패키지 관리자로 파이썬을 설치하면 기본으로 설치됨
- PyPA(Python Packaging Authority) : 파이선 패키지를 관리하고 유지하는 그룹
- PyPI(The Python Package Index) : 파이썬 패키지들의 저장소
📎 모듈 vs 패키지 vs 라이브러리 vs 프레임워크
알아보기
함수
- 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()
: 파일의 크기 확인
📖 여러 가지 파일 포맷 다루기_(1) CSV 파일
CSV파일
CSV는 Comma Seperated Value의 약자로, 쉼표로 구분된 파일을 말한다.
각 칼럼(Column)을 쉼표(,
)로 구분
CSV 파일과 Pandas
판다스(pandas)의 DataFrame은 to_csv
메서드를 지원합니다. 이 메서드를 이용하면 csv 파일로 쉽게 저장할 수 있다.
반대로, csv 파일을 DataFrame으로 변환시키면 데이터 분석 등 사용자가 편집하기에 용이하다.
📖 여러 가지 파일 포맷 다루기_(2) XML 파일
XML
XML은 Extensible Markup Language의 약자로, 다목적 마크업 언어이다.
인터넷 웹상에서 문서 즉, 내용을 교환할 때 이러한 마크업 언어를 이용한다.
마크업 언어를 아주 간단히 말하면, 태그라고 불리는 꺾쇠 모양의 괄효(<>
)로 구분된 언어라고 할 수 있다. API에서 데이터를 요청하고 저장할 때 XML
이나 JSON
형식을 이용해 데이터를 교환한다.
<Person>
<Name>이펠</Name>
<Age>28</Age>
<Place>강남</Place>
</Person>
#- 꺾쇠 괄호 안에 태그 이름을 정의하고, 태그 사이에 데이터를 기록하는 형식입니다.
#- 참고로, 태그 이름은 사용자가 마음대로 지정할 수 있습니다.
XML 파일에는 꺾쇠(<글자>
)가 많이보이는데 이 부분을 태그(tag)라고 부른다.
태그는 기본적으로 <태그> 내용 </태그>
형태로 구성되어 있지만, 아래의 그림처럼 태그에 속성(attribute)값이 포함될 수도 있다.
상위 태그 안에 하위 태그가 속해 있을 수 있는데 이런 관계를 부모- 자식 관계라고 한다.
아래는 <Table>
태그는 <Row>, <Cell>
, 그리고 <Data>
태그를 자식 태그로 가지고 있다.
<Table>
<Row>
<Cell>
<Data ss:Type="String">Notice</Data>
</Cell>
</Row>
XML 정리
1. XML은 다목적 마크업 언어(Extensible Markup Language)이다.
2. 마크업 언어는 태그(tag)로 이루어진 언어를 말하며, 상위(부모) 태그 - 하위(자식) 태그의 계층적 구조로 되어 있다.
3. XML은 요소(element)들로 이루어져 있다.
4. 요소는 <열린 태그> 내용 </닫힌 태그>
가 기본적인 구조이며, 속성(attribute) 값을 가질 수도 있다.
XML 파일 만들기
ElementTree
파이썬 표준 라이브러리인 ElementTree는 XML 관련 기능을 아래와 같이 제공한다.
- Element()
: 태그 생성
- SubElement()
: 자식 태그 생성
- tag
: 태그 이름
- text
: 텍스트 내용 생성
- attrib
: 속성 생성
dump()
생성된 XML 요소 구조를 시스템(sys.stdout)에 사용한다. 출력 형식은 일반 XML 파일로 기록된다.
- write()
: XML 파일로 저장
- 리스트(list)와 유사한 메서드(append(), insert(), remove(), pop())를 제공
XML 파싱하기
파싱(parsing, 구문 분석)이란 어떤 문자열을 의미 있는 토큰(token)으로 분해해, 문법적 의미와 구조를 반영한 파스 트리(parse tree)를 만드는 과정이다. XML 문서를 파싱하게 되면 특정 태그명이나 속성값 등을 불러올 수 있다.
XML의 파싱 - 파스 트리
파이썬에서는 그 방법을 크게 2가지 제공한다. 첫번째가 위처럼 ElementTree이고, 다른 하나가 🔎BeautifulSoup 라이브러리를 사용하는 것이다.
📎 BeautifulSoup의 다양한 메서드
알아보기
📖 여러 가지 파일 포맷 다루기_(3) JSON 파일
JSON
JSON은 JavaScript Object Notation의 약자로, 웹 언어인 JavaScript의 데이터 객체 표현 방식이다.
웹 브라우저와 다른 애플리케이션 사이에서 HTTP 요청으로 데이터를 보낼 때 널리 사용하는 표준 파일 포맷 중 하나로, XML과 더불어 웹 API나 config 데이터를 전송할 때 많이 쓰인다.
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}]
}
파이썬의 dictionary 타입과 매우 유사한 구조를 가지고 있다. CSV파일에 비해 좀 더 유연하게 데이터를 표현할 수 있고 XML파일보다 파일을 쉽게 읽고 쓸 수 있다는 장점이 있다. 뿐만 아니라 Javascript로 작성된 프로그램에서 쉽게 다룰 수 있다.
JSON파싱
JSON 파일 저장
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("슝~")
JSON 파일 읽기
import json
with open("person.json", "r", encoding="utf-8") as f:
contents = json.load(f)
print(contents["first name"])
print(contents["education"])
Author And Source
이 문제에 관하여(AIFFEL(211229)_텍스트의 다양한 변신), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@mjk3136/AIFFEL-3일차211229파이썬-기본개념-이해저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)