UTF-8 menos signo rechazado en los argumentos de la línea de comandos de Python
-
28-10-2019 - |
Pregunta
Estoy ejecutando Python 2.6 en Ubuntu Lucent y tengo problemas para obtener el signo menos en argumentos de línea de comandos negativos para interpretar correctamente, especialmente cuando la llamada al script se inicia a través del sistema operativo a través de Rails (usando retroceso). En particular, el signo menos parece estar llegando como UTF-8.
Cuando los argumentos de la línea de comandos se interpretan manualmente, como en:
lng = float(sys.argv[4])
desencadena el error:
ValueError: invalid literal for float(): ‐122.768
Como truco, puedo evitar esto coincidiendo con los primeros tres bytes como ' xe2', ' x80' y ' x90', y reemplazándolos con mi propio signo negativo.
Cuando los argumentos de línea de comandos se interpretan a través de Argparse (ver. 1.2.1), como en:
parser.add_argument('--coords', metavar='Coord', dest='coordinates', type=float, nargs=3, help='Latitude, Longitude, and Altitude')
desencadena el error:
sC.py: error: argument --coords: invalid float value: '\xe2\x80\x90122.76838'
¡Cualquier ayuda sería apreciada!
Solución
Es posible que tenga que usar su hack y decirle a Argparse que espere una cadena.
En cuanto a Python, su sistema y ROR están preocupados -
y ―
no están relacionados de ninguna manera. Si desea resolver este problema (en lugar de hackearlo), ha subido al código Rails y vea de dónde obtiene sus datos. En algún lugar a lo largo de la línea salida elegante fue importante.
Otros consejos
Sus datos de entrada contienen un carácter Unicode que no es el guión ASCII estándar.
import unicodedata as ud
data = '\xe2\x80\x90122.76838'
unicode_data = data.decode('utf8')
print repr(ud.name(unicode_data[0]))
print repr(ud.name(u'-')) # An ascii hyphen
Producción:
'HYPHEN'
'HYPHEN-MINUS'
Si bien pueden verse igual cuando se imprimen, no lo son. Restringir o desinfectar la entrada.
print float(unicode_data.replace(u'\N{HYPHEN}',u'-'))
Producción:
-122.76838