*.SPDX 파일 읽는 파이썬 예제
글. 수알치 오상문
간단하게 작성해본 것이라 예외 처리할 사항이 많습니다.
SPDX 파일 예제 한 개를 대상으로 적용했으니 그냥 이렇게 할 수 있구나 정도로 참고하세요.
테스트에 사용한 예제 파일 내용은 다음과 같습니다.
이 파일을 읽어서 사전 데이터를 가진 리스트로 변경합니다.
참고로, 일반 사전형 dict 대신에 순서를 유지해주는 OrderedDict 사전형을 사용했습니다.
[예제 파일] file.spdx
SPDXVersion: SPDX-2.2
DataLicense: CC0-1.0
FileName: example.py
FileType: SOURCE
FileChecksum: MD5: 7f138a09169b250e9dcb378140907378
LicenseConcluded: MIT
LicenseInfoInFile: MIT
FileName: example2.py
FileType: SOURCE
FileChecksum: SHA1: 60d4bfda65fa6da37e6d4b100a538d6c5b5a5a5a
LicenseConcluded: Apache-2.0
LicenseInfoInFile: Apache-2.0
PackageName: example-project
PackageVersion: 1.0
PackageChecksum: SHA256: 91e7a8c5f7107f7b7e8b4a484ea34a1c206e66779db2238f042097afe0e2c820
License: MIT
LicenseInfoFromFiles: LICENSE.txt
[파이썬 코드]
from pprint import pprint
from collections import OrderedDict
data = []
with open("file.spdx", "r") as f:
text = f.readlines()
temp_dic = OrderedDict()
for line in text:
line = line.replace('\n', '').strip()
if line == "": # 빈 줄
continue
tokens = line.split(':')
if len(tokens) < 2: # ':' 분리시 2 또는 3개로 나뉨
continue
tokens[0] = tokens[0].strip()
tokens[1] = tokens[1].strip()
if tokens[0].upper() == "FILENAME": # 파일 SBOM
# print('FileName')
data.append(temp_dic)
temp_dic = OrderedDict()
elif tokens[0].upper() == "PACKAGENAME": # 패키지 SBOM
# print('PackageName')
data.append(temp_dic)
temp_dic = OrderedDict()
if len(tokens) == 2: # 2개로 나뉜 경우
temp_dic[tokens[0]] = tokens[1]
else: # 3개 이상으로 나뉜 경우
temp_dic[tokens[0]] = tokens[1] + tokens[2]
if temp_dic: # 남은 게 있으면 최종 추가
data.append(temp_dic)
print('SPDXVersion:', data[0].get('SPDXVersion', 'Unknown'))
print('DataLicense:', data[0].get('DataLicense', 'Unknown'))
print('DATA:')
pprint(data)
[실행 결과] 화면 출력 내용
SPDXVersion: SPDX-2.2
DataLicense: CC0-1.0
DATA:
[OrderedDict([('SPDXVersion', 'SPDX-2.2'), ('DataLicense', 'CC0-1.0')]),
OrderedDict([('FileName', 'example.py'),
('FileType', 'SOURCE'),
('FileChecksum', 'MD5 7f138a09169b250e9dcb378140907378'),
('LicenseConcluded', 'MIT'),
('LicenseInfoInFile', 'MIT')]),
OrderedDict([('FileName', 'example2.py'),
('FileType', 'SOURCE'),
('FileChecksum', 'SHA1 60d4bfda65fa6da37e6d4b100a538d6c5b5a5a5a'),
('LicenseConcluded', 'Apache-2.0'),
('LicenseInfoInFile', 'Apache-2.0')]),
OrderedDict([('PackageName', 'example-project'),
('PackageVersion', '1.0'),
('PackageChecksum',
'SHA256 '
'91e7a8c5f7107f7b7e8b4a484ea34a1c206e66779db2238f042097afe0e2c820'),
('License', 'MIT'),
('LicenseInfoFromFiles', 'LICENSE.txt')])]
'Python 활용' 카테고리의 다른 글
파이썬, 아이디와 비밀번호('*' 출력) 입력, 암호화, 비교, 로그인 처리 (0) | 2023.04.01 |
---|---|
다음(DAUM) 이메일 서버를 이용하여 이메일 보내기 (0) | 2023.03.30 |
파이썬, FPDF로 PDF 파일 저장하는 예제 (0) | 2023.03.12 |
미친 파이썬 프레임워크가 나타났다. Pynecone (0) | 2023.03.11 |
파이썬, PDF 파일 페이지 분리 저장, PDF 파일 병합 예제 (0) | 2023.03.11 |