Security_Analysis

진단 Tool 제작_2 (데이터 수집) 본문

현업/[dev]_Python

진단 Tool 제작_2 (데이터 수집)

Positivie 2024. 6. 27. 02:29
728x90
반응형

앞서 글에서 데이터 분할은 완료하였으니 이제 데이터 프레임화를 진행해볼까 한다. 

진단 Tool 제작_1 (데이터 분할) (tistory.com)

 

데이터 프레임화 에 대해서 간략하게만 정의하면 "표" 를 만드는 것이라고 생각했다. 

자세한 설명은 구글링( 3) 데이터프레임이란? - 인투 더 파이썬(INTO THE PYTHON), 기초부터 AI까지 (wikidocs.net)에서 도와줄 것이다. 

 

 

즉, 항목번호(U-01, U-02 ~ U-72) 별로, 각 텍스트 파일에 있는 값을 가져왔다 

file_paths = glob.glob('./data/**/U-*.txt', recursive=True)

for file_path in file_paths:
    file_name = os.path.basename(file_path)
    srv_id = os.path.splitext(file_name)[0]

    with open(file_path, 'rb') as file:
        raw_data = file.read()
        result = chardet.detect(raw_data)
        encoding = result['encoding']

 

이 부분에서 벌써 오류가 발생했다.

바로 인코딩 문제였다. 

 분할된 파일을 읽다보니 EUCKR, UTF8, CP949 등 다양한 인코딩 에러가 발생했다.  이 모든 인코딩에 대해서 내가 경우의 수를 전부 반영해야 했으나, 검색해보니 chardet 라는 훌륭한 모듈이 있었다. 

 

Chardet : 범용 문자 인코딩 탐지기 (

chardet · PyPI)

 

파일을 읽을 때 인코딩 기법을 확인하여 변경해주는 모듈이라고 한다. 이 모듈을 사용하니까 내가 사용하는 어떤 인코딩 기법에 대해서도 모두 변환이 가능했다. 

    with open(file_path, 'r', encoding=encoding) as file:
        lines = file.readlines()
        filtered_lines = []
        for line in lines:
            stripped_line = line.strip()

            if not stripped_line:
                continue
            if stripped_line.startswith("##STATUS##"):
                continue
            if stripped_line[0].isdigit() and stripped_line[1] == '.':
                continue
            if '=' in stripped_line:
                continue
            filtered_lines.append(stripped_line)

 

"##STATUS##"  라는 값을 기준으로 하단에 정보가 출력되고 있어서 해당 내용을 제외하고 하단 내용을 출력하도록 조절했고, 

" 1. ~~~~~" , "2. ~~~~~" 와 같이 보고서 작성 목적으로 사용되는 내용도 제외하고, 

남은 내용들을 변수(fitlered_lines) 에 포함하도록 진행했다. 

 

이제 filtered_lines에 저장된 내용 중 "-======" ,"-----" 와 같은 불필요한 내용이 있을 수도 있으니 

	combined_text = "\n".join(filtered_lines)
        combined_text = combined_text.replace('=', '==')

와 같이 불필요한 내용을 제외하도록 하였다.

 

이렇게 까지 하고 나서 combined_text에 저장된 내용을 데이터 프레임에 값을 넣기 위해서 data.append 하였다

        if combined_text:
            data.append((srv_id, combined_text))
        else:
            data.append((srv_id, "No relevant content"))

 

이렇게 데이터프레임화가 완료되었다. 

 

150여개의 자산에 대해서 72개의 항목의 파일을 열려면 총 10,800개 인데 이걸 데이터 프레임화 하면 시간 및 속도가 엄청 오래걸릴 것이기 때문에

한대로 진행을 했지만 

 

속도 개선을 위해서 뭐가 좋은지도 파악을 해봐야 겠다. 

728x90
반응형