[Python자동화처리] 폴더 안의 json파일의 정보를 가져오기.

전보·2020년 5월 17일
1

1. 내용

테스트를 통해얻은 수많은 json파일이 폴더들안에 들어있었고, 나는 그 폴더들을 추적해서 json파일들을 다 뽑아내, json파일이름 = 시리얼넘버 와 json파일안에있는 ID값을 추출해야했다.

2. 기능

  1. json파일까지의 폴더들을 추적.
  2. json파일을 찾으면 리스트에 json파일목록을 추가하고 찾고자하는 데이터 추출.
  3. json파일 읽어오기 and 파싱.
  4. Dictionary를 csv파일로 쓰기.

3. Code

3.1 함수소개

  1. def my_list(self, file_path)
    : 폴더안에 있는 파일들을 리스트로 정리해서 리스트를 반환.
  2. check_json(self, file_name)
    : 해당파일이 json파일인지 아닌지 확인하고, json이라면 json_list에 추가해줌.
  3. add_files(self, file_path)
    : 모든 파일리스트를 file_dic에 저장.
  4. def creat_output(self)
    : json파일을 다 뽑아낸 후에 데이터처리.output_dic에 저장.

3.2 전체코드설명

전체코드보기
import os
import glob
import json
import csv

class FindID :
    def __init__(self, path):
        self.path = path       #폴더들 주소
        self.json_list = []    #폴더들에서 json파일만 뽑아서 저장
        self.file_dic = {}     #모든 폴더와 폴더경로안의 파일들을 정리해놓은 사전.
        self.output_dic = {}   #마지막 출력을 위해서 key->json파일이름, value->각각의ID를 저장시킬거임. 

        self.add_files(path)   #file_dic사전만들기 시작
        self.creat_output()    #출력할 내용을 정리하는 output_dic에 값을 넣어주는 함수.

    def my_list(self, file_path):
        '''
            폴더안의 파일들을 리스트로 정리해서 return 해준다.
            glob함수는 폴더경로를 이용해 그안에 있는 모든 파일을 출력해준다.
        '''
        file_list = glob.glob(file_path + "/*")
        return file_list
    
    def check_json(self, file_name):
        '''
            만약 json파일까지 도달했다면(파일이름이 .json으로 끝난다면), 그 json파일은 json_list에 저장하고,
            아직 폴더가 남았다면, 다시 add_files()를 호출해서 file_dic사전에 추가정리. 
        '''
        if(self.file_dic[file_name][0].endswith(".json")):
            self.json_list.extend(self.file_dic[file_name])
        else:
            for name in self.file_dic[file_name]:
                self.add_files(name)

    def add_files(self, file_path):
        '''
            main함수
            my_list로 폴더안의 파일리스트를 받아서 file_dic에 저장.
            그리고 json 파일까지 도달했는지 체크한다.
        '''
        self.file_dic[file_path] = self.my_list(file_path)
        self.check_json(file_path)

    def creat_output(self):
        '''
            이제 다 뽑아낸 json_list(시리얼넘버)들로 각각의 json파일안의 'sampleId'의 value값을 뽑아,
            output_dic사전에 저장한다. 
        '''
        for filename in self.json_list:
            with open(filename, 'r',) as file:
                json_data = json.load(file)
            self.output_dic[filename] = json_data['sampleId']

if __name__ == "__main__":
    folder_name = input("input folder address : ")
    
    #파이썬 파일과 폴더가 동일할 때는 이 코드를 씀.
    #folder_name = "./" + folder_name

    folder = FindID(folder_name)

    '''
        output_dic(키:json파일경로, 발류: ID값)사전에 있는 값을 csv에 옯겨적는다.
        시리얼넘버는 키값인 json파일경로에서 뽑아냈다. -> key.split("/")[-1][:-8]
    '''
    with open('output.csv','w', newline='') as csvfile :
        writer = csv.writer(csvfile)

        writer.writerow(['Path', 'Sirial Number', 'ID'])
        for key, val in folder.output_dic.items():
            writer.writerow([key, key.split("/")[-1][:-8], val])


4. 마무리

폴더안의 json파일의이름과 그 안의 데이터를 추출할 수 있다.
-> 폴더가 몇개든지 상관없이 json파일이 있는 폴더까지 들어가서 json파일을 뽑아올 수 있다.

profile
엉망진창

0개의 댓글