[GRASS-dev] [GRASS GIS] #3639: Write table like output directly to database
GRASS GIS
trac at osgeo.org
Wed Sep 25 11:55:12 PDT 2019
#3639: Write table like output directly to database
--------------------------+----------------------------------
Reporter: sbl | Owner: grass-dev@…
Type: enhancement | Status: new
Priority: normal | Milestone: 8.0.0
Component: Database | Version: svn-trunk
Resolution: | Keywords: table,database,write
CPU: Unspecified | Platform: Unspecified
--------------------------+----------------------------------
Comment (by sbl):
I am considering adding a function to the Python scripting library for
parsing table-like stdout from GRASS modules into Numpy arrays. Nothing
complicated, but probably a convenient wrapper function!?
See:
{{{
def stdout2numpy(stdout=None, sep=',', names=False, null_value=None,
fill_value=None, comments='#', usecols=None):
"""Read table-like output from grass modules as Numpy array;
format instructions are handed down to Numpys genfromtxt function
param str|byte stdout: tabular stdout from GRASS GIS module call
param str sep: Separator delimiting columns
param list names: List of strings with names for columns
param str null_value: Characters representing the no-data value
param str fill_value: Value to fill no-data with
param str comments: Character that
param list usecols: List of columns to import
"""
import numpy as np
from io import BytesIO
if type(stdout) == str:
stdout = gscript.encode(stdout)
elif type(stdout) != byte:
gscript.fatal(_('Unsupported data type'))
np_array = np.genfromtxt(BytesIO(stdout),
missing_values=null_value,
filling_values=fill_value,
usecols=usecols,
names=names,
dtype=None, delimiter=sep)
return np_array
}}}
or alternatively as np_parse_command (equivalent to parse_command()):
{{{
def np_parse_command(*args, **kwargs):
"""Passes all arguments to read_command, then parses the output
using Numpys genfromtxt() function to generate a Numpy array from
table like output.
Parsing options in Numpys genfromtxt() function can be
optionally given by <em>parse</em> dictionary, e.g.
::
parse_command(..., parse = { 'delimiter' : '|' }))
As far as possible, at least standard parser options in GRASS
commands are handed down and translated to genfromtxt()
automatically, e.g. separator (GRASS) -> delimiter (Numpy).
import numpy as np
from io import BytesIO
stdout = read_command(*args, **kwargs)
if type(stdout) == str:
stdout = gscript.encode(stdout)
elif type(stdout) != byte:
gscript.fatal(_('Unsupported data type'))
filling_values = parse['filling_values'] if 'filling_values' in parse
else np.nan
usecols = parse['usecols'] if 'usecols' in parse else None
names = parse['names'] if 'names' in parse else None
dtype = parse['dtype'] if 'dtype' in parse else None
# Check if separator is specified in GRASS command
if 'delimiter' not in parse:
if 'separator' in args:
parse['delimiter'] = args['separator']
elif 'separator' in kwargs:
parse['delimiter'] = kwargs['separator']
else:
parse['delimiter'] = ','
# Check if null_value is specified in GRASS command
if 'missing_values' not in parse:
if 'null_value' in args:
parse['missing_values'] = args['null_value']
elif 'null_value' in kwargs:
parse['missing_values'] = kwargs['null_value']
else:
parse['missing_values'] = '*'
np_array = np.genfromtxt(BytesIO(stdout), **parse)
return np_array
}}}
That would probably be a first step for a Python function that can write
output to DB...
Any thoughts/opinions?
--
Ticket URL: <https://trac.osgeo.org/grass/ticket/3639#comment:2>
GRASS GIS <https://grass.osgeo.org>
More information about the grass-dev
mailing list