본문 바로가기
GUI 프로젝트/저울 연결하기 (시리얼통신) (Tkinter)

[파이썬 저울 연결] 4. 문자열에서 무게만 추출하기

by 만다린망고 2022. 1. 7.
반응형

지난시간까지 저울의 현재 무게를 받아왔다. 

 

 

코드는 아래와 같다. 

 

import serial

ser = serial.Serial(port='COM8', baudrate=9600, bytesize=serial.EIGHTBITS,
                    parity=serial.PARITY_NONE, timeout=None)

res=ser.readline()

 

이번에는 숫자만 추출하여 결과를 표시해보려고 한다. while 문은 잠시 지우겠다. 아래 코드에서 시작하자. 

 

import serial
import re

ser = serial.Serial(port='COM8', baudrate=9600, bytesize=serial.EIGHTBITS,
                    parity=serial.PARITY_NONE, timeout=None)

res=ser.readline()

 

res 는 아래와 같다. 

 

>>> res
b'SUI       87.89 g  \r\n'

 

type 함수를 적용해보니 클래스가 바이트다. 

 

>>> type(res)
<class 'bytes'>

 

문자열로 바꿔줘야 문자열에 적용하는 함수들을 사용할 수 있어서, 일단 문자열로 바꿔주었다. 

 

res=str(res)

>>> res
"b'SUI       87.89 g  \\r\\n'"

 

re 패키지의 rindall 함수를 사용하여 숫자 부분만 추출해보려고 한다. re 패키지를 불러오고 아래와 같이 코드를 짜준다. 

 

import re

res=re.findall("\d+.\d+",res)

 

\d+ 는 숫자들을 의미하고 . 은 문자들을 의미한다. 따라서 \d+.\d+ 는 숫자들+문자들+숫자들 로 이루어진 부분을 추출하겠다는 말이다. 위 예시에서는 87.89 이다. 결과는 아래와 같다. 

 

>>> res  
['87.89']

 

리스트 안에 문자열이 있는 형태다. 숫자만 추출해보자. 먼저 리스트 인덱싱을 통해 문자열에만 접근한다. 

 

res=res[0]

>>> res
'87.89'

 

float 함수를 이용하여 실수로 변환해준다. 

 

res=float(res)

>>> res
87.89

 

결과는 아래와 같다. 

 

import serial
import re

ser = serial.Serial(port='COM8', baudrate=9600, bytesize=serial.EIGHTBITS,
                    parity=serial.PARITY_NONE, timeout=None)

#값 불러오기
res=ser.readline()
#문자열로 변환
res=str(res)
#숫자 부분 추출, 추출 결과는 ['숫자'] 형태
res=re.findall("\d+.\d+",res)
#문자열 추출
res=res[0]
#실수로 변환
res=float(res)

 

while 문 안에 넣어서 실시간 추출이 잘 되는지 해보자. 

 

import serial
import re

ser = serial.Serial(port='COM8', baudrate=9600, bytesize=serial.EIGHTBITS,
                    parity=serial.PARITY_NONE, timeout=None)

while(True):
    ser.close()
    ser.open()
    #값 불러오기
    res=ser.readline()
    #문자열로 변환
    res=str(res)
    #숫자 부분 추출, 추출 결과는 ['숫자'] 형태
    res=re.findall("\d+.\d+",res)
    #문자열 추출
    res=res[0]
    #실수로 변환
    res=float(res)
    print(res)

 

숫자만 잘 출력된다. 

 

 

반응형

댓글