데이터 꿈나무

[Python_ts4] ini파일 안에 특정 텍스트가 있는지 확인하기(os.walk, configparser) 본문

Activity/Intern

[Python_ts4] ini파일 안에 특정 텍스트가 있는지 확인하기(os.walk, configparser)

ye_ju 2023. 10. 15. 17:44

안녕하세요~ 이번 포스팅은 InI파일을 읽어와 파일 안에 원하는 텍스트가 있는지 확인하고, 있으면 ‘y’ 없으면 ‘n’를 출력하도록(리스트에 정보를 담도록) 하는 작업을 진행해볼거예요..!

지난 포스팅 코드에서 일부를 추가한 작업이니, 아래 글을 참고해주세요😊

 

https://risingdata.tistory.com/67

 

[Python_ts3] cv2 모듈 이미지 띄우고 키 값 리스트에 저장하기(cv2.imread, cv2.waitKey)

안녕하세요~ 이번에는 cv2 모듈을 통해 이미지를 띄우고, 사용자가 누르는 키 값을 리스트에 저장하는 task를 해보려고 해요. os모듈과 반복문을 통해 라벨링된 초음파 이미지 데이터를 창에 띄우

risingdata.tistory.com

 


우선 아래 코드까지는 저번 포스팅이랑 똑같답니다.

import os
import cv2
import pandas as pd
import configparser  # ini파일 

# 파일 경로
filepath = 'T:/car/Second_upload'

labeller_list = []  # labeller 리스트
index_list = []     # 인덱스 리스트
label_flag = []     # 'y', 'n' 또는 'NaN'을 담을 리스트
ini_flag = []

for path, _, file in os.walk(filepath):  # _와 file이 있는 path, path 아래에 있는 폴더들, path 아래에 있는 파일들   
    
    if 'InI' in path:  # path에 'InI'가 있으면 
        
        # labeller와 index 정보 저장
        labeller = path.split('\\')[-3]
        labeller_list.append(labeller)
            
        index = path.split('\\')[-2]
        index_list.append(index) 
        
        # ini파일이 없으면 'n'
        if len(file) == 0:
            ini_flag.append('n')
        # ini파일이 있으면 해당 경로로 들어가기

 

 

추가된 부분은 이 부분인데요, ini파일이 있는 경로에 들어간 후 configparser모듈을 이용하여 ini파일을 읽어들여올거예요! 왜냐하면 ini파일 안에 특정 텍스트가 존재하는지 여부를 알기 위함이죠~!

 

configparser.ConfigParser()을 통해 ini파일을 불러오는 변수 config에 저장해줍니다.

그리고 config.read(ini_path)를 하여 ini파일이 있는 경로의 ini파일을 읽어옵니다.

저희가 검색할 텍스트는 'D1 Line Result''D2 Line Result' 인데요, 해당 텍스트가 ini파일에 존재하면, 각각 line1, line2에 저장해줍니다.

그게 아니면(except) None값으로 저장합니다. 

 

마지막으로 line1이나 line2가 None값이라면 ini_flag에 'n'을 append해줍니다. 해당 텍스트가 ini파일에 존재하지 않는다는 뜻이죠.

그게 아니면(else) 'y'를 append해줍니다.

        # ini파일이 있으면 해당 경로로 들어가기    
        else:
            ini_path = path + '/{}'.format(file[0])
            
            config = configparser.ConfigParser()   # ini파일 불러오는 모듈
            config.read(ini_path)
            try:
                line1 = config['D1 Line Result']
                line2 = config['D2 Line Result']
            except:
                line1 = None
                line2 = None
            
            if line1 == None or line2 == None:
                ini_flag.append('n')
            else:
                ini_flag.append('y')

 

📌 전체 코드

import os
import cv2
import pandas as pd
import configparser  # ini파일 

# 파일 경로
filepath = 'T:/car/Second_upload'

labeller_list = []  # labeller 리스트
index_list = []     # 인덱스 리스트
label_flag = []     # 'y', 'n' 또는 'NaN'을 담을 리스트
ini_flag = []

# path = T:/car/Second_upload\label 1\CA_1000122070
#        T:/car/Second_upload\label 1\CA_1000122070\InI
#        T:/car/Second_upload\label 61\CA_1000122070\Label_Data

for path, _, file in os.walk(filepath):  # _와 file이 있는 path, path 아래에 있는 폴더들, path 아래에 있는 파일들   
    
    if 'InI' in path:  # path에 'InI'가 있으면 
        
        # labeller와 index 정보 저장
        labeller = path.split('\\')[-3]
        labeller_list.append(labeller)
            
        index = path.split('\\')[-2]
        index_list.append(index) 
        
        # ini파일이 없으면 'n'
        if len(file) == 0:
            ini_flag.append('n')
        # ini파일이 있으면 해당 경로로 들어가기    
        else:
            ini_path = path + '/{}'.format(file[0])
            
            config = configparser.ConfigParser()   # ini파일 불러오는 모듈
            config.read(ini_path)
            try:
                line1 = config['D1 Line Result']
                line2 = config['D2 Line Result']
            except:
                line1 = None
                line2 = None
            
            if line1 == None or line2 == None:
                ini_flag.append('n')
            else:
                ini_flag.append('y')
                
    if 'Label_Data' in path:   # path에 'Label_Data'가 있으면 
        # bmp파일이 없는 경우
        if len(file) == 0:  # .bmp파일이 없는 경우는 경로에 들어가지 않기 때문에 list 길이가 0이다.
                            # 만약, img_path = path + '/{}'.format(file[0])를 할 경우에는 file[0]이 없기 때문에 에러가 뜬다.          
            ret = 'NaN'     # label_flag에 'NaN'입력
            label_flag.append(ret) 

        # bmp 파일이 있는 경우
        else:
            # img_path = T:/car/Second_upload\label 1\CA_1000122070\Label_Data/000.BMP ...
            img_path = path + '/{}'.format(file[0])  # bmp파일이 있으니, file[0]까지 해주어 경로에 들어간다.
            
            # 이미지 띄우기
            img = cv2.imread(img_path)
            cv2.imshow('Label image', img)
            
            # 키 입력 대기 시간 -> 무한 대기
            ret = cv2.waitKey(0)
            
            # 입력하는 키 정보('y' or 'n') 넣어주기
            label_flag.append(ret)
            
            # 'esc' or 'x'버튼 누르면 반복문 빠져나오기
            if ret == 27 or ret == -1:
                break
    
        print('labeller: ', labeller_list)
        print('index: ', index_list)
        print('label: ', label_flag)
        print('ini: ', ini_flag)

      
# 데이터 프레임 생성
df = pd.DataFrame({
    'labeller': labeller_list,
    'index': index_list,
    'label': label_flag,
    'ini' : ini_flag
})

# csv파일 생성
df.to_csv('result.csv', index=False)

print("END")

 

 

※ 참고(print문 위치 차이)

더보기
import os
import cv2
import pandas as pd
import configparser  # ini파일 

# 파일 경로
filepath = 'T:/car/Second_upload'

labeller_list = []  # labeller 리스트
index_list = []     # 인덱스 리스트
label_flag = []     # 'y', 'n' 또는 'NaN'을 담을 리스트
ini_flag = []

# path = T:/car/Second_upload\label 1\CA_1000122070
#        T:/car/Second_upload\label 1\CA_1000122070\InI
#        T:/car/Second_upload\label 1\CA_1000122070\Label_Data

for path, _, file in os.walk(filepath):
...
...
...

위의 코드를 디버깅 해서 살펴보면,

  • path

Second_upload # (첫번째 루프)

Second_upload\\label1 # (두번째 루프)

Second_upload\\label1\\CA_1000122070 # …

Second_upload\\label1\\CA_1000122070\\InI

Second_upload\\label1\\CA_1000122070\\InI\\Label_Data

  • _

label1, label2, …, label13

CA_1000122070, CA_100122679, …, CA_183738473 (label1 폴더 안의 폴더들)

InI, Label_Data

[]

[]

  • file

[]

[]

000.BMP

000.InI

000.BMP (Label_Data 폴더 내에 있는 bmp파일)

이런 식으로 폴더를 하나 하나씩 전체를 도는 것을 확인할 수 있다.

따라서, print위치 별 루프 출력을 확인해보면,

 

print위치 별 루프 출력 확인

# print를 if문 안에 뒀을 때

(Pytorch) D:\PythonProjects>"C:/Users/YEJU LEE/.conda/envs/Pytorch/python.exe" d:/PythonProjects/task3.py

# 'y'버튼 한번 누르고 난 후 (버튼 누르지 않았을 때는 아무것도 안 뜸)

labeller: ['label 1']
index: ['CA_1000122070']
label: [121]
ini: ['y']

 

# 버튼 두번 누르고 난 후
labeller: ['label 1', 'label 1']
index: ['CA_1000122070', 'CA_1000136570']
label: [121, 103]
ini: ['y', 'y']
END

 

# print를 if문 밖에 뒀을 때

(Pytorch) D:\PythonProjects>"C:/Users/YEJU LEE/.conda/envs/Pytorch/python.exe" d:/PythonProjects/task3.py

# 버튼 누르지 않았을 때의 출력(실행만 함)
labeller:  []
index:  []
label:  []
ini:  []
labeller:  []
index:  []
label:  []
ini:  []
labeller:  []
index:  []
label:  []
ini:  []
(현재 InI폴더로 들어온 상태)
labeller:  ['label 1']
index:  ['CA_1000122070']
label:  []
ini:  ['y']

# 'y'버튼 한번 누르고 난 후

labeller:  ['label 1']
index:  ['CA_1000122070']
label:  [121]
ini:  ['y']

labeller:  ['label 1', 'label 1']
index:  ['CA_1000122070', 'CA_1000136570']
label:  [121]
ini:  ['y', 'y']

루프 돌 때 폴더가 맨 처음에는 아무것도 들어가지 않고 한번 루프 돌면 Second_upload, label1,…이런 식으로 들어간다. 따라서, 맨처음 아무것도 없음 → Second_upload → label1 → … 이다.

print를 if문 밖에 뒀을 때는, 루프 3번 동안 InI파일이 없어서 출력 값이 없다가, 4번째에 

‘’’

(현재 InI폴더로 들어온 상태)
labeller:  ['label 1']
index:  ['CA_1000122070']
label:  []
ini:  ['y']

‘’’

이렇게 된다. 이렇게 뜨는 이유는, 현재 InI 폴더로 들어왔기 때문에 label(label_flag) 정보가 없기 때문이다.


오늘도 읽어주셔서 감사합니다!!

Comments