"""Opens a file and parses it using the YAML sintax
:param fileName: name of the file
:type fileName: ``string``
:return: parsed data
:rtype: ``dict``
"""
data={}
try:
withopen(fileName,'r')asstream:
try:
data=yaml.load(stream,Loader=yaml.SafeLoader)
except:
print("Cannot parse file")
except:
print("Cannot open file : ",fileName)
#
returndata
##############
# CHECK DICT #
##############
defcheck_dict(parsed_data={},default_data={}):
"""Check data: returns a dictionary with the same keys of default_data. If keys are matching, values of default_data are replaced with those of parsed_data.
:param parsed_data: parsed data
:type parsed_data: ``dict``
:param default_data: default data
:type default_data: ``dict``
:return: checked data
:rtype: ``dict``
"""
#
data={}
#
forkeyindefault_data.keys():
ifkeyinparsed_data.keys():
data[key]=parsed_data[key]
else:
data[key]=default_data[key]
#
returndata
###########
# SUPPORT #
###########
defprint_bar(prefix="",nmarks=92):
"""Prints bar.
:param prefix: prefix
:type prefix: ``string``
:param nmarks: number of marks
:type nmarks: ``int``
"""
#
s=prefix
foriinrange(nmarks):
s+="-"
print(s)
#########
# PRINT #
#########
defprint_dict(title="input_west",data={}):
"""Prints data.
:param title: title
:type title: ``string``
:param data: data to print
:type default_data: ``dict``
"""
#
nmarks=92
nspaces=5
s=""
foriinrange(nspaces):
s+=" "
#
print_bar(s,nmarks)
print(s+"I/O Summary : "+str(title))
print_bar(s,nmarks)
forkeyindata.keys():
print(s+key,"=",data[key])
print_bar(s,nmarks)
sys.stdout.flush()
#############
# INTERFACE #
#############
defread_keyword_from_file(*args,**kwargs):
"""Read keyword from file
:return: read data
:rtype: ``dict``
"""
#
fileName=args[0]
keyword=args[1]
#
# Assign static & dynamical defaults
#
default_data=default[keyword]
update_default_values(keyword,kwargs)
#
# Read input file
#
input_data=open_and_parse_file(fileName)
ifkeywordininput_data.keys():
parsed_data=input_data[keyword]
else:
parsed_data={}
#
# Compare defaults and input variables
#
data=check_dict(parsed_data,default_data)
#
# Print
#
print_dict(keyword,data)
#
returndata
########
# TEST #
########
deftest():
#
fileName="west.in"
#
withopen(fileName,"w")asfile:
file.write("""
input_west :
qe_prefix : molecule
west_prefix : molecule
outdir : "./"
wstat_control :
wstat_calculation : R # this is a comment
unknown_key : value # this line will be read but not passed