Skip to content Skip to sidebar Skip to footer

Parsing A String With Spaces From Command Line In Python

Is there a way to call my program in python and pass it a string I want it to parse without declaring the string as 'String I want to parse' but as String I want to parse import ar

Solution 1:

The "correct" approach is as already mentioned. But OP specifically asked:

I want it to parse without declaring the string as 'String I want to parse' but as String I want to parse

It is possible to do this with a custom action. The advantage of this approach over simply joining sys.argv[1:] is to address the following:

Is there anyway to tell the script to account for spaces and take the input as one string until either the end of the input is reached or another parse argument such as -s is reached?

We can add other options without them being mopped up into the 'string' argument:

import argparse

classMyAction(argparse.Action):
    def__call__(self, parser, namespace, values, option_string=None):
        setattr(namespace, self.dest, ' '.join(values))

parser = argparse.ArgumentParser(description='Parse input string')
parser.add_argument('string', help='Input String', nargs='+', action=MyAction)
parser.add_argument('--extra', '-s', help='Another Option!')

args = parser.parse_args()
print args

Demo:

$ python example.py abc defghi
Namespace(extra=None, string='abc def ghi')
$ python example.py abc def ghi -s hello
Namespace(extra='hello', string='abc def ghi')
$ python example.py -s hello abc defghi
Namespace(extra='hello', string='abc def ghi')

Solution 2:

If you really want to use argparse add nargs='+' or nargs='*' to add_argument:

import argparse
parser = argparse.ArgumentParser(description='Parse input string')
parser.add_argument('string', help='Input String', nargs='+')
args = parser.parse_args()
arg_str = ' '.join(args.string)
print(arg_str)

python test.py abc xyz will produce abc xyz. * means that empty list is ok and + requires at least one word.

Alternatively you may just user sys.arg if you don't need anything fancy:

import sys
arg_str = ' '.join(sys.argv[1:])  # skip name of fileprint(arg_str)

And if I may, I really like docopt so I would recommend it:

"""Usage:
  test.py <input>...
"""import docopt
arguments = docopt.docopt(__doc__)
input_argument = ' '.join(arguments['<input>'])
print(input_argument)

Docopt generates parser based on help message, it's so great.

Solution 3:

The problem is you give five arguments instead of one. Put your string with space between double quote and it will work.

~ ❯❯❯ python test.py asd asd
usage: test.py [-h] string
test.py: error: unrecognized arguments: asd
~ ❯❯❯ python test.py "asd asd"
asd asd
~ ❯❯❯

Solution 4:

You could just concatenate all arguments together until an argument starts with -

import sys

new_args = []
forargin sys.argv:
   ifarg.startswith("-") orlen(new_args) == 0:
      new_args.append(arg)
   else:
      new_args[-1] += arg

Post a Comment for "Parsing A String With Spaces From Command Line In Python"