2010-05-28 4 views
8

Ich versuche, dieses Skript, das den Computer Host-Namen überprüfen wird dann eine Master-Liste für den Wert suchen, um einen entsprechenden Wert in der CSV-Datei zurückgeben. Öffnen Sie dann eine andere Datei und suchen Sie nach einem Ersatz. Ich weiß, das sollte einfach sein, aber vorher noch nicht so viel in Python. Hier ist, was ich bisher ...Python Hilfe lesen CSV-Datei wegen Line-Ends fehlgeschlagen

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

Hier ist das Skript, das ich geschaffen habe bisher

#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 

Im Moment ist es nur stellen Sie die Master-Liste zu drucken. Ich bin nicht sicher, ob die Liste geparst und in ein Wörterbuch oder was platziert werden muss. Ich muss wirklich herausfinden, wie man das erste Feld nach dem Hostnamen durchsucht und dann das Feld in der zweiten Spalte zurückgibt.

Vielen Dank im Voraus für Ihre Hilfe, Aaron


UPDATE: Ich entfernte Linie 194 und die letzte Zeile von MasterList.txt und dann das Skript wieder lief. Die Ergebnisse waren folgende:

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?

das aktuelle Skript ...

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

Antwort

2

Um iterieren Sie tun würde:

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

Aber da Sie möchte Name mit UID verbinden:

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

Ich bin mir nicht sicher, ob ich verstehe. Die masterlist.txt hat ungefähr 300 Reihen Wie kann ich die UID für einen gegebenen Namen extrahieren, der vom Hostnamen kommt? – Aaron

+0

@user: sehe meinen redigieren – SilentGhost

+0

Ok, ich sehe, was Sie sagen. So verursacht dieses ein Wörterbuch und verbindet sie. Wie würde Ich suche dann das Wörterbuch nach dem "Namen"? Auch scheint ich einen Fehler zu bekommen, wenn ich versuche, das zu laufen Skript Fehler: Zeichen für neue Zeile in nicht angegebenen Feld gesehen - müssen Sie die Datei im Universal-Newline-Modus öffnen? – Aaron

2

Ich würde ein Wörterbuch wie folgt füllen:

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

Die beiden Vorkommen von ‚\ XD5‘ in Zeile 194 und die letzte Zeile nichts mit dem Problem zu tun hat.

Das Problem scheint ein Fehler oder eine irreführende Fehlermeldung oder falsche/vage Dokumentation im Python 2.6 CSV-Modul.

In der Datei werden die Zeilen durch '\ x0D' aka '\ r' in der Tradition des klassischen Mac beendet. Die letzte Zeile wird nicht beendet, aber das hat nichts mit dem Problem zu tun.

Die docs for csv.reader sagen "Wenn csvfile ein Dateiobjekt ist, muss es mit dem 'b' Flag auf Plattformen geöffnet werden, wo das einen Unterschied macht." Es ist allgemein bekannt, dass es unter Windows einen Unterschied macht. Das Öffnen der Datei mit 'rb' oder 'r' macht in diesem Fall jedoch keinen Unterschied - immer noch dieselbe Fehlermeldung.

Die docs for csv.Dialect.lineterminator sagen "Die Zeichenfolge zum Beenden von Zeilen durch den Writer produziert. Es ist standardmäßig auf '\ r \ n'. Hinweis: Der Leser ist hart-codiert entweder '\ r' oder '\ n' als zu erkennen Ende der Zeile und ignoriert den Lineterminator. Dieses Verhalten kann sich in der Zukunft ändern. " Es scheint "\ r" als neue Zeile, aber nicht als Zeilenende/Ende des Feldes zu erkennen.

Die Fehlermeldung "_csv.Error: Zeilenumbruch Zeichen in nicht aufgeführten Feld - müssen Sie die Datei im Universal-Newline-Modus öffnen?"ist verwirrend; es wird '\ r' als neue Zeile erkannt, aber es behandelt keine neue Zeile als Zeilenende (und damit implizit als End-of-Field).

Es scheint notwendig, das zu öffnen Datei im "rU" -Modus, um es zu "arbeiten". Es ist nicht ersichtlich, warum das gleiche '\ r' im Universal-Newline-Modus besser ist.

+1

Sehr interessant. Ich habe den 'rU'-Modus beim Öffnen der Datei hinzugefügt und es hat sofort funktioniert! Ich schätze deine Hilfe sehr. Aus irgendeinem Grund, wenn ich versuche, name_to_UID ['Aaron-Hoffman.local'] zu verwenden, läuft das Skript gut, aber die UID wird nicht ausgegeben. Aber wenn ich versuche, andere Leute wie name_to_UID [ 'Beth-Johnson'] es gibt mir ... Traceback (jüngste Aufforderung zuletzt): File "update.py", Zeile 6, in name_to_UID [ 'Beth Johnson.local '] KeyError:' Beth-Johnson.local ' – Aaron

+0

(1) Wertschätzung wird gezeigt, indem man hochstimmt und akzeptiert (2) Sie scheinen zwei neue Probleme zu haben; Starten Sie eine neue Frage und zeigen Sie Ihr Skript und die vollständige Traceback und eine SAMPLE-Datei (sagen wir 5 Zeilen), die das Problem aufweist. Andernfalls werden Sie nur wilde Vermutungen wie folgt erhalten: Neues Problem 1 wird verursacht durch 'name_to_UID ['Aaron-Hoffman.local']' (ein Ausdruck, der ausgewertet und dann ignoriert wird, wenn er nicht im interaktiven Interpreter ist) anstelle von 'name_zur_UID drucken ['Aaron-Hoffman.local'] 'und neues Problem 2 wird durch Tippfehler verursacht –

+0

Was ist der 'U' Parameter? Es ist nicht in den Python-Dokumenten aufgeführt. – thebossman

Verwandte Themen