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.

sobre la escritura y lectura de un archivo csv en Visual Studio

Estoy tratando de escribir un campo en un archivo CSV y luego imprimirlo en la consola, sin embargo, cuando imprimo la primera línea después de escribirla, muestra el número 10 (que no estoy agregando al campo). Luego, cuando solo leo el archivo e imprimo, la segunda línea muestra lo que se suponía que debía escribir en el primer intento, pero muestra \ufeff.

Aquí está el código

from csv import DictReader

with open('loopbacks2.csv', mode='r+', encoding='utf-8-sig') as csv_file:
    client_details = DictReader(csv_file)
    for client in client_details:
        client['State'] = csv_file.write('Completed')
        print(client)

El archivo CSV original se ve así:

Name,Loopback,Object,IP,SSH,State
Device1,192.168.1.2,host1,8.7.6.5/32,2022
Device2,192.168.1.3,host2,8.7.7.2/32,2222

Cuando ejecuto el script, esta es la salida:

{'Name': 'Device1', 'Loopback': '192.168.1.2', 'Object': 'host1', 'IP': '8.6.5.6/32', 'SSH': '2022', 'State': 10}

Luego abro el archivo y se ve así:

Name,Loopback,Object,IP,SSH,State
Device1,192.168.1.2,host1,8.7.6.5/32,2022
Device2,192.168.1.3,host2,8.7.7.2/32,2222,Completed

Luego, si comento la parte de escritura y solo la imprimo como en este código:

from csv import DictReader

with open('loopbacks2.csv', mode='r+', encoding='utf-8-sig') as csv_file:
    client_details = DictReader(csv_file)
    for client in client_details:
        #client['State'] = csv_file.write('Completed')
        print(client)

Entonces el resultado muestra esto:

{'Name': 'Device1', 'Loopback': '192.168.1.2', 'Object': 'host1', 'IP': '8.6.5.6/32', 'SSH': '2022', 'State': ''}
{'Name': 'Device1', 'Loopback': '192.168.1.2', 'Object': 'host1', 'IP': '8.6.5.6/32', 'SSH': '2022', 'State': 'Completed'}

¿Qué estoy olvidando o confundiendo?

Gracias de antemano.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema está en el uso del método csv_file.write() en la línea client['State'] = csv_file.write('Completed').

    El método write() devuelve el número de caracteres escritos en el archivo, que en este caso es 9 (la longitud de la cadena ‘Completed’). Sin embargo, ese valor también se asigna a la clave ‘State’ en el diccionario client, por eso ves el número 10 (9 + 1 carácter de nueva línea) en la salida.

    Para corregir esto, simplemente puedes asignar la cadena ‘Completed’ a la clave ‘State’ en lugar de usar el método write(). De esta manera:

    from csv import DictReader
    
    with open('loopbacks2.csv', mode='r+', encoding='utf-8-sig') as csv_file:
        client_details = DictReader(csv_file)
        for client in client_details:
            client['State'] = 'Completed'
            print(client)
    

    Esto debería darte la salida deseada:

    {'Name': 'Device1', 'Loopback': '192.168.1.2', 'Object': 'host1', 'IP': '8.7.6.5/32', 'SSH': '2022', 'State': 'Completed'}
    {'Name': 'Device2', 'Loopback': '192.168.1.3', 'Object': 'host2', 'IP': '8.7.7.2/32', 'SSH': '2222', 'State': 'Completed'}
    

    En cuanto al carácter \ufeff que aparece al leer e imprimir el archivo, es una marca de orden de bytes (BOM) que algunos editores de texto o programas añaden al archivo. En realidad no forma parte de tus datos. Puedes simplemente ignorarlo o eliminarlo usando funciones de manipulación de cadenas como strip().

Comments are closed.