Source code for pydoas.inout

# -*- coding: utf-8 -*-
#
# Pydoas is a Python library for the post-analysis of DOAS result data
# Copyright (C) 2017 Jonas Gliß (jonasgliss@gmail.com)
#
# This program is free software: you can redistribute it and/or
# modify it under the terms of the BSD 3-Clause License
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
# See BSD 3-Clause License for more details 
# (https://opensource.org/licenses/BSD-3-Clause)
"""
This module contains I/O routines for DOAS result files
"""
from __future__ import unicode_literals
from os.path import join
from os import listdir
from collections import OrderedDict as od


[docs]def get_data_dirs(): """Get directories containing example package data :returns: list of package subfolders containing data files """ from pydoas import _LIBDIR return listdir(join(_LIBDIR, "data"))
[docs]def get_data_files(which = "doasis"): """Get all example result files from package data""" from pydoas import _LIBDIR if which == "doasis": p = join(_LIBDIR, join("data", "doasis_resultfiles")) elif which == "fake": p = join(_LIBDIR, join("data", "fake_resultfiles")) else: raise ValueError("No example resultfiles available for ID %s, " "choose from *fake* or *doasis*") return listdir(p), p
[docs]def get_result_type_ids(): """Read file import_info.txt and find all valid import types""" try: from pydoas import _LIBDIR except: raise with open(join(_LIBDIR, join("data", "import_info.txt"))) as f: types = [] for line in f: spl = line.split(":", 1) if spl[0] == "type": tp = spl[1].split("#")[0].strip() if len(tp) > 0: types.append(tp) return types
[docs]def import_type_exists(type_id): """Checks if data import type exists in import_info.txt :param str type_id: string ID to be searched in import_info.txt """ if type_id in get_result_type_ids(): return True return False
[docs]def get_import_info(resulttype="doasis"): """Try to load DOAS result import specification for default type Import specifications for a specified data type (see package data file "import_info.txt" for available types, use the instructions in this file to create your own import setup if necessary) :param str resulttype: name of result type (field "type" in "import_info.txt" file) """ from pydoas import _LIBDIR from codecs import decode dat = od() with open(join(_LIBDIR, join("data", "import_info.txt"))) as f: found = 0 for line in f: if "ENDTYPE" in line and found: print(dat) return dat spl = line.split(":", 1) if spl[0] == "type" and spl[1].split("#")[0].strip() ==\ resulttype: found = 1 if found: if not any([line[0] == x for x in["#","\n"]]): k = spl[0].strip() d = [x.strip() for x in spl[1].split("#")[0].split(',')] if k == "time_str_formats": dat[k] = d elif k == "delim": print(decode(d[0],"unicode-escape")) #dat[k] = str(d[0].decode("unicode_escape")) dat[k] = decode(d[0], "unicode-escape") else: try: val = int(d[0]) except: val = str(d[0]) dat[k] = val raise IOError("Info for type %s could not be found" %resulttype)
[docs]def import_info_file(): """Return path to supplementary file import_info.txt""" from pydoas import _LIBDIR return join(_LIBDIR, join("data", "import_info.txt"))
def _fake_import_specs(): """Returns dictionary for adding a new fake import type""" return od([("type", "fake"), ("access_type", "col_index"), ("file_type", "csv"), ("time_str_formats", "%Y%m%d%H%M"), ("delim", ";"), ("start", 0), #col num ("stop", 1), #col num ("bla" , "Blub"), #invalid (for test purpose) ("num_scans", 4)]) #colnum
[docs]def write_import_info_to_default_file(import_dict): try: if import_type_exists(import_dict["type"]): raise TypeError("Import specifications for ID %s already exists in " "file import_info.txt, please change ID and try again" %import_dict["type"]) except KeyError: raise KeyError("Please specify type in dictionary") keys = list(get_import_info().keys()) p = import_info_file() print(("Writing to %s" %p)) with open(p, "a") as myfile: myfile.write("\n\nNEWTYPE\n") for k, v in list(import_dict.items()): if k in keys: print(("ADDING %s: %s" %(k, v))) if isinstance(v, list): s = str(v[0]) for i in range(1, len(v)): s += ",%s" %v[i] myfile.write("%s:%s\n" %(k, s)) else: myfile.write("%s:%s\n" %(k, v)) else: print(("INVALID KEY (not added) %s: %s" %(k,v))) myfile.write("ENDTYPE") myfile.close()