반응형

안녕하세요.

 

제가 통신 전공으로 프로토콜 등도 중요하지만 정확한 센서 데이터 수집하는 것도 굉장히 중요하다고 요즘 느낍니다.

 

정확한 데이터를 기반으로 머신러닝, 딥러닝, 필터링이 가능하기 때문에 정확한 데이터를 모으는 것은 가장 중요합니다. 

 

UART Serial 통신(9600, 115200bps)을 통해 가장 심플한 CSV형식이 현재 구글에서 가장 돌고 있습니다. 

 

매번 데이터  수집을 위해 데이터 짜는 것이 귀찮기 때문에 저를 위해 메모장 느낌으로 코딩을 기록했습니다. 

 

파이썬 공식 문서를 보면 쉽게 알 수 있지만, 번역기에 돌린 한국말이 약간 이상합니다. 

https://docs.python.org/ko/3/library/csv.html

 

csv — CSV 파일 읽기와 쓰기 — Python 3.9.7 문서

소위 CSV (Comma Separated Values – 쉼표로 구분된 값) 형식은 스프레드시트와 데이터베이스에 대한 가장 일반적인 가져오기 및 내보내기 형식입니다. CSV 형식은 RFC 4180에서 표준화된 방식으로 형식을

docs.python.org

 

import os

path_ = './data/test.csv'
fieldnames = ['device_name','f_port', 'ucnt', 'dr', 'rssi', 'snr', 'channel', 'lat', 'long_', 'alt']


if __name__ == '__main__':
	file_exists = os.path.isfile(path_)
	
    while(1):
    """
    Do something ex) serial.read, post, parsing...
    """
        with open(file_name, 'a', newline='\n') as csvfile:
            wr = csv.DictWriter(csvfile, delimiter=',', fieldnames=fieldnames)
            if not file_exists: wr.writeheader()
            wr.writerow({
                'device_name' :device_name,
                'f_port':f_port,
                'ucnt' : ucnt, 
                'dr' :dr, 
                'rssi':rssi, 
                'snr':snr, 
                'channel':channel, 
                'lat':lat, 
                'long_': long_, 
                'alt': alt})

 

1. with문을 사용한 이유 :

우선 파이썬 공식문서는 with문을 쓰기 권장한다. 파일 쓰기 위해선 파일을 열어야 합니다. 그리고 쓰기가 완료되면 닫아야 합니다. 하지만 파일 쓰기가 완료되었지만, 파일이 열려 있으면 파일이 깨지거나, 제대로 된 데이터가 아닐 수 있습니다. with문은 이를 방지 위해 파일 열기, 닫기를 자동으로 해줍니다. 

 

2. 위 csv 저장하는 코드는 데이터를 이어 저장하는 형식이며, 만약 파일 이름(path_)이 지정한 경로(./data/) 내에 이름이 같은 파일이 없다면, csv header(fieldnames)를 추가한다. 파일 이름이 지정한 경로 내에 이름이 같은 파일이 있다면, csv header를 추가하지 않고, 데이터를 그대로 이어 저장한다.

    

csv 형태를 잘 만들어 놓으면 나중에 pandas 혹은 matlab가지고 놀기 편합니다. 

 

이런 느낌의 코드를 전에 짜놓고 또 못찾아서 새로 짜고를 3번 정도 반복할쯤 그냥 블로그에 올리기로 했습니다.

728x90
반응형
반응형

안녕하세요. 

 

오늘은 파이썬 기본 문법인 List와 Dict을 활용한 면접 문제 코딩을 하나 작성하도록 하겠습니다. 

 

tuple( ( ) 사용) : 일반적으로 배열(정적할당)처럼 사용된다. 그러므로 불가변적으로 변수를 집어넣을 수 없다.

List( [ ] 사용 ) : 일반적으로 배열(동적할당)처럼 사용된다. 그러므로 가변적으로 변수를 집어 넣을 수 있다.

Dict( { } 사용) : List와 달리 Index도 입력해야한다.

 

그렇다면 Dictionary은 왜 사용하는가? 

 

그 이유는 데이터 처리에 있어 Dict은 프로그래머가 이미 Index를 알고 있어, 바로 해당하는 데이터로 접근합니다.

 

List는 배열 구조로서 크기가 10(0~9)인 List가 있다고 가정하게 되면, 9번 데이터에 접근하기 위해 순차적으로 인덱스가 0부터 8까지 모두 접근을 한 이 후에 9번에 접근하게 됩니다. 

 

List는 9번을 메모리에 들락날락한다면, 

 

DIctionary는 단, 1번으로 자신이 원하는 메모리에 접근할 수 있습니다. 

 

그러므로 List에 비해 DIct의 속도가 더 빠릅니다. 메모리의 사이즈가 더 커진다면 그 속도의 차이는 더욱 커질 것입니다.

 

 

문제 : List : 사과, 바나나, 딸기, 키위, 복숭아의 갯수가 몇개인가? 

 

#list
fruits = ["사과", "사과", "바나나", "바나나", "딸기", "키위", "복숭아", "복숭아", "복숭아"]

#dict
dict = {}

for fruit in fruits:
	if fruit in dict:
    		dict[fruit] = d[fruit] +1
	else:
		dict[fruit] = 1
        
print(dict)

#결과 : {'사과': 2, '바나나': 2, '딸기': 1,'키위': 1, '복숭아': 3}

 

 

처음에  정답을 봤을 때, 정말 간단한 코딩이지만 List와 Dict에 정확히 이해해야만 풀 수 있는 문제입니다.

 

학기를 시작하여 매일은 아니지만 주에 몇 번씩 파이썬 면접문제를 몇 개씩 올려서 풀어볼려고 합니다.

728x90
반응형

+ Recent posts