writer.unparse - sortiert Ausgabe

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
meller
User
Beiträge: 4
Registriert: Mittwoch 17. Januar 2007, 19:17

Guten Abend,

ich bin völliger newbe in Sachen python und habe ein Problemchen.Für euch Profis bestimmt kein Problem:

Ich habe eine csv Datei mit dem inhalt:
cat mod.csv

Code: Alles auswählen

Externe Kontakte;domain.net;Martin Eller;mail;Martin.Eller@koeln.de
Mit dem Code

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

import csv
from ldif import LDIFWriter

#INPUT_CODEC = 'latin-1'

csv_file = open('mod.csv', 'rb')
ldif_file = open('mod.ldif', 'wb')

reader = csv.reader(csv_file, delimiter=';')
writer = LDIFWriter(ldif_file)

for row in reader:
#       row = [data.decode(INPUT_CODEC).encode('UTF-8') for data in row]
        ou, o, cn, xfield, xcontent = row
        writer.unparse('cn=%s,ou=%s,o=%s' % (cn, ou, o),
               {
                'replace': [xfield],
                'mail': [xcontent]
                })

csv_file.close()
ldif_file.close()
Wird auch sauber eine Datei erstellt:

$ cat mod.ldif
dn: cn=Martin Eller,ou=Externe Kontakte,o=domain.net
mail: Martin.Eller@koeln.de
replace: mail
Jedoch müßte natürlich das "replace" in der Zeile vor "mail:" stehen.
Das Umkehren von Zeilen im Code brachte nichts!


Ich verstehe das writer.unparse nich - leider fand ich auch keine Doku. Vielleicht kann mir einer kurz erklären was da passiert. Was ist open wb, rb...?

Hintergrund:
Die Felder können auch Sonderzeichen enthalten. Deswegen muß es nach base64 gewandelt werden.

Wie gesagt ich habe von Python keine Ahung und das script ist nicht von mir.

Vielen Dank für die Hilfe!

Martin
BlackJack

Das `ldif`-Modul ist anscheinend nicht dazu gedacht um "change records" zu verarbeiten.
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Code: Alles auswählen

 {
                'replace': [xfield],
                'mail': [xcontent]
                }
Du übergibst ein Dictionary, und in diesem ist die Reihenfolge der Einträge nicht definiert.
meller
User
Beiträge: 4
Registriert: Mittwoch 17. Januar 2007, 19:17

Gibt es eine Möglichkeit die Reihenfolge zu definieren?

Hat einer einen Link, unter dem man nachlesen kann, wie das ldif-Modul funktioniert. Ich habe mir einmal web2ldif angesehen. Jedoch übersteigt das meine Fähigkeiten. ;-)
Benutzeravatar
Luzandro
User
Beiträge: 87
Registriert: Freitag 21. April 2006, 17:03

meller hat geschrieben:Gibt es eine Möglichkeit die Reihenfolge zu definieren?

Hat einer einen Link, unter dem man nachlesen kann, wie das ldif-Modul funktioniert. Ich habe mir einmal web2ldif angesehen. Jedoch übersteigt das meine Fähigkeiten. ;-)
Du kannst dir im interaktiven Modus die Doku ansehen:

Code: Alles auswählen

>>> import ldif
>>> help(ldif.LDIFWriter)
| unparse(self, dn, record)
| dn
| string-representation of distinguished name
| record
| Either a dictionary holding the LDAP entry {attrtype:record}
| or a list with a modify list like for LDAPObject.modify().
Ich weiß allerdings nicht, wie eine "modify list like for LDAPObject.modify()" aussieht...
[url=http://www.leckse.net/artikel/meta/profilieren]Profilieren im Netz leicht gemacht[/url]
meller
User
Beiträge: 4
Registriert: Mittwoch 17. Januar 2007, 19:17

Vielen Dank für den Tip mit der Onlinehilfe.

wie kann man feststellen wie die "modify list like for LDAPObject.modify()" aussieht?
BlackJack

In dem man sich die Doku von `ldap.ldapobject.LDAPObject.modify()` anschaut, da steht's drin.

Praktisch sieht's so aus, mit einem `ldif.LDAPWriter` mit `sys.stdout` als Datei-Objekt:

Code: Alles auswählen

In [24]: a.unparse('test_dn', [(ldap.MOD_REPLACE, 'test', ['42'])])
dn: test_dn
changetype: modify
replace: test
test: 42
-
Das ist also eine Liste mit Tupeln mit je drei Elementen: Eine Konstante die die Art der Modifikation angibt, der Name des LDAP-Attributs das modifiziert werden soll und eine Liste mit den Werten. Da kann man auch `None` angeben wenn die Werte gelöscht werden sollen.
meller
User
Beiträge: 4
Registriert: Mittwoch 17. Januar 2007, 19:17

Danke voerst für die Hilfe. Ich habe erst einmal was zu lesen. ;-)
Antworten