티스토리 뷰

문자열 바꾸기

 

문자열에서 지정한 문자열을 찾아서 바꾸는 메서드로 replace()가 있다. 사용법은 다음과 같다.

 

str.replace(old, new[, count]) 

replace() 메서드는 문자열(str)에서 지정한 문자열(old)을 찾아서 새로운 문자열(new)로 바꾼다. 여기서 count는 문자열(str)에서 지정된 문자열을 찾아서 바구는 횟수입니다. 만약 횟수를 지정하지 않으면 문자열 전체에서 찾아서 바꿉니다. 다음 예제를 봅시다.

 

In:

 

 

str_a = 'Python is fast. Python is friendly. Python is open.'

print(str_a.replace('Python', 'IPython'))

print(str_a.replace('Python', 'IPython', 2))

Out:

 

IPython is fast. IPython is friendly. IPython is open.

IPython is fast. IPython is friendly. Python is open.

문자열에서 지정한 문자열을 찾아서 새로운 문자열로 바꾸는 것뿐만 아니라 특정 문자열을 삭제할 때도 replace() 메서드를 이용할 수 있다. 다음 예제는 문자열에서 '['와']'를 제거한다. replace() 메서드에는 문자열을 하나씩만 지정할 수 있으므로 '['와']'를 모두 제거하려면 replace() 메서드를 두 번 사용해야 한다.

 

In:

 

 

str_b = '[Python] [is] [fast]'

str_b1 = str_b.replace('[', '') # 문자열에서 '['를 제거

str_b2 = str_b1.replace(']', '') # 결과 문자열에서 다시 ']'를 제거

Out:

 

 

[Python] [is] [fast]

Python] is] fast]

Python is fast

문자열의 구성 확인하기

 

코드를 작성하다 보면 문자열이 숫자만으로 이뤄졌는지, 문자로만 이뤄졌는지 아니면 숫자와 문자가 모두 포함돼 있는지, 로마자 알파벳 대문자로만 이뤄졌는지, 소문자로만 이뤄졌는지 등 문자열의 구성을 알아야 할 때가 있다. 이를 위해 파이썬에서는 다음 표와 같은 메서드를 제공한다.

 

 메서드

설명 

사용 예 

isalpha() 

문자열이 숫자, 특수 문자, 공백이 아닌 문자로 구성돼 있을 때만 True, 그 밖에는 False로 반환 

str.isalpha() 

isdigit() 

문자열이 모두 숫자로 구성돼 있을 때만 True, 그 밖에는 False 반환 

str.isdigit() 

isalnum()

문자열이 특수 문자나 공백이 아닌 문자와 숫자로 구성돼 있을 때만 True, 그 밖에는 False 반환 

str.isalnum() 

isspace()

문자열이 모두 공백 문자로 구성돼 있을 때만 True, 그 밖에는 False 반환 

str.isspace() 

isupper() 

문자열이 모두 로마자 대문자로 구성돼 있을 때만 True, 그 밖에는 False 반환 

str.isupper() 

islower() 

문자열이 모두 로마자 소문자로 구성돼 있을 때만 True, 그 밖에는 False 반환 

str.islower() 

이어서 문자열 구성을 확인하기 위한 메서드의 활용 예를 살펴보자.

 

우선 문자열이 숫자, 특수 문자, 공백이 아닌 문자로 구성돼 있는지 검사하는 isalpha( ) 메서드의 사용법을 살펴보자.

 

In:

print('Python'.isalpha())       # 문자열에 공백, 특수 문자, 숫자가 없음

print('Ver. 3.x'.isalpha())       # 공백, 특수 문자, 숫자 중 하나가 있음

Out:

True

False

다음은 모든 문자가 숫자로 이뤄져 있는지를 검사하는 isdigit( ) 메서드의 사용 예이다.

 

In:

print('12345'.isdigit())         # 문자열이 모두 숫자로 구성됨

print('12345abc'.isdigit())     # 문자열이 숫자로만 구성되지 않음

Out:

True

False

다음은 문자열이 특수 문자나 공백이 아닌 문자와 숫자로 구성돼 있는지 검사하는 isalnum( ) 메서드의 예이다.

 

In:

print('abc1234'.isalnum())     # 특수 문자나 공백이 아닌 문자와 숫자로 구성됨

print('    abc1234'.isalnum()) # 문자열에 공백이 있음

Out:

True

False

다음은 문자열이 공백 문자로만 구성돼 있는지를 검사하는 isspace() 메서드의 예이다.

 

In:

 

print('   '.isspace())             # 문자열이 공백으로만 구성됨

print(' 1 '.isspace())             # 문자열에 공백 외에 다른 문자가 있음

Out:

 

True

False

다음은 문자열이 모두 로마자 알파벳 대문자로 구성돼 있는지, 소문자로 구성돼 있는지를 각각 알아보는 isupper()와 islower() 메서드의 사용 예이다.

 

In:

print('PYTHON'.isupper())    # 문자열이 모두 대문자로 구성됨

print('Python'.isupper())      # 문자열이 대문자와 소문자가 있음

print('python'.islower())       # 문자열이 모두 소문자로 구성됨

print('Python'.islower())       # 문자열에 대문자와 소문자가 있음

Out:

True

False

True

False

 

대소문자로 변경하기

 

문자열에서 로마자 알파벳을 모두 대문자나 소문자로 변경하는 lower( )와 upper( ) 메서드에 대해서 알아보겠다. 두 메서드의 사용법은 다음과 같다.

 

str. lower()

str. upper() 

lower( ) 메서드는 문자열(str)에서 로마자 알파벳의 모든 문자를 소문자로 바꾸고 upper( ) 메서드는 대문자로 바꾼다. 다음 예제를 보자

 

In:

string1 = 'Python is powerful. PYTHON IS EASY TO LEARN.'

print(string1.lower())

print(string1.upper())

Out:

python is powerful. python is easy to learn.

PYTHON IS POWERFUL. PYTHON IS EASY TO LEARN.

파이썬에서는 로마자 알파벳 대문자와 소문자를 구분하므로 같은 의미의 문자열을 비교하더라도 대소문자까지 같지 않으면 다른 문자열이다. 실제로 그런지 다음 코드로 살펴보자.

 

 

In:

'Python' = 'python'

Out:

False

'Python'과 'python'은 의미가 같은 문자열이지만 대소문자의 차이 때문에 다른 문자열로 인식한다. 이런 경우에 문자열을 모두 대문자나 소문자로 바꾼 후에 비교하면 같은 문자열이라고 인식할 것이다. 이제 lower()와 upper() 메서드를 이용해 문자열 비교를 다시 해 보자.

 

In:

print('Python'.lower() = 'python'.lower())

print('Python'.upper() = 'python'.upper())

Out:

True

True

예제에서는 문자열을 비교할 때 lower()와 upper() 메서드를 이용해 문자열을 모두 소문자 혹은 대문자로 변경한 후에 비교함으로써 대소문자 차이 때문에 다른 문자열로 인식하는 문제를 해결했다.

 

 

 

2. 텍스트 파일의 데이터를 읽고 처리하기

 

지금까지는 코드에 들어있는 데이터를 다루는 방법을 살펴봤다. 이번에는 데이터가 파일에 저장돼 있다고 가정하고 그 파일에서 데이터를 읽고 처리하는 방법을 알아보겠다. 파일의 데이터를 읽기 위해서는 6장에서 배운 파일 읽기 방법을 이용한다. 파일의 내용을 한 번에 읽어오는 것이 아니라 한 줄씩 읽어서 처리하겠다. 파일에서 읽은 내용은 문자열 데이터가 되는데 이 문자열 데이터를 원하는 형태로 분리하고 연산이 필요한 부분은 숫자 데이터로 변환한 후에 처리하는 방법을 살펴보겠다.

 

 

데이터 파일 준비 및 읽기

 

데이터가 저장된 텍스트 파일을 읽고 처리하기 위해 먼저 처리할 데이터와 원하는 직업을 다음과 같이 정의하겠다.

 

-데이터: 어느 커피 전문점에서 나흘 동안 기록한 메뉴별 커피 판매량

-원하는 작업: 나흘 동안 메뉴당 전체 판매량과 하루 평균 판매량 구하기

 

메뉴별 커피 판매량은 2장에서 생성한 작업 폴더의 안의 data 폴더('C:\myPycode\data')에 텍스트 파일('coffeeShopSalses.txt')로 저장돼 있다고 가정한다.

 

해당 폴더에 데이터가 저장된 텍스트 파일이 있는지 확인하기 위하여 다음과 같이 윈도우의 type 명령어를 이용해 파일의 내용을 출력하겠다. 앞에서도 설명했지만, IPython 콘솔이나 주피터 노트북에서는 '!명령어'로 운영체제 명령어를 수행할 수 있다.

 

In:

!type c:\myPycode\data\coffeeShopSales.txt

Out:

 

 

 

 

날짜     에스프레소      아메리카노     카페라테     카푸치노

10.15         10                 50               45             20

10.16         12                 45               41             18

10.17         11                 53               32             25

10.18         15                 49               38             22

출력 결과를 보면 텍스트 파일('coffeeShopSales.txt')의 첫 번째 줄에는 각 항목의 이름이 있고 두 번 째 줄 이후로는 각 항목의 값이 있다. 만약 해당 텍스트 파일이 없다면 'C:\myPyCode\data' 폴더에 'coffeeShopSales.txt' 파일을 만들고 위와 같이 내용을 입력한다.

 

우선 파일 읽는 방법을 이용해 텍스트 파일을 연 후에 한 줄씩 읽고 출력해 보겠다.

 

In:

# file_name = 'c:\myPycode\data\coffeeShopSales.txt'

file_name = 'c:/myPyCode/data/coffeeShopSales.txt'

 

f = open(file_name)      # 파일 열기

for line in f:                # 한 줄씩 읽기

    print(line, end=' ')    # 한 줄 씩 출력

f.close()                     # 파일 닫기

Out:

날짜     에스프레소      아메리카노     카페라테     카푸치노

10.15         10                 50               45             20

10.16         12                 45               41             18

10.17         11                 53               32             25

10.18         15                 49               38             22

위 코드에서 파일명을 경로와 함께 지정해 file_name 변수에 할당한 후 파일 열기로 해당 파일을 열고 한 줄씩 읽어서 line 변수에 할당하고 출력했다. line 변수에는 문자열 한 줄 전체가 들어가 있다.

 

 

파일에서 읽은 문자열 데이터 처리

 

파일에서 데이터를 읽어 왔으니 다음으로 읽어온 문자열 데이터를 처리해서 원하는 작업을 수행하는 방법을 알아보겠다. 우선 첫 번째 줄에 있는 항목 이름을 가져와 빈칸을 기준으로 나누고, 두 번째 줄 이후의 항목 값을 처리했다.

 

다음은 첫 번째 줄의 항목 이름을 가져오는 코드이다.

 

In:

 

 

 

 

f = open(file_name)   # 파일 열기

header = f.readline( ) # 데이터의 첫 번째 줄을 읽음

f.close( )                  # 파일 닫기

 

header

Out:

'날짜      에스프레소   아메리카노   카페라테   카푸치노\n'

파일의 첫 번째 줄을 읽었다. 첫 줄의 문자열을 분리해 리스트로 변환하려고 하는데 단어 사이에 공백과 개행문자가 보인다. 따라서 다음과 같이 인자 없이 split( ) 메서드를 호출해 첫 줄의 문자열에서 항목 이름을 분리해 리스트로 만든다.

 

In:

 

header_list = header.split( )  # 첫 줄의 문자열을 분리후 리스트로 변환

header_list

Out:

['날짜', '에스프레소', '아메리카노', '카페라테', '카푸치노']

파일의 첫 번째 줄에 있는 항목 이름을 리스트 변수인 header_list에 할당했다.

 

다음으로 for 문을 이용해 두 번째 줄부터 끝줄가지의 데이터를 앞에서와 같은 방법으로 문자열에서 공백과 개행문자를 제거하고 각 항목을 data_list에 넣는 코드를 추가한다.

 

In:

 

 

 

 

 

 

 

 

f = open(file_name)           # 파일 열기

header = f.readline( )         # 데이터의 첫 번째 줄을 읽음

header_list = header.split( ) # 첫 줄의 문자열을 분리한 후 리스트로 변환

 

for line in f:                     # 두 번째 줄부터 데이터를 읽어서 반복적으로 처리

    data_list = line.split( )    # 문자열을 분리해서 리스트로 변환

    print(data_list)              # 결과 확인을 위해 리스트 출력

 

f.close( )                         # 파일 닫기

Out:

 

 

 

['10.15', '10', '50', '45', '20']

['10.16', '12', '45', '41', '18']

['10.17', '11', '53', '32', '25']

['10.18', '15', '49', '38', '22']

위의 출력 결과를 보면 리스트 변수 data_list의 각 항목이 문자열로 돼 있다. 전체 판매량과 평균을 계산하려면 일일 판매량 데이터 문자열은 숫자로 바꿔야 한다. 앞에서 배운 int( )나 float( )을 이용하면 문자열 타입의 데이터를 정수나 실수 타입으로 반환할 수 있다. 여기서는 판매량 데이터가 정수인 것을 이미 알고 있으므로 int( )를 이용해 판매량 데이터를 숫자로 변환할 것이다. 또한 커피 종류별로 생성한 빈 리스트에 항목을 추가하는 append( )를 이용해 커피 종류별로 판매량 데이터를 분류해서 넣겠다.

 

다음은 지금까지 설명항 내용을 구현한 코드 이다.

 

In:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

f = open(file_name)           # 파일 열기

header = f.readline( )         # 데이터의 첫 번째 줄을 읽음

header_list = header.split( ) # 첫 줄의 문자열을 분리한 후 리스트로 변환

 

espresso = [ ]                  # 커피 종류별로 빈 리스트 생성

americano = [ ]

cafelatte = [ ]

cappucino = [ ]

 

for line in f:                     # 두 번째 줄부터 데이터를 읽어서 반복적으로 처리

    data_list = line.split( )    # 문자열을 분리해서 리스트로 변환

 

    # 커피 종류별로 정수로 변환한 후, 리스트의 항목으로 추가

    espresso.append(int(dataList[1]))

    americano.append(int(dataList[2]))

    cafelatte.append(int(dataList[3]))

    cappucino.append(int(dataList[4]))

 

 

f.close( )                         # 파일 닫기

 

print("{0}: {1}'.format(headerList[1], espresso))  #변수에 할당된 값을 출력

print("{0}: {1}'.format(headerList[1], americano))

print("{0}: {1}'.format(headerList[1], cafelatte))

print("{0}: {1}'.format(headerList[1], cappucino))

Out:

 

 

 

에스프레소: [10, 12, 11, 15]

아메리카노: [50, 45, 53, 49]

카페라테: [45, 41, 32, 38]

카푸치노: [20, 18, 25, 22]

이번에는 리스트를 이용해 나흘간 메뉴별 전체 판매량과 하루 평균 판매량을 구해보겠다. 이를 위해 리스트, 튜플, 세트 데이터에서 항목의 합을 구하는 내장함수 sum( )과 항목의 개수(길이)를 구하는 내장 함수 lend( )을 이용했다.

 

In:

 

 

 

 

 

 

total_sum = [sum(espresso), sum(americano), sum(cafelatte), sum(cappucino)]

total_mean = [sum(espresso)/len(espresso), sum(americano)/lend(americano/, sum(cafelatte)/len(cafelatte), sum(cappucino)/len(cappucino)]

 

for k in range(lend(total_sum)):

    print('[{0}] 판매량'.format(headerList[k+1]))

    print('- 나흘 전체: {0}, 하루 평균: {1}'.format(total_sum[k], total_mean[k]))

Out:

 

 

 

 

 

 

 

[에스프레소] 판매량

- 나흘 전체: 48, 하루 평균: 12.0

[아메리카노] 판매량

- 나흘 전체: 197, 하루 평균: 49.25

[카페라테] 판매량

- 나흘 전체: 156, 하루 평균: 39.0

[카푸치노] 판매량

-나흘 전체: 85, 하루 평균: 21.25 

지금까지 날자별로 커피 판매량 데이터가 저장된 텍스트 파일에서 메뉴별로 판매량 데이터를 읽어와서 숫자로 변환한 후 리스트의 함과 길이를 구하는 내장 함수를 이용해 메뉴별 전체 판매량과 평균 판매량을 구했다. 이번 예제 코드는 앞에서 살펴본 다른 코드에 비해 코드가 조금 길어서 이해하기 힘들었을 수도 있다. 하지만 지금까지 배운 내용을 바탕으로 코드를 작성한 것이니 배운 내용을 다시 한번 차근차근 살펴보면 코드를 충분히 이해할 수 있을 것이다.

 

이번 장에서 학습한 문자열 처리 방법은 파일에서 읽어온 데이터를 처리할 때 많이 이용한다.

 

 

 

 

출처: 파이썬 철저 입문

 


'beginner > 파이썬 분석' 카테고리의 다른 글

데이터 분석을 위한 패키지-pandas ①  (0) 2019.01.16
모듈  (0) 2019.01.15
문자열과 텍스트 파일 데이터 다루기 ①  (0) 2019.01.14
객체와 클래스 ②  (0) 2019.01.14
객체와 클래스 ①  (0) 2019.01.14
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함