Python hilft beim Lesen der CSV-Datei aufgrund von Zeilenenden

8

Ich versuche, dieses Skript zu erstellen, das den Computer-Host-Namen überprüft und dann eine Master-Liste nach dem Wert sucht, um einen entsprechenden Wert in der CSV-Datei zurückzugeben. Ö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 habe ...

%Vor%

Hier ist das Skript, das ich bisher erstellt habe

%Vor%

Im Moment ist es nur eingestellt, um 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 habe die Zeile 194 und die letzte Zeile aus masterlist.txt entfernt und das Skript dann erneut ausgeführt. Die Ergebnisse waren die folgenden:

  

Traceback (letzter Aufruf zuletzt):
  Datei "update.py", Zeile 3, in       für Zeile in csv.DictReader (offen (fname),   delimiter = '\ t'): Datei   "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/csv.py",   Zeile 103, im nächsten       self.fieldnames Datei "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/csv.py",   Zeile 90, in Feldnamen       self._fieldnames = self.reader.next ()   _csv.Error: Zeilenumbruchzeichen in einem nicht angegebenen Feld - müssen Sie öffnen   die Datei im Universal-Newline-Modus?

Das aktuelle Skript ist ...

%Vor%     
Aaron 28.05.2010, 16:16
quelle

3 Antworten

20

Die beiden Vorkommen von '\ xD5' in Zeile 194 und die letzte Zeile haben nichts mit dem Problem zu tun.

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

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

Die Dokumentation für csv.reader sagt: "Wenn csvfile ein Dateiobjekt ist, muss es mit der 'b'-Flagge 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 Dokumentation für den csv.Dialect.lineterminator lautet "Die zum Beenden verwendete Zeichenfolge Zeilen, die von dem Writer erstellt werden. "\ r \ n". Hinweis: der Leser ist fest codiert, um '\ r' oder '\ n' als Zeilenende zu erkennen, und ignoriert den Lineterminator. Dieses Verhalten kann Veränderung in der Zukunft. " Es scheint "\ r" als neue Zeile zu erkennen, aber nicht als Ende der Zeile / Ende des Feldes.

Die Fehlermeldung "_csv.Error: Zeichen für neue Zeile im Feld ohne Anführungszeichen - 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 erscheint notwendig, die Datei im "rU" -Modus zu öffnen, damit sie "funktioniert". Es ist nicht ersichtlich, warum das gleiche '\ r' im Universal-Newline-Modus besser ist.

    
John Machin 29.05.2010 05:26
quelle
2

Um über einen Reader zu iterieren, tun Sie Folgendes:

%Vor%

Aber da Sie Name mit UID verknüpfen möchten:

%Vor%     
SilentGhost 28.05.2010 16:23
quelle
2

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

%Vor%     
taleinat 28.05.2010 20:37
quelle

Tags und Links