텍스트 데이터의 문자열 저장
파일, 디렉터리
포맷 파일
'
, "
로 묶인 문자들🚨 주의 : UTF-8, UFT-16 등은 유니코드로 정의한 텍스트를 메모리에 인코딩하는 방식!
ord()
: 해당 문자의 유니코드 숫자 반환chr()
: 해당 유니 코드 숫자의 문자 반환print(ord('a'))
print(ord('A'))
print(chr(97))
print(ord('가'))
print(chr(0xAC00)) #16진수 표현
Q. 유니코드 테이블에서의 '가' 코드값은?
A. U+AC00
기억해야 할 것
- python 2 : 인코딩 후에도 ascii ➡️ unicode 변환 등 작업 필요
- python 3 : 문자열에 유니코드로 인코딩됨 ➡️ 텍스트의 인코딩 or 디코딩 여부 확인만 하면 됨
s = 'I don't like Python!'
➡️ 반드시 작은따옴표만 사용해서 SyntaxError를 해결해야 한다면?
'
, "
, 줄바꿈
등 특수문자를 포함하되, 이 특수문자가 특수문자가 아닌 것처럼 처리할 떄 사용\[특정 문자]
이스케이프 문자 | 출력 |
---|---|
\' | 홑따옴표 ' |
\" | 겹따옴표 " |
\t | 탭 |
\n | 줄바꿈 |
\ | 백슬래시 \ |
print(r'Please don\'t touch it')
startswith
# OB로 시작하는 직원 ID
EmployeeID = ['OB94382', 'OW34723', 'OB32308', 'OB83461',
'OB74830', 'OW37402', 'OW11235', 'OB82345']
Production_Employee = [P for P in EmployeeID if P.startswith('OB')]
Production_Employee
endswith
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)
['image10.png', 'image13.png', 'image14.png', 'image2.png', 'image12.png', 'image8.png', 'image1.png', 'image7.png', 'image11.png', 'image3.png', 'image4.png', 'image6.png', 'image5.png', 'image9.png']
strip()
: 양쪽 공백 제거lstrip()
: 왼쪽 공백 제거rstrip()
: 오른쪽 공백 제거txt = " Strip white spaces. "
print('[{}]'.format(txt))
print('--------------------------')
print('[{}]'.format(txt.strip()))
print('--------------------------')
print('[{}]'.format(txt.lstrip()))
print('--------------------------')
print('[{}]'.format(txt.rstrip()))
upper()
: 대문자 변환lower()
: 소문자 변환capitalize()
: 첫 글자만 대문자로boolean 값 반환
isupper()
islower()
istitle()
isalpha()
isalnum()
isdecimal()
"구분자".join(stages)
,
replace(s1, s2)
: s1을 s2로 바꾼다는 의미id() 메서드
- 객체의 고유 id 확인
Q. 두 개의 id(sent) 값이 다른 이유?
sent = 'I fell into AIFFEL' print(sent) print(id(sent)) sent = sent.upper() print(sent) print(id(sent))
A. string은 불변 객체이기 때문에, 변수가 새로운 객체로 대체되었기 때문
import re
Compile()
)re.compile("[문자열]")
re.findall()
로 바로 처리 가능search()
: 일치하는 패턴 찾음match()
: 처음부터 패턴이 검색하려는 대상과 일치해야함findall()
: 일치하는 모든 패턴 찾음split()
: 패턴으로 나눔sub()
: 일치 패턴으로 대체group()
: 실제 결과 문자열 반환src = "My name is..."
regex = re.match("My", src)
print(regex)
if regex:
print(regex.group())
else:
print("No!")
패턴 | 설명 |
---|---|
[ ] | 문자 클래스 - 대괄호 안에 있는 문자 중 하나 |
- | 범위 지정 |
. | 임의의 한 문자 |
? | 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 | 공백 문자 (스페이스, 탭, 개행 등) |
\S | 비공백 문자 ([^ \t\n\r\f\v]) |
\b | 단어 경계 |
\B | 비 단어 경계 |
\t | 가로 탭 (tab) |
\v | 세로 탭 (vertical tab) |
\f | 폼 피드 (페이지 구분 문자) |
\n | 개행 문자 (newline) |
\r | 캐리지 리턴 (줄의 시작으로 이동, Windows에서는 \r\n 조합으로 사용) |
예시1 : 1000년 이후의 모든 연도를 찾고 싶다면?
re.compile("[1-2]\d\d\d")
예시2 : 이메일
re.compile("[0-9a-zA-Z]+@[0-9a-z]+\.[0-9a-z]+")
[0-9a-zA-Z]+
: 숫자 0~9, 알파벳 대소문자(0-9a-zA-Z) 여러 차례(+) 나옴[0-9a-z]+
: 숫자 0~9, 알파벳 소문자 여러 차례f = open("hello.txt","w")
for i in range(10):
f.write("안녕")
f.close()
print("완료!")
hello.txt
읽어들이기with open("hello.txt", "r") as f:
print(f.read())
f.read()
: 파일 읽기f.readline()
: 1줄씩 읽기f.readlines()
: 모든 줄 읽기 -> 값을 리스트로 반환f.write(str)
: 입력(문자열 타입을 인자로 받음)f.writelines(str)
: 인자를 1줄씩 작성f.close()
: 파일 닫음f.seek(offset)
: 파일 위치 찾아서 커서 옮기기(처음 위치는 0)f.tell()
: 현재 커서 위치 반환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()}')
루트 디렉터리(root directory)
C:\
/
모듈(module)
: 파이썬 코드 파일(.py)패키지(package)
: 라이브러리, 모듈 집합(폴더)라이브러리(library)
: 모듈, 패키지 집합PIP(Package Installer for Python)
: 패키지 관리 도구PyPA(Python Packaging Authority)
: 파이썬 패키지 관리 및 유지 그룹PyPI(The Python Package Index)
: 파이썬 패키지 저장소sys.path
: 현재 폴더, 파이썬 모듈 저장 위치 ➡️ 리스트로 반환sys.path.append()
: 모듈 경로 추가os.chdir()
: 디렉터리 위치 변경os.getcwd()
: 현재 디렉터리 위치 반환os.mkdir()
: 디렉터리 생성os.rmdir()
: 디렉터리 삭제(디렉터리 삭제는 그 안이 비어있을 때에만 가능)glob.glob()
: 그 경로 안 디렉터리 or 파일 ➡️ 리스트로 반환os.path.join()
: path 병합 ➡️ 새 경로 생성os.listdir()
: 디렉터리 안 파일, 서브 디렉터리 ➡️ 리스트로 반환os.path.exists()
: 파일 or 디렉터리 경로 존재 여부 확인os.path.isfile()
: 파일 경로 존재 여부 확인os.path.isdir()
: 디렉터리 경로 존재 여부 확인os.path.getsize()
: 파일 크기 확인to_csv
: csv 파일로 저장 가능
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("완료")
read_csv
: csv 파일을 DataFrame으로 변환
<>
(태그)로 구분<열린 태그> 내용 </닫힌 태그>
로 구성ElementTree
Element()
: 태그 생성SubElement()
: 자식 태그 생성tag
: 태그 이름text
: 텍스트 내용 생성attrib
: 속성 생성dump()
write()
: XML 파일로 저장append()
, insert()
, remove()
, pop()
: 리스트(list)와 메서드 유사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)
attrib
, tag
person.attrib["id"] = "0x0001"
name.tag = "firstname"
ET.dump(person)
.insert
lastname = ET.Element('lastname', date='2020-03-20')
lastname.text = '아'
person.insert(1,lastname)
ET.dump(person)
remove()
or pop()
- remove() : 리스트 요소 제거 시 값으로 제거
- pop() : 리스트 요소 제거 시 인덱스로 제거
파싱 : 문자열을 의미있는 토큰으로 분해, 문법적 의미 및 구조 반영한 parse tree 생성
- 이미지 출처 : XML의 파싱 - 파스 트리
# 클라우드 환경 : 심볼릭 링크 걸어서 aiffel 폴더로 가져오기
$ mkdir -p ~/aiffel/ftext/data/
$ ln -s ~/data/books.xml ~/aiffel/ftext/data
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')
for title in soup.find_all('title'):
print(title.get_text())
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}]
}
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)
import json
with open("person.json", "r", encoding="utf-8") as f:
contents = json.load(f)
print(contents["first name"])
print(contents["education"])
Yuna
[{'degree': 'B.S degree', 'university': 'Daehan university', 'major': 'mechanical engineering', 'graduated year': 2010}]