[GRASS-dev] Parsing output of r.category which includes labels

Moritz Lennert mlennert at club.worldonline.be
Mon Aug 20 04:40:36 PDT 2018

On 19/08/18 22:19, Nikos Alexandris wrote:
> If I am not wrong, all use cases of `read_command()` [0, 1],
> in (at least) the grass-addons repository, do not consider an output
> from `r.category` which includes labels.
> [0] https://grass.osgeo.org/grass74/manuals/libpython/script.html?highlight=read_command#script.core.read_command
> [1] https://grass.osgeo.org/grass75/manuals/libpython/script.html?highlight=read_command#script.core.read_command
> I work on such a case where category numbers come along with label strings.
> To read category numbers, I came up with:
> ```
> import grass.script as grass
> grass.read_command('r.category', map=base).split('\n')[:-1]
> for category in categories:
>          category = category.split('\t')[0]
> ```
> Is there any other command that will do this better? Would you consider
> adding one?

If all the modules are trying to do is get a list of category values, 
your approach seems the right one to me, but a simple list comprehension 
should do the trick in one line:

cats = [int(x[0]) for x in [x.split('\t') for x in 
g.read_command('r.category', map='RasterMap').splitlines()]]

This will work whether there are labels or not. IMHO, there is no need 
to use anything more sophisticated.

Especially since a

grep -R "r.category" * | grep read_command

only gives 4 hits:

imagery/i.segment.uspo/i.segment.uspo.py:            numsegments = 
raster/r.geomorphon/testsuite/test_r_geom.py:        category = 
read_command('r.category', map=self.outele)
raster/r.geomorphon/testsuite/test_r_geom.py:        category = 
read_command('r.category', map=self.outsint)
raster/r.neighborhoodmatrix/r.neighborhoodmatrix.py:    numneighbors = 

The first and last only read the length (number) of categories, so this 
isn't an issue.

Have you met other instances ?


More information about the grass-dev mailing list