Python이 주력 언어다 보니, 업무 상으로도 왠만한 프로그램은 Python으로 개발하고 있는 중이다. 그러다보니, 필자가 자주 사용하는 코드는 개인 라이브러리 형태로 만들어 사용하고 있는데, 이 업계가 항상 그러하듯이 개발은 갑작스럽게, 급하게 진행되어야 하다보니 라이브러리 상에서도 개판 5분전인 코드들이 많이 나온다.
그래서 요즘 아예 필자의 개인 프로젝트용으로 라이브러리를 다시 만들고 있는 상태인데, 맨날 라이브러리를 통해 설정 파일들을 불러오다보니, 설정 파일의 주 단골 손님인 Json과 Yaml을 읽고 불러들이는 방법을 완전히 잊은 상태가 되었다...
이번 포스팅에서는 Json, Yaml의 읽기와 쓰기에 대해 간략히 정리하려 한다.
1. Json, Yaml 파일 RW 패키지
Json과 Yaml은 프로그램의 설정에 많이 사용되는 파일 형태다. Python의 dictionary와 매우 유사하게 생겼기 때문에, 이들 파일로부터 읽어들인 값 역시 Python에서 dictionary 객체로 저장된다.
이들 파일을 읽고 쓰기 위해서는 각각 json과 yaml이라는 두 패키지가 필요하다.
json은 python의 기본 라이브러리로 제공되는 패키지라 바로 import를 진행하면 되나, yaml의 경우 pip를 통해 pyyaml이라는 라이브러리를 설치해야만 사용할 수 있다.
2. Json, Yaml 파일의 읽기(Read)
json과 yaml 패키지는 json과 yaml 파일을 읽기 위해 load라는 이름의 function을 가지고 있다(정확히 각 패키지의 __init__.py 파일에 위치한다).
차이점이 있다면 json.load() 는 인자로 Loader라는 객체를 받지 않음에 반해 yaml은 Loader 객체를 반드시 명시해야 한다는 차이점이 있다. Yaml의 Loader는 yaml 패키지 내 loader.py 파일에 명시되어 있다.
json.load()와 yaml의 load 계열 함수들은 모두 stream 형태로 입력되는 yaml 파일 내용을 인자로 받아들여야 한다. 따라서 with 구문을 사용하여 각 파일의 내용을 읽어들인 값을 stream 인자에 위치시키고, yaml의 경우 추가로 Loader 객체를 추가하면 된다.
Yaml 파일의 경우, Loader의 종류에 따라 safe_lodaer, full_loader등의 함수로 대체하는 것도 가능하다. Loader의 종류가 다양한 편이나 공식 문서나 stackoverflow 등지에서는 임의의 코드 실행 가능성으로 인한 보안 취약성으로 인해 loader() 대신 safe_loader()를 사용할 것을 권장하고 있다.
필자는 test.json과 test.yaml 파일 두 개를 아래와 같은 내용으로 가지고 있는데, 이제 위의 각 클래스 매서드를 적용하여 호출해보자.
json과 yaml로 파일 호출 시 두 파일의 내용이 dictionary 형태로 잘 반환되는 것을 확인할 수 있다.
3. Json, Yaml 파일 쓰기
이번에는 파일의 쓰기에 대해 알아보자. Json과 Yaml 모두, 읽기의 load() 매서드와 같이, 쓰기에서는 dump()라는 매서드를 사용한다. yaml 패키지의 경우 dump() 함수 내에 Dumper 객체를 명시해주어야 하는데, 이 Dumper 객체 역시 yaml 패키지 내 dumper.py에 정의되어 있다. 물론, dump() 역시 load()와 비슷한 이유로 인해 safe_dump() 함수를 사용할 것을 공식 문서나 기타 개발 커뮤니티에서 권장하고 있는 상태다.
사용 방법은 간단하다. dump의 경우 파일에 입력될 값인 dict 객체와 파일 객체를 순차적으로 명시하면 된다. json과 yaml의 두 인자값이 입력되는 인자명이 조금 다른데, json의 경우 obj, fp로, yaml은 data, stream으로 표시된다.
Json과 Yaml 파일을 쓰기 위한 코드는 아래와 같다.
이번에는 기존에 존재하던 test. 파일로부터 읽어들인 값을 바로 test2라는 이름의 파일로 쓰기를 진행해보려한다. 코드는 아래와 같다.
단, yaml의 경우 기존에 주석 처리 되어 있던 부분(#)에 대해 python이 인지를 하지 못하기 때문에 test2.yaml의 경우 test1.yaml과 달리 첫 줄의 주석이 추가되지 않았음을 확인할 수 있다.
Fin.
'Python > Python Advanced' 카테고리의 다른 글
11. Python - Thread를 사용한 여러 기능 동시 실행(1) (0) | 2024.03.22 |
---|---|
10. Python - Lamdba의 활용 (0) | 2024.02.19 |
8. Python - msvcrt 모듈로 키보드 입력 및 화면 출력 조정 (0) | 2021.08.07 |
7. Python - timeit모듈, timeit()매서드로 코드 실행시간 계산하기 (0) | 2021.05.12 |
6. Python - os 모듈: chdir(), listdir(), getcwd() 함수 (0) | 2020.08.17 |
댓글