El analizador en python3 no toma valores delimitadores de la línea de comandos a través de argparse

He escrito un script simple como una herramienta avanzada para mis requisitos awk / sed . En el script, comparo dos archivos en base a los valores de una columna del archivo de consulta y luego extraigo entradas completas del archivo maestro. La secuencia de comandos le permite introducir los valores para las columnas y los delimitadores para cada archivo.

El problema es que las opciones de ‘delimitador’ no son reconocidas por el script cuando se dan desde la línea de comandos.

Aquí está mi código (parcial):

 ##- - - - - - - -- - - - - - Arguments - - - - - - - - - - - - - -## parser = argparse.ArgumentParser() ## Command line options parser.add_argument("-m", "--master", dest="master", help="master file") parser.add_argument("-q", "--query", dest="query", help="queries to be extracted") parser.add_argument("-d", "--delimiter", dest="delimiter", default='\t', help="delimiter in master") parser.add_argument("-p", "--position", dest="position", default='1', help="position/column of value in master") parser.add_argument("-d2", "--delimiter2", dest="delimiter2", default='\t', help="delimiter in query") parser.add_argument("-p2", "--position2", dest="position2", default='1', help="position/column of value in query") args = parser.parse_args() def Extractor(master, query): out_file = ('%s_matched_%s' % (query,master)) fh_out = open(out_file, 'w') query_set = () ## To unique query set for i in query: key = i.split('args.delimiter2')[int(args.position2)] ## Key is the value on which matching will be done query_set.add(key) 

Entonces, como ve, tomo las opciones para el delimitador ‘archivo de consulta’ desde la línea de comando y las uso en el script a través de argparse , pero eso no funciona. Solo funciona si menciono explícitamente el delimitador en el script como:

 key = i.split('\t')[args.position2] ## Key is the value on which matching will be done 

La opción de línea de comando que doy es:

 $ py3 ExtractHeaders_v01.py -m ABC.csv -q XYZ.list -d2 \t -d , -p 1 -p2 0 

dónde

  • ABC.csv es el archivo maestro del que se extraen las entradas.
    • La segunda columna se usará para emparejar ( -p 1 )
    • Su delimitador es coma ( -d , )
  • XYZ.list es el archivo de consulta.
    • La primera columna se usará para emparejar ( -p2 0 )
    • Su delimitador es tab ( -d2 \t ).

Por favor, ayúdeme a entender por qué los delimitadores no son usados ​​por el script cuando se dan desde la línea de comandos.

También puede pasar el carácter de la Tab en un shell * nix (bash, por ejemplo) presionando Ctrl+V seguido de la Tab entre comillas (simple o doble), es decir, escriba " Ctrl+V Tab " .

Su shell está interpretando el \t en su línea de comando y lo que se pasa a Python es, probablemente, una sola t . Intente \\t o '\t' para obtener la secuencia de escape literal de dos caracteres en argv . Entonces deberás liberar esta cadena en Python:

 delimiter = delimiter.decode("string-escape")