es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La cadena en el conjunto da resultados extraños.

Mi código está leyendo el encabezado de un archivo csv y convirtiéndolo en una tabla de búsqueda de columna nombre=>índice de columna:

class CSVOutput:
  def __init__(self, csv_file, required_columns):
    csv_reader = csv.reader(csv_file)

    # Construye una tabla de búsqueda para el encabezado
    self.header = {}
    for idx, column in enumerate(next(csv_reader)):
      print(f"{column.lower().strip()} == clave: {column.lower().strip() == 'key'}")
      print(f"{column.lower().strip()} es clave: {column.lower().strip() is 'key'}")
      self.header[column.lower().strip()] = idx

    print(self.header)

     # Cargar los datos de fila en la memoria/indexarlo contra la clave
     key_idx = self.header['key']

with open("test.csv") as csv_file:
    data = CSVOutput(csv_file, {})

Cuando lo ejecuto, obtengo la siguiente salida y error:

{'key': 0, 'col1': 1, 'col2': 2}

key == clave: Falso
key es clave: Falso
col1 == clave: Falso
col1 es clave: Falso
col2 == clave: Falso
col2 es clave: Falso

Traceback (most recent call last):
  File "D:\compare.py", line 74, in <module>
    actual_data = CSVOutput(act_csv, required_columns)
  File "D:\compare.py", line 40, in __init__
    key_idx = self.header['key']
KeyError: 'key'

Básicamente, parece haber una inequivalencia entre la literal ‘key’ y el ‘key’ que se carga desde el archivo. He intentado ver el archivo fuente en notepad++ con mostrar todos los símbolos activado, pero no veo ninguna diferencia. También he revisado el archivo csv en un editor hexadecimal y puedo ver que el inicio se ve así: Key, , siendo EF BB BF. No estoy seguro si esa es la fuente de mi problema, pero si lo es, ¿por qué no está eliminándolo strip() y cómo lo manejo?

¿Alguna idea?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema está con la codificación del archivo csv. Los caracteres EF BB BF al principio del archivo son una marca de orden de byte (BOM) para la codificación UTF-8. Esto hace que el método strip() no elimine correctamente el encabezado Key, lo que hace que la tabla de búsqueda no tenga una clave key.

    Para solucionarlo, puede utilizar la codificación utf-8-sig al abrir el archivo para eliminar el BOM:

    with open("test.csv", encoding="utf-8-sig") as csv_file:
        data = CSVOutput(csv_file, {})
    

    Esto debería eliminar el BOM y permitir que el método strip() elimine correctamente cualquier espacio en blanco inicial o final.

Comments are closed.