반응형

개요

 문자열은 최소한 문자 한개 이상이 보여 있는 것을 의미한다. 물론 프로그래밍 언어에서는 열(array)형태의 자료형 안에 한 글자라도 들어 있어도 문자열로 취급한다. 문장의 개념과 혼동이 가능하겠으나 문장의 단위는 인간의 언어에서 구분하는 기준이고, 문자열은 여러 문장도 담을 수 있기 때문에 좀 더 다른 개념으로 이해하는 것이 좋다.

 컴퓨터를 사용한 이후 오랜 시간 동안 프로그래머들은 경험상 문자 기준으로 글자를 다루는 것 보다 문자열 단위로 다루는 것이 편리 하다는 것을 알게 되었다. 이러한 흔적으로 C 같은 오래된 언어에는 문자열을 다루는 기본 자료형이 없다. 문자열은 기본적으로 순서가 있는 문자들을 다루기 때문에 파이썬의 리스트 자료형과 비슷한 특징을 가지고 있다.

(해당 예제들은 IDLE Shell 혹은 python shell 에서 실행하는 것이 편하다)

문자열 정의

 문자열을 정의 하는 방법은 쌍따옴표로 시작해서 쌍따옴표로 끝나거나 따옴표로 시작해서 따옴표로 끝나면 된다. 쌍따옴표로 시작한 문자열 내에서의 따옴표는 단순한 문자 기호로 인식이 되며, 반대로 따옴표로 시작한 문자열 내에서 쌍따옴표는 문자 기호로 인식된다.

 만약 쌍따옴표 내에서 쌍따옴표를 문자 기호로 인식을 시키기 위해서는 앞에 역 슬래스(혹은 한국원화 기호)를 해주면 된다. 이는 쌍따옴표로 시작한 문자열 중간에 쌍따옴표를 그냥 넣게 되면, 앞에서 정의한 문자열 문법에 의해서 해당 위치까지 문자열이 끝나는 것으로 인식 되기 때문이다.

"min: hello"
'han: hello'
# 둘다 동일한 문자열

"min: 'hello'"
# 따옴표는 문자 기호로 인식됨

'han: "hello"'
# 쌍따옴표는 문자 기호로 인식됨

"min: \"hello\""
# 문자열 내에서 \기호 뒤에 있는 따옴표는 문자 기호로 인식됨

역슬래시 특수문자

 문자열 내에서 특정한 기호를 사용하기 위해서는 역슬러시를 사용하여 표현할 수 있다. 앞의 쌍따옴표나 따옴표의 경우 상황에 따라서 특수문자로 사용된 경우이다.

 즉, 줄바꿈, 탭, 앞줄 부터 시작을 표시하는 특수기호가 존재한다. 이러한 특수 문자를 표현할 경우 '\'(역슬러시)를 사용하여 표현한다. 이러한 표기법은 오래전부터 사용되었기 때문에 다른 프로그래밍 언어에서도 비슷하게 사용된다.

string 표기 이름 의미
\n 개행문자(Line Feed) 한줄 아래로 이동
\t 탭(tab) 탭키를 누른 것 만큼 이동
(일반적인 탭은 7, 8칸을 뛴 것과 같다)
\r 개행문자
(Carriage Return)
커서(글자를 쓰는 칸)를 현재 줄 앞으로 이동(윈도우즈 내부에서 사용함)
\' 작은 따옴표 작은 따옴표 표기
\" 큰 따옴표 혹은 쌍따옴표 큰 따옴표 표기
\\ 역 슬러시 역슬러시 표기

 여담으로 윈도우즈에서는 파일 경로를 표기하기 위한 구분자로 역슬러시를 사용하다 보니 해당 경로를 문자열로 받게 될 경우 역 슬래시가 2번 표기되는 것을 볼 수 있다. 하지만, 실제로 print() 로 화면에 출력하거나 파일로 저장할 경우에는 하나만 보이게 된다.

Formatter

 초기 프로그램들이 사람과 소통하는 가장 간단한 방법은 문자열을 화면에 보여주는 것이다. 특히 세금 계산서나 은행에서 사용하는 공문서들은 형식(Format)이 정해진 경우가 많다. 이처럼 형태가 정해진 문자열을 다룰 경우 많이 사용되는 방식이다.

 기본적으로 포맷 형식에는 샘플이 되는 문장이 있고 이를 어떻게 처리하느냐는 이후 문법 방식에 따라서 다르다.

%

 파이썬에서 가장 초기에 사용되던 방식이다. C 의 printf() 함수의 방식과 비슷하여 printf 방식 포멧팅이라고도 한다. python 2 에서 주로 사용된 방식으로 오래된 소스코드를 보면 쉽게 볼 수 있다. 샘플이 되는 문장에 변형이 가능한 자리에는 %d, %f, %s 와 같은 미리 정의 되어 있는 특수문자를 넣고 해당되는 값에 순서대로 넣는 것이 가능하다.

a = "%s님의 잔액은 %d원 입니다.\n이자율 %f\%" % ("오리", 101, 3.3)
print(a)
# 오리님의 잔액은 101원 입니다
# 이자율 3.300000100%

실수인 숫자의 경우 자리수를 제한 해야하는 경우에는 자리수에 해당하는 값도 추가 해줘야 한다.

a = "%s님의 잔액은 %d원 입니다.\n이자율 %.2f\%" % ("오리", 101, 3.3)
print(a)
# 오리님의 잔액은 101원 입니다
# 이자율 3.30%

format()

 권장하는 방식 중 하나이다. str 형에는 내부에 format() 함수가 들어 있어 해당 함수를 호출하여 문자열 내에 들어간 변수를 넣어주면 된다. 순서를 명시해 줄 수 도 있고 안해 줄 수도 있다.

 가장 많은 고민이 들어간 문법이기 때문에 공식 문서에서 내용이 방대한 편이다.

a = "{}님의 잔액은 {}원 입니다.\n이자율 {}%".format("오리", 101, 3.3)
print(a)
# 오리님의 잔액은 101원 입니다
# 이자율 3.30000001%
b = "{1}님의 잔액은 {0}원 입니다.\n이자율 {2}%"
b = b.format(101, "오리", 3.3)
print(b)
# 오리님의 잔액은 101원 입니다
# 이자율 3.3%

f-string

 python 3.6 부터 지원한 방식이다. 직관적인 편이기 때문에 권장하고 있다. 문자열의 시작전 f로 시작하여 중괄호 안에 변수가 되는 값 혹은 수식을 직접 삽입할 수 있다.

a1 = "오리"
a2 = 101
a3 = 3.3
a = f"{a1}님의 잔액은 {a2}원 입니다.\n이자율 {a3}%"
print(a)
# 오리님의 잔액은 101원 입니다
# 이자율 3.30000001%

 포멧이 되는 표현식(expression)의 경우 키워드가 아닌 중괄호를 표현하고 싶은 경우 중복해서 사용하면 기호로 인식된다.

이렇게 포멧 문자를 간단히 확인했는데, 자신이 초급 이상으로 좀 더 자세한 것을 알기 위해서는 공식문서를 확인해보면 된다.

문자열과 연산

문자열을 편의상 string 혹은 str로 표현을 한다.

str + str

 문자열과 문자열을 더 할 수 있다. 이 경우 두 문자열이 합쳐진 하나의 문자열이 된다.

a = "ba"
b = "poo"

c = a + b
# c == "bapoo"

str += str

 연산자의 좌측 문자열과 우측 문자열을 합친다음에 왼쪽 변수에 대입을 한다.

a = "hello"
b = "world"
a += b
a
# "helloworld"

str * int

문자열에 숫자를 곱한 경우 해당 문자열을 반복해서 더한다.

a = "-" * 8
a
# "--------"

str *= int

연산자의 좌측 문자에 우측 숫자만큼 반복한 문자열로 대입한다.

a = "-"
a *= 8
a
# --------

 

문자열 함수

문자열에 사용이 가능한 내장형 함수이다. 함수에 대한 설명은 이후 함수 항목에서 설명한다.

str()

숫자 타임의 int, float ㅎ여태로 자료형을 문자열로 변환 해준다.

a = 10
b = str(a)
b
# "10"

len()

문자열이 들어 잇는 문자열의 길이를 반환한다. 공백이나 줄 바꿈 문자도 하나의 문자로 인식한다. 문자열 뿐만 아니라 길이가 있는 list 형에서도 사용이 가능하다. 다만, list 자료형에 대해서는 나중에 다룬다.

a = "hello"
len(a)
# 5

b = "안녕"
len(b)
# 2

주의할 점

문자의 경우 이전에 공부한 문자 code 에 의해서 문자 종류에 따라서 한 문자를 저장하는 바이트 크기가 다르다. 즉, 문자열이 차지는 하는 메모리 용량과 문자의 길이는 다른 개념임을 인지해야 한다. 그리고 임베디드 같은 저수준 프로그래밍 하는 환경에서는 적은 메모리를 사용해야 하는 경우가 있기 때문에 이에 대해서도 주의 해야 한다. Python 에서 문자열이 차지하는 바이트 크기를 알기 위해서는 문자열을 bytes로 형변환을 하여 len() 함수를 사용하면 된다.

 

반응형

'Python > 배경이 있는 파이썬' 카테고리의 다른 글

튜플(Tuple)  (1) 2024.04.27
리스트(list)  (0) 2024.04.27
문자 code  (0) 2024.04.24
숫자형(int, float)  (0) 2024.04.24
변수(variable)와 상수(constant)  (0) 2024.04.23
반응형

datetime, timestamp, str 변환

배경

 어쩌다보니 플라스크를 이용해서 서버관련된 개발을 하게 되었다. 원래 도쿠 위키에 정리를 해놓은 문서이지만, 다시 블로그에 올리는게 나을 것 같아 정리를 한다.

 서버쪽에서 데이터를 수집 및 표시를 할 때 시간에 대해서 자주 다룬다. 특히 실시간으로 뭔가를 처리해야 할 경우나 데이터를 처리하는 경우 더 더욱 자주 사용한다. 참고로 하드웨어 쪽 펌웨어의 timestamp와 서버에서 말하는 timestamp 간 차이가 있으니 주의해서 이해를 해야 오해가 없다.

 

datetime 관리 팁

 서버에서 timestamp의 의미는 unix timestamp로 1초는 1의 값이 된다.

 

 파이썬에서는 내장모듈인 datetime을 중심으로 코드를 작성하는 것이 좀 더 단순한 구조가 된다. 이는 내장 모듈이기 때문에 어지간하면 ORM 모듈에서 지원을 하기 때문이다.

1. datetime now

from datetime import datetime

datetime.now()
# datetime instance now

 

2. datetime to timestamp

from datetime import datetime

timestamp = datetime.now().timestamp()

 

3. datetime to str

from datetime import datetime

datetimeStr = datetime.now().strftime("%Y-%m-%d %H:%M:%S.%L")
# ex) 2021-06-07 14:57:01.113000

 

4. timestamp to datetime

from datetime import datetime

timestamp = datetime.now().timestamp()
dt = datetime.fromtimestamp(timestamp)

 

5. str to datetime

from datetime import datetime

datetimeStr = "2021-06-07 14:58:01.11100"
dt = datetime.strptime(datetimeStr, "%Y-%m-%d %H:%M:%S.%L")

 

참조 자료

(추후 추가)

반응형
반응형

Python3 str(문자열)의 편리한 기능들

작성 계기

C/C++을 사용하던 시작부터 프로그래머들 사이에서 유행한 말이 있었는데, 그것은 문자열 처리를 잘하는 프로그래머는 웬만한 프로그램을 거의다 해결할 수 있다는 말이었다. (하지만 영상처리를 해보면 어떨까?) 역시 기본에서 다루는 내용보다는 필자가 실제 프로그램을 작성하면서 유용했던 기능들 중심으로 정리를 한다.

str 자료형에 대해

C++ STL에서는 string 이라는 표준 클래스가 존재한다. 마찬가지로 python에서는 str 이라는 자료구조가 있다. 문장을 구성할때 문자 여러개가 모여서 구성을 하는 것이다. C/C++ 시절에는 사실상 문자의 배열로 운영이 되었기 때문에 사실 다루기 상당히 까다롭다. 하지만 수십년간의 프로그래머들의 경험에 의해서 문자 하나보다는 문장단위로 다루는 일이 많은 것을 겪어왔다. 그래서, C#, javascript, python 도 대부분 string 혹은 str 형을 기본적으로 제공하고 있다.

기본적으로 list 자료형과 비슷하지만 다르다. 이는 문자열을 다룰 필요한 메서드와 list 같은 배열형 자료를 다룰때 필요한 메서드에서 차이가 있기 때문이다. 사실 str의 경우 대부분 언어들에서는 비슷하게 지원을 해서 꼭 Python 만의 특징이라고 보기는 어렵다.

python str 자료형의 특징

문자열 비교

C/C++을 주로 사용한 사람이라면은 == 연산을 문자열에 바로 사용을 하면 기겁을 하게 될 것이다. 하지만, Python의 str 자료형은 사용해도 큰 문제가 없다. 이 기능이 워낙 강력하다 보니 오히려 enum 이라는 자료형을 잘 사용하지 않게 된다. python3에서 enum 자료형이 등장하게 된것은 3.5 버전 부터이고, 사용방법도 enum 내장 모듈을 class로 상속해서 사용을 하여 enum을 만들어서 사용하는 것 보다 문자열을 사용하는 것이 나을 수 도 있다. 하지만 IDLE의 인텔리전트 기능을 사용하기 위해서라면 enum을 사용하는 것이 더 편리하고 안전할 것이다.

예시)

'hello' == 'hello'
# True
'hello' == 'world'
# False

split() 특정 문자로 나누기

사실 문자열에서 특정 문자나 기호를 기준으로 정보를 나누는 것은 문자열을 다룰때 많이 다루게 된다. 대부분 프로그램들이 최소한 데이터를 다룰때 DBMA를 사용하지 않는 경우 바로 직접 파일을 다루는데, 이 때에 각 운영체제에서 파일의 경로를 '' 이나 '/' 을 사용하기 때문이다. 물론 현재는 크로스 플랫폼 이슈로 인해서 대부분 언어들은 파일경로를 다루는 모듈이 있다(C++의 경우 C++17부터 있다).
특정 문자로 나누는 메서드는 split()메서드이며, 첫번째 인자로 받은 문자을 기준으로 리스트형에 나눈 문자열들을 담아서 반환을 한다. 두번째 인자로 숫자가 들어갈 경우 입력받은 숫자만큼 첫번째로 입력 받은 문자열로 리스트에 나누어서 담은뒤 반환을 한다. 이 메서드는 웬만한 문자열을 다루는 프로그래밍 언어들에서 공통적으로 거의 있다.

예시)

'c\python3\hello'.split('\\')
# ['c', 'python3', 'hello']
'c\python3\hello'.split('\\', 1)
# ['c', 'python3\hello']

strip() 문자열의 양쪽에 특정 문자 제거

약간의 규모가 있는 프로그램을 작성하다 보면 설정값을 파일에 저장을 하고 이를 읽어서 사용하는 경우가 있는데, 이 경우 이 설정값이 있는 파일을 프로그램을 통해서만 건들면 되는데, 간혹 프로젝트 사정상 사용자가 옵션 파일을 건들여야 하는 경우가 있다. 특히 공백을 기준으로 문자열을 나누다 보면은 앞쪽이나 뒷쪽에 공백문이 저장되어 있는 경우가 발생된다. 이 경우 split() 메서드를 바로 사용하게 되면, 공백수 만큼 리스트의 길이가 생성된 것을 볼 수 있다.

물론 이를 제거하는 알고리즘을 구현하면 되지만 이런 경우가 생각보다 많다 보니 Python 에서는 아예 이러한 메서드를 제공한다. 단순히 strip()를 호출하면 문자열의 양끝단의 공백문을 제거하고 인자를 넣을 경우 해당 인자가 양끝에 있는 경우를 제거한다.

예시)

' hello world   '.strip()
# 'hello world'
'c:\python\hello\\'.strip('\\')
# 'c:\\python\\hello'

join() 문자열이 모인 리스트를 한 문자열로 만들기

split()과 반대 개념의 메서드로 join()을 호출한 문자열을 인자로 받는 리스트의 문자열들의 사이 사이에 넣어서 하나의 문자열을 반환을 한다. 여기서 사용되는 리스트의 원소는 모두다 str 자료형이어야 하는 제약이 있다(만약 이를 무시하면 에러메시지를 발생하면 죽는 프로그램을 볼 수 있다).

필자의 경우 파일에서 ','로 구분하는 문자열을 만들어야 할 때 많이 사용하였었다. 프로그램에서는 리스트에 숫치값을 넣어서 사용하다가 저장할때는 숫자가 아닌 문자열로 변환해서 저장하는 경우에 유용했다.

예시)

a = ['1', '2', '3', '4', '5']
aStr = ', '.join(a)
# aStr = '1, 2, 3, 4, 5'

보너스: 숫자 있는 리스트를 문자열형 리스트로 바꾸기

어떤 수치 데이터를 문자열로 변환하는 작업은 단순 반복 작업이다. 다행히 python에서는 이러한 단순 반복 작업을 간단하게 코드로 작성할 수 있는 문법적 특성이 존재한다.

예시)

a = [1, 2, 3, 4, 5]
aStrList = [str(it) for it in a]
# aStrList = ['1', '2', '3', '4', '5']

이렇게 join 메서드를 조합하면 단 2줄로 수치가 들어 있는 리스트를 하나의 문자열로 변환하는 것이 가능해진다.

문자열의 곱연산

리스트와 같은 기능으로 문자열로 곱연산이 가능하다. 콘솔용 프로그램을 만들 경우 구분 선을 사용할때 쉽게 사용하기도 한다.

예시)

a = '-'*80
# a = '--------------------------------------------------------------------------------'

format() 문자열 포맷

C 언어를 먼저 배울경우 printf() 함수를 써본적이 있을 것이다. 여기서 f의 의미는 format 이라는 의미이다. 실제로 문자열을 다루다 보면은 포멧이 있는 문자열을 작성하는 경우가 많다. 따라서 python도 str 자료형 자체에 format() 메서드를 지원한다. 다만, 이 메서드는 생긴지 얼마 안되었기 때문에 오래전에 구매한 기본서라면 format() 대신 % 기호를 이용해서 같은 비슷한 기능 사용할 수 있다. 하지만 가독성등 여러 이유로 가능하면 format() 메서드를 사용하기를 권장한다.

필자의 경우 프로그램에서 로그를 따로 저장할 경우 저장할 문자열 생성시 사용하기에 용이 했었다.

예시)

talk1 = 'hello, {}!'.format('lemi')
# talk1 = 'hello, lemi!'

in 포함 문자열 여부

C#의 contain()과 같은 역할을 하는 메서드로 문법상 굉장히 직관적이다. 예시로 이해하는 것이 매우 직관적이다.

예시)

'h' in 'hello'
# True
' ' in 'hello'
# False

find() 문자열 찾기

다른 프로그래밍 언어들에게 공통적으로 있는 것으로 처음으로 같은 문자열이 있는 index를 number(int)형으로 반환을 한다. 만약 없을 경우 -1을 반환한다. 인자는 단일 문자 혹은 문자열 전부 사용할 수 있다. 이 메서드로 특정 문자열 포함 여부도 확인이 가능하기 때문에 in 문법을 모를 경우 사용하게 된다.

하지만, find()로 포함 여부를 할 경우 이 의도를 주석으로 기록해주어야 하지만, 앞의 in의 문법을 사용하면 굳이 주석 없이 코드만으로 의도를 파악할 수 있으므로 포함 여부만 확인 할경우 find()보다는 in을 사용하는 것이 더 좋다.

예시)

index = 'hello'.find('l')
# index = 2
index = 'hello'.find(' ')
# index = -1

upper(), lower() 대소문자 변환

호출한 문자열을 upper()의 경우 대문자로 lower()는 소문자로 전부 변환하여 반환한다. 많이 쓰이는 기능은 아니지만, 검색 기능을 구현할 경우 대소문자 구분을 안 할 경우 사용시 편리하다. 그중에서도 가능하면 lower()를 많이 사용하는 편이다.

예시)

lowStr = 'hello'
upStr = lowStr.upper()
# lowStr = 'hello'
# upStr = 'HELLO'

기타 문자열을 다루는 더 강력한 방법

문자열로 부터 특정한 패턴의 의미있는 자료를 얻기 위해서는 정규표현식을 사용하는 것이 가장 효과적이다. 다만, 정규식을 사용하기 전에 간단한 문자열을 전처리과정으로 정리할 경우에는 가능하면 문자열에서 제공하는 메서드를 활용하는 것이 좋다.

반응형

'Python > Python3' 카테고리의 다른 글

[Python3]삼항연산자(Ternary operators)  (0) 2019.04.30
[python3]타입검사(Type Check)  (0) 2019.04.23
[Python3]List의 편리한 기능들  (0) 2019.04.19
[python]CSV 데이터 포멧 입출력  (0) 2018.10.22
[python]기본 Shell 활용  (0) 2018.10.20

+ Recent posts