Source code for bw2io.extractors.ecospold1_lcia
# -*- coding: utf-8 -*-
from bw2data.utils import recursive_str_to_unicode
from lxml import objectify
import os
import pyprind
import sys
[docs]
def _to_unicode(data):
if sys.version_info < (3, 0):
return recursive_str_to_unicode(data)
else:
return data
[docs]
class Ecospold1LCIAExtractor(object):
"""Extract impact assessment methods and weightings data from ecospold XML format."""
@classmethod
[docs]
def extract(cls, path):
if os.path.isdir(path):
files = [
os.path.join(path, name)
for name in os.listdir(path)
if name[-4:].lower() == ".xml"
]
else:
files = [path]
pbar = pyprind.ProgBar(
len(files), title="Extracting ecospold1 files:", monitor=True
)
methods_data = []
for filepath in files:
# Note that this is only used for the first root method found in
# the file
root = objectify.parse(open(filepath, encoding="utf-8")).getroot()
for dataset in root.iterchildren():
methods_data.append(_to_unicode(cls.parse_method(dataset, filepath)))
pbar.update(item_id=filepath[:15])
print(pbar)
return methods_data
@classmethod
[docs]
def parse_method(cls, ds, filepath):
ref_func = ds.metaInformation.processInformation.referenceFunction
return {
"exchanges": [cls.parse_cf(o) for o in ds.flowData.iterchildren()],
"description": ref_func.get("generalComment") or "",
"filename": filepath,
"name": (
ref_func.get("category"),
ref_func.get("subCategory"),
ref_func.get("name"),
),
"unit": ref_func.get("unit") or "",
}
@classmethod
[docs]
def parse_cf(cls, cf):
data = {
"amount": float(cf.get("meanValue")),
"categories": (cf.get("category"), cf.get("subCategory") or None),
"name": cf.get("name"),
"unit": cf.get("unit"),
}
return data