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.
davy.ai
Parece que el problema está en el uso del método
csv_file.write()
en la líneaclient['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 diccionarioclient
, 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:Esto debería darte la salida deseada:
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 comostrip()
.