반응형

*.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')])]

 

 

반응형

+ Recent posts