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?
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étodostrip()
no elimine correctamente el encabezadoKey
, lo que hace que la tabla de búsqueda no tenga una clavekey
.Para solucionarlo, puede utilizar la codificación
utf-8-sig
al abrir el archivo para eliminar el BOM:Esto debería eliminar el BOM y permitir que el método
strip()
elimine correctamente cualquier espacio en blanco inicial o final.