1
0
This repository has been archived on 2025-03-06. You can view files and clone it, but cannot push or open issues or pull requests.
Jip J. Dekker f2a1c4e389 Squashed 'software/mza/' content from commit f970a59b17
git-subtree-dir: software/mza
git-subtree-split: f970a59b177c13ca3dd8aaef8cc6681d83b7e813
2021-07-11 16:34:30 +10:00

126 lines
4.1 KiB
Python

import os, copy, io
from collections import OrderedDict
def try_float( sVal, dft=None ):
res = dft
try:
res = float( sVal )
except:
pass
return res
def mergeDict( dict1, dict2 ):
for key in dict2:
dict1[ key ] = dict2[ key ]
def addMapValues( dict1, dict2 ):
for key in dict2:
if key in dict1:
dict1[key] += dict2[key]
else:
dict1[key] = dict2[key]
class MatrixByStr: ### Matrix with string keys
def __init__( self,
rows, cols, ## each a list of tuples: (short, long) row/column names
defval = 0 ):
self.rows, self.cols = rows, cols
self.mbs = OrderedDict( (r[0],
OrderedDict( (c[0], copy.deepcopy(defval)) for c in cols )) for r in rows )
def __getitem__( self, k ):
return self.mbs[ k[0] ][ k[1] ]
def __setitem__( self, k, v ):
self.mbs[ k[0] ][ k[1] ] = v
def stringify2D( self ): ## compact 2D print
return MyTab().tabulate( [
[key] + list(row.values()) ## merge each row's key into the row
for key,row in self.mbs.items() ],
[""] + [ col[0] for col in self.cols ] )
## assumes each item is a list
def stringifyLists( self, title, rowIntro, colIntro ):
resIO = io.StringIO()
print( '#'*50, file=resIO )
print( '#'*50, file=resIO )
print( '#'*50, file=resIO )
print( title, file=resIO )
print( '#'*50, file=resIO )
print( '#'*50, file=resIO )
print( '#'*50, file=resIO )
print( file=resIO )
for kr, r in self.mbs.items():
print( '#'*50, file=resIO )
print( '#'*50, file=resIO )
print( rowIntro, kr, file=resIO )
print( '#'*50, file=resIO )
print( '#'*50, file=resIO )
print( file=resIO )
for kc, c in r.items():
print( '#'*50, file=resIO )
print( rowIntro, kr, file=resIO )
print( colIntro, " ", kc, " / ", len(c), file=resIO )
print( '#'*50, file=resIO )
for el in c:
print( el, file=resIO )
print( file=resIO )
return resIO.getvalue()
class MyTab:
def __init__( self ):
self.sColSep=' '
## Receive table row-wise (matr)
## hdr is a list of column headers
def tabulate( self, matr, hdr ):
res = ""
## Compute max width
nWMax = []
for iC in range( len( hdr ) ):
nWMax.append( len( str( hdr[ iC ] ) ) )
for iR in range( len( matr ) ):
if iC<len( matr[ iR ] ):
if nWMax[ iC ]<len( str( matr[iR][iC] ) ):
nWMax[ iC ] = len( str( matr[iR][iC] ) )
## Printing
res =( ("{0:<"+str(nWMax[0])+'}').format(hdr[0]) + self.sColSep )
for iC in range( 1, len( hdr ) ):
res += ( ("{0:"+str(nWMax[iC])+'}').format(hdr[iC])
+ ( self.sColSep if iC+1<len(hdr) else '\n' ) )
for iR in range( len( matr ) ):
res += ( ("{0:<"+str(nWMax[0])+'}').format(matr[iR][0] if 0<len( matr[ iR ] ) else '-') + self.sColSep )
for iC in range( 1, len( matr[iR] ) ):
res += ( ("{0:"+str(nWMax[iC])+'}').format(matr[iR][iC] if iC<len( matr[ iR ] ) else '-')
+ ( self.sColSep if iC+1<len(hdr) else '\n' ) )
return res
## change string to be abke to become a filename
def flnfy( sStr ):
keepcharacters = ('-','_')
return "".join(c if c.isalnum() or c in keepcharacters else 'I' for c in sStr).strip()
def makeDirname( sFln ):
sDir = os.path.dirname( sFln )
if 0<len(sDir):
try:
os.makedirs( sDir, exist_ok=True)
except:
print( "Failed to create dir '", sDir, "'.", sep='' )
return False
return True
def openFile_autoDir( sFln, sMode ):
makeDirname( sFln )
return open( sFln, sMode )
## stringify a container, inserting a given prefix before each element
def strNL( prf, cnt ):
return prf + prf.join( [ str( el ) for el in cnt ] )