Python ayuda a leer el archivo csv que falla debido a los finales de línea

Estoy intentando crear esta secuencia de comandos que verificará el nombre del host de la computadora y luego buscaré en la lista maestra el valor para devolver el valor correspondiente en el archivo csv. Luego abre otro archivo y encuentra un reemplazo. Sé que esto debería ser fácil, pero no he hecho tanto en Python antes. Esto es lo que tengo hasta ahora …

masterlist.txt (tab delimited) Name UID Bob-Smith.local bobs Carmen-Jackson.local carmenj David-Kathman.local davidk Jenn-Roberts.local jennr 

Aquí está el script que he creado hasta ahora.

 #GET CLIENT HOST NAME import socket host = socket.gethostname() print host #IMPORT MASTER DATA import csv, sys filename = "masterlist.txt" reader = csv.reader(open(filename, "rU")) #PRINT MASTER DATA for row in reader: print row #SEARCH ON HOSTNAME AND RETURN UID #REPLACE VALUE IN FILE WITH UID #import fileinput #for line in fileinput.FileInput("filetoreplace",inplace=1): # line = line.replace("replacethistext","UID") # print line 

En este momento, está configurado para imprimir la lista maestra. No estoy seguro de si la lista necesita ser analizada y colocada en un diccionario o qué. Realmente necesito averiguar cómo buscar el primer campo para el nombre de host y luego devolver el campo en la segunda columna.

Gracias de antemano por tu ayuda, Aaron


ACTUALIZACIÓN : eliminé la línea 194 y la última línea de masterlist.txt y luego volví a ejecutar el script. Los resultados fueron los siguientes:

Rastreo (llamadas recientes más última):
Archivo “update.py”, línea 3, en la fila en csv.DictReader (open (fname), delimitador = ‘\ t’): Archivo “/System/Library/Frameworks/Python.framework/Versions/2.6/lib/ python2.6 / csv.py “, línea 103, en el siguiente archivo self.fieldnames” /System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/csv.py “, línea 90, en nombres de campo self._fieldnames = self.reader.next () _csv.Error: carácter de nueva línea visto en el campo sin comillas. ¿Necesita abrir el archivo en modo de nueva línea universal?

El script actual que se está utilizando es …

 import csv fname = "masterlist.txt" for row in csv.DictReader(open(fname), delimiter='\t'): print(row) 

Las dos apariciones de ‘\ xD5’ en la línea 194 y la última línea no tienen nada que ver con el problema.

El problema parece ser un error, un mensaje de error engañoso o una documentación incorrecta / vaga en el módulo csv de Python 2.6.

En el archivo, las líneas se terminan con ‘\ x0D’ aka ‘\ r’ en la tradición de Mac clásica. La última línea no está terminada, pero eso no tiene nada que ver con el problema.

Los documentos para csv.reader dicen “Si csvfile es un objeto de archivo, debe abrirse con la bandera ‘b’ en las plataformas donde eso haga una diferencia”. Es ampliamente conocido que hace una diferencia en Windows. Sin embargo, abrir el archivo con ‘rb’ o ‘r’ no hace ninguna diferencia en este caso, sigue siendo el mismo mensaje de error.

Los documentos para csv.Dialect.lineterminator dicen “La cadena utilizada para terminar las líneas producidas por el escritor. El valor predeterminado es ‘\ r \ n’. Nota: El lector está codificado para reconocer ‘\ r’ o ‘\ n ‘como final de línea, e ignora el determinador de línea. Este comportamiento puede cambiar en el futuro “. Parece estar reconociendo ‘\ r’ como nueva línea pero no como fin de línea / fin de campo.

El mensaje de error “_csv.Error: carácter de nueva línea visto en un campo sin comillas: ¿necesita abrir el archivo en modo de nueva línea universal?” es confuso; se reconoce ‘\ r’ como una nueva línea, pero no se trata de una nueva línea como un fin de línea (y, por lo tanto, implícitamente un final de campo).

Parece necesario abrir el archivo en modo ‘rU’ para que funcione “. No está claro por qué el mismo ‘\ r’ reconocido en el modo de nueva línea universal es mejor.

Para iterar sobre un lector harías:

 >>> import csv >>> for row in csv.DictReader(open(fname), delimiter='\t'): print(row) {'Name': 'Bob-Smith.local', 'UID': 'bobs'} {'Name': 'Carmen-Jackson.local', 'UID': 'carmenj'} {'Name': 'David-Kathman.local', 'UID': 'davidk'} {'Name': 'Jenn-Roberts.local', 'UID': 'jennr'} 

Pero ya que quieres asociar Name con UID :

 >>> reader = csv.reader(open("masterlist.txt"), delimiter='\t') >>> _ = next(reader) # just discarding header >>> d = dict(reader) >>> d['Carmen-Jackson.local'] 'carmenj' 

Yo llenaría un diccionario como este:

 >>> import csv >>> name_to_UID = {} >>> for row in csv.DictReader(open(filename, 'rU'), delimiter='\t'): name_to_UID[row['Name']] = row['UID'] >>> name_to_UID['Carmen-Jackson.local'] 'carmenj'