Seite 1 von 1

writer.unparse - sortiert Ausgabe

Verfasst: Mittwoch 17. Januar 2007, 19:35
von meller
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

Re: writer.unparse - sortiert Ausgabe

Verfasst: Mittwoch 17. Januar 2007, 21:48
von BlackJack
Das `ldif`-Modul ist anscheinend nicht dazu gedacht um "change records" zu verarbeiten.

Verfasst: Mittwoch 17. Januar 2007, 21:54
von Joghurt

Code: Alles auswählen

 {
                'replace': [xfield],
                'mail': [xcontent]
                }
Du übergibst ein Dictionary, und in diesem ist die Reihenfolge der Einträge nicht definiert.

Verfasst: Donnerstag 18. Januar 2007, 14:38
von meller
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. ;-)

Verfasst: Donnerstag 18. Januar 2007, 14:50
von Luzandro
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...

Verfasst: Donnerstag 18. Januar 2007, 15:16
von meller
Vielen Dank für den Tip mit der Onlinehilfe.

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

Verfasst: Donnerstag 18. Januar 2007, 16:04
von 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.

Verfasst: Donnerstag 18. Januar 2007, 16:22
von meller
Danke voerst für die Hilfe. Ich habe erst einmal was zu lesen. ;-)