1 votos

Utilizando un archivo .CSV como un diccionario externo, pero no puedo encontrar una forma de hacer referencia/crear una clave para Null con el fin de asignarle un valor utilizando ArcPy

Estoy usando ArcGIS Desktop: ArcMap 10.8.1 y Python 2.7.18. Tengo un script que utiliza un archivo .CSV como un diccionario externo (en lugar de crear un diccionario dentro del script) pero no puedo encontrar una manera de hacer referencia/crear una clave para Null para asignarle un valor.

Mi .CSV está formateado de la siguiente manera:

Especie

Científico

Tipo

Manzana

Malus pumila

DECID

Roble Bur

Quercus macrocarpa

DECID

Null

x

x

Y aquí está el fragmento de código:

with open(trees_csv, mode='r') as tree_dictionary:
    csvreader = csv.reader(tree_dictionary)
    next(csvreader)
    scientific_species = {}
    tree_type = {}
    for coloumn in csvreader:
        scientific_species[coloumn[0]] = coloumn[1]
        tree_type[coloumn[0]] = coloumn[2]
with da.UpdateCursor(points, fields) as tree_cursor:
    for row in tree_cursor:
        row[1] = scientific_species.get(row[0], '')
        row[5] = tree_type.get(row[0], '')
        tree_cursor.updateRow(row)

No importa cómo intente hacer referencia a Null en mi .CSV, sigo obteniendo espacios en blanco en la tabla de atributos en lugar de 'x'.

Por lo tanto, ¿de qué manera puedo hacer que mi diccionario reconozca los valores Null?

0voto

James Muscat Puntos 156

Un poco largo para ser solo un comentario.

Si fuera tú:

Primero revisaría tu diccionario y asegúrate de que aparezca como debe ser simplemente imprimiéndolo en la consola.

Si se ve bien, entonces el siguiente punto sería mirar las funciones get(). get() básicamente hace una comparación para la clave y opcionalmente devuelve un valor si la clave no existe. Me enfocaría aquí ya que parece que el resto de los campos se llenan correctamente.

Compara el valor nulo que tienes en tu diccionario con el valor en tu conjunto de datos. ¿El caso es el mismo? ¿No haces ninguna conversión de mayúsculas y minúsculas antes de comparar valores? "null" != "Null"

Hablando de cadenas, ¿estás eliminando los espacios en blanco? Si es una entrada humana, especialmente en dispositivos táctiles, los espacios en blanco innecesarios son un problema y a veces difíciles de encontrar. Buen caso para por qué deberías usar dominios en tus atributos.

Finalmente, ¿estás comparando la cadena "Null" con el objeto Python None? Si tu campo de atributo realmente es nulo, es decir, no hay ningún valor en el campo, entonces el valor de retorno del elemento de la fila será el objeto None. El objeto None no es lo mismo que "Null". "null" != "Null" != None != "None"

Si en realidad estás comparando con None, puedes hacer lo siguiente:

with open(trees_csv, mode='r') as tree_dictionary:
    csvreader = csv.reader(tree_dictionary)
    next(csvreader)
    scientific_species = {}
    tree_type = {}
    for coloumn in csvreader:
        scientific_species[coloumn[0]] = coloumn[1]
        tree_type[coloumn[0]] = coloumn[2]
with da.UpdateCursor(points, fields) as tree_cursor:
    for row in tree_cursor:
        row[1] = scientific_species.get(row[0], 'x')
        row[5] = tree_type.get(row[0], 'x')
        tree_cursor.updateRow(row)

Donde el get() hace todo el trabajo insertando automáticamente la "x" cuando encuentra el objeto None, campo vacío, mientras recorres las filas. Aunque, con esto, cualquier entrada no incluida en el diccionario también tendrá asignada una "x".

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X