2010-05-28 13 views
8

Sto provando a creare questo script che controllerà il nome host del computer, quindi cercherà un elenco master per il valore per restituire un valore corrispondente nel file csv. Quindi apri un altro file e fai una ricerca e sostituisci. So che questo dovrebbe essere facile, ma non ho mai fatto così tanto in Python. Ecco quello che ho finora ...Python aiuta a leggere il file csv in errore a causa di terminazioni di linea

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

Ecco lo script che ho creato finora

#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 

In questo momento, è solo impostata per stampare l'elenco principale. Non sono sicuro se la lista debba essere analizzata e inserita in un dizionario o cosa. Ho davvero bisogno di capire come cercare il primo campo per il nome host e quindi restituire il campo nella seconda colonna.

Grazie in anticipo per il vostro aiuto, Aaron


UPDATE: Ho rimosso la linea 194 e ultima linea da MasterList.txt e poi ri-esecuzione dello script. I risultati sono stati i seguenti:

Traceback (most recent call last):
File "update.py", line 3, in for row in csv.DictReader(open(fname), delimiter='\t'): File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/csv.py", line 103, in next self.fieldnames File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/csv.py", line 90, in fieldnames self._fieldnames = self.reader.next() _csv.Error: new-line character seen in unquoted field - do you need to open the file in universal-newline mode?

Lo script corrente in uso è ...

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

risposta

2

Per iterare su un lettore faresti:

>>> 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'} 

Ma dal momento che desidera associare Name con UID:

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

io non sono sicuro di aver capito. il MasterList.txt ha . circa 300 righe Come posso estrarre l'UID per un determinato nome che deriva dal nome host – Aaron

+0

@user: vedere la mia modifica – SilentGhost

+0

Ok, vedo quello che stai dicendo Quindi questo crea un dizionario e li associa Come direbbe.. ho poi fare la ricerca sul dizionario per il 'nome'? Inoltre, mi sembra di essere sempre un errore quando provo a fare funzionare il script Errore: carattere di nuova riga visto nel campo non quotato - è necessario aprire il file in modalità universale-newline? – Aaron

2

vorrei popolare un dizionario come questo:

>>> 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' 
20

Le due ricorrenze di '\ XD5' in linea 194 e l'ultima linea non hanno nulla a che fare con il problema.

Il problema sembra essere un bug, o un messaggio di errore fuorviante, o una documentazione errata/vaga, nel modulo csv Python 2.6.

Nel file, le linee sono terminate da '\ x0D' alias '\ r' nella tradizione del Mac classico. L'ultima riga non è terminata, ma questo non ha nulla a che fare con il problema.

Il docs for csv.reader dice "Se csvfile è un oggetto file, deve essere aperto con il flag 'b' sulle piattaforme in cui ciò fa la differenza." È noto che fa la differenza su Windows. Tuttavia, l'apertura del file con 'rb' o 'r' non fa alcuna differenza in questo caso - continua lo stesso messaggio di errore.

Il docs for csv.Dialect.lineterminator dire "La stringa usata per terminare le linee prodotto dallo scrittore Il valore predefinito è '\ r \ n' Nota:.. Il lettore è hard-coded per riconoscere uno '\ r' o '\ n' come end-of-line e ignora il lineterminatore. Questo comportamento potrebbe cambiare in futuro. " Sembra che riconosca "\ r" come nuova riga ma non come fine riga/fine campo.

Il messaggio di errore "_csv.Error: carattere di nuova riga visualizzato nel campo non quotato - è necessario aprire il file in modalità universale-newline?"è confuso, è riconosciuto '\ r' come una nuova riga, ma non sta trattando new-line come un fine linea (e quindi implicitamente alla fine del campo)

Sembra necessario aprire il file in modalità 'ru' per arrivare al "lavoro". non è chiaro il motivo per cui lo stesso '\ r' riconosciuto in modalità universale-ritorno a capo sia migliore.

+1

Molto interessante. Ho aggiunto la modalità 'rU' quando ho aperto il file e ha funzionato subito! Apprezzo molto il tuo aiuto. Per qualche ragione, quando provo ad usare name_to_UID [ 'Aaron-Hoffman.local'] lo script verrà eseguito bene, ma non emette l'UID. Ma se provo altre persone come name_to_UID [ 'Bet-Johnson'] mi dà ... Traceback (chiamata più recente scorso): file "update.py", la linea 6, in name_to_UID [ 'Beth- Johnson.local '] KeyError: 'Bet-Johnson.local' – Aaron

+0

(1) l'apprezzamento è dimostrato dal up-voto e accettare (2) ti sembra di avere due nuovi problemi; avvia una NUOVA domanda e mostra il tuo script e il traceback completo e un file SAMPLE (diciamo 5 righe) che presenta il problema. In caso contrario, sarà solo ottenere congetture selvagge in questo modo: 1 nuovo problema è causato da avere 'name_to_UID [ 'Aaron-Hoffman.local']' (espressione che viene valutata e poi ignorato quando non è in l'interprete interattivo) invece di 'stampa name_to_UID ['Aaron-Hoffman.local'] 'e il nuovo problema 2 è causato da errori di battitura –

+0

Che cos'è il parametro 'U'? Non è elencato nei documenti Python. – thebossman

Problemi correlati