Source code for andes.io.txt
"""
Output TXT file formatter.
"""
import os
from typing import Iterable
from andes.shared import np
[docs]def dump_data(text, header, rowname, data, file, width=18, precision=5):
out = ''
os.makedirs(os.path.abspath(os.path.dirname(file)), exist_ok=True)
with open(file, 'w') as fid:
for Text, Header, Rowname, Data in zip(text, header, rowname, data):
# Write Text
if Text:
fid.writelines(Text)
# determine the width for the first column (usually names)
width_first = width
if isinstance(Rowname, Iterable) and len(Rowname) > 0:
for item in Rowname:
if isinstance(item, Iterable) and len(item) > width_first:
width_first = len(item)
# Write Header
if Header:
ncol = len(Header)
s = ' ' * width_first
s += '{:>{width}s}' * ncol + '\n'
fid.writelines(s.format(*Header, width=width))
fid.write('\n')
# Append Rowname to Data
# Data is a list of column lists
if Rowname is not None:
ncol = 0
for idx, item in enumerate(Rowname): # write by row as always
if Data is None:
out = ''
elif isinstance(Data, (int, float, str)):
out = [Data]
elif isinstance(Data, (list, tuple, np.ndarray)):
if isinstance(Data[0], (int, float)): # is a list of numbers
out = [Data[idx]]
elif isinstance(Data[0], (list, np.ndarray)): # list of list in Data
ncol = len(Data)
out = [Data[i][idx] for i in range(ncol)]
else:
print(Data)
print('Unexpected Data during output, in formats/txt.py')
s = '{:{width_first}s}' # for row header
for ii, col in enumerate(out):
if isinstance(col, (int, float)):
s += '{:>{width}.{precision}g}'
elif isinstance(col, str):
if len(col) > width:
out[ii] = col[:width]
s += '{:>{width}s}'
elif col is None:
out[ii] = 'None'
s += '{:>{width}s}'
else:
pass
s += '\n'
fid.write(
s.format(
str(item), *out, width_first=width_first, width=width, precision=precision))
fid.write('\n')