'\n'.join(liste) funktioniert so nicht

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
svenXY
User
Beiträge: 27
Registriert: Dienstag 16. Juni 2009, 10:36
Kontaktdaten:

Hi,

wie gesagt -

Code: Alles auswählen

'\n'.join(liste)
oder auch

Code: Alles auswählen

 '\t'.join()
funktionieren so nicht.

Aufgrund der sehr allgemeinen Suchbegriffe (join, newline, tab) kann ich dazu leidern ichts Brauchendes finden, vermute aber, dass das ein ziemlicher Nobrainer ist.

Für jeden Hinweis dankbar,
Gruss, Sven
Zuletzt geändert von svenXY am Montag 20. Juli 2009, 12:27, insgesamt 1-mal geändert.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Doch, das funktioniert.

Poste doch mal ein Minimalbeispiel, welches jeder ausführen kann und den Fehler liefert. Meine Glaskugel ist momentan zur Reparatur.
Das Leben ist wie ein Tennisball.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Läuft tadellos:

Code: Alles auswählen

>>> liste = ['a','b','c']
>>> print '\n'.join(liste)
a
b
c
>>> print '\t'.join(liste)
a	b	c
svenXY
User
Beiträge: 27
Registriert: Dienstag 16. Juni 2009, 10:36
Kontaktdaten:

jaja, habt Recht, sorry. Irgendwie hat mein ipython gesponnen:

Code: Alles auswählen

In [207]: '\t'.join(['a','b','c'])
Out[207]: 'a\tb\tc' 
Mein eigentliches Problem scheint also eher zu sein, dass ich ein Programm habe, welche mir erlaubt, den Delimiter als Parameter mitzugeben, sowas wie:

[edit: Lösung hier eingefügt und markiert, da (nur) hier der gesamte Source-Code steht]

Code: Alles auswählen

#!/usr/bin/env python

import re
import getopt
import sys

def usage():
    print '''
    USAGE: hostliste [-d|--delimiter=delimiter]

    --delimiter default: newline, kann aber auch jedes andere Zeichen (oder String) sein
'''

def main():
    try:
        opts, args = getopt.getopt(sys.argv[1:], "d:", ["delimiter="])
    except getopt.GetoptError, err:
        print str(err) # will print something like "option -a not recognized"
        usage()
        sys.exit(2)
    delimiter = '\n'
    for o, a in opts:
        if o in ("-d", "--delimiter"):
            delimiter = a
           # Lösung des Problems:
           # delimiter = a.decode('string-escape')
        else:
            assert False, "unhandled option"

    hosts = [
        ('host1', 'host1.f.q.dn', '192.168.1.1', 'loc1' ),
        ('host2', 'host2.f.q.dn', '192.168.1.2', 'loc1' ),
        ('host3', 'host3.f.q.dn', '192.168.1.3', 'loc1' )
    ]

    hosts.sort()

    print delimiter.join([ host[0] for host in hosts ])

if __name__ == '__main__':
    main()
Wenn ich dann auf der cli sowas wie --delimiter='\t' oder Ähnliches eingebe, wird es nicht als Tab interpretiert.

Danke,
Sven
Zuletzt geändert von svenXY am Montag 20. Juli 2009, 13:07, insgesamt 2-mal geändert.
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Eine POSIX Shell unterscheidet zwischen einfachen und doppelten Anführungszeichen. Den Rest findest du in der manpage deiner Shell.
Bottle: Micro Web Framework + Development Blog
svenXY
User
Beiträge: 27
Registriert: Dienstag 16. Juni 2009, 10:36
Kontaktdaten:

Defnull hat geschrieben:Eine POSIX Shell unterscheidet zwischen einfachen und doppelten Anführungszeichen. Den Rest findest du in der manpage deiner Shell.
# zsh
# python hostliste_forum.py -d"\n"
host1\nhost2\nhost3
# python hostliste_forum.py -d'\n'
host1\nhost2\nhost3

bash
$ python hostliste_forum.py -d'\n'
host1\nhost2\nhost3
$ python hostliste_forum.py -d"\n"
host1\nhost2\nhost3

OK, jetzt Du ;-)
lunar

Escape-Zeichen sind keine Sonderfunktion von Zeichenkette im Allgemeinen, sondern nur von Zeichenkettenliteralen. Sie werden nicht von "str()"-Objekt verarbeitet, sondern vom Interpreter beim Parsen des Quelltexts. Ein über die Kommandozeile an das Skript übergebenes Argument wird natürlich vom Interpreter geparst, daher werden auch Escape-Zeichen nicht interpretiert.

Wenn du Escape-Zeichen auswerten möchtest, musst du die entsprechende Zeichenkette manuell mit dem "string-escape"-Codec dekodieren:

Code: Alles auswählen

>>> inp = raw_input('Eingabe: ')
Eingabe: Hallo\tWelt
>>> inp
'Hallo\\tWelt'
>>> print(inp)
Hallo\tWelt
>>> inp = inp.decode('string-escape')
>>> inp
'Hallo\tWelt'
>>> print(inp)
Hallo   Welt
@defnull
Die Shell hat damit nun gar nichts zu tun.
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

*Vorkau*

Code: Alles auswählen

marc@nava:~/$ echo $"a\nb"
a\nb
marc@nava:~/$ echo $'a\nb'
a
b
Bitte

Edit: @lunar schon, da er in seinem Beispiel versucht, aus einer Shell heraus ein newline Zeichen als Parameter zu übergeben.
Zuletzt geändert von Defnull am Montag 20. Juli 2009, 12:06, insgesamt 1-mal geändert.
Bottle: Micro Web Framework + Development Blog
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Code: Alles auswählen

$ echo "host1\thost2\thost3"
host1\thost2\thost3
$ echo -e "host1\thost2\thost3"
host1	host2	host3
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

svenXY hat geschrieben:jaja, habt Recht, sorry. Irgendwie hat mein ipython gesponnen:

Code: Alles auswählen

In [207]: '\t'.join(['a','b','c'])
Out[207]: 'a\tb\tc' 
Nein, das kommt daher, dass die Ausgabe ueber ``repr`` laeuft.

Code: Alles auswählen

In [2]: '\t'.join(['a','b','c'])
Out[2]: 'a\tb\tc'

In [3]: print '\t'.join(['a','b','c'])
------> print('\t'.join(['a','b','c']))
a       b       c
svenXY
User
Beiträge: 27
Registriert: Dienstag 16. Juni 2009, 10:36
Kontaktdaten:

lunar hat geschrieben:Escape-Zeichen sind keine Sonderfunktion von Zeichenkette im Allgemeinen, sondern nur von Zeichenkettenliteralen. Sie werden nicht von "str()"-Objekt verarbeitet, sondern vom Interpreter beim Parsen des Quelltexts. Ein über die Kommandozeile an das Skript übergebenes Argument wird natürlich vom Interpreter geparst, daher werden auch Escape-Zeichen nicht interpretiert. [...]
Wenn du Escape-Zeichen auswerten möchtest, musst du die entsprechende Zeichenkette manuell mit dem "string-escape"-Codec dekodieren
Super!

Code: Alles auswählen

if o in ("-d", "--delimiter"):
    delimiter = a.decode('string-escape')
brachte hier die Lösung

Danke für Deine schnelle und kompetente Hilfe.

Gruss,
Sven
svenXY
User
Beiträge: 27
Registriert: Dienstag 16. Juni 2009, 10:36
Kontaktdaten:

..., da er in seinem Beispiel versucht, aus einer Shell heraus ein newline Zeichen als Parameter zu übergeben.
ich hatte ja gesagt '\t' und Ähnliches.

Ja, ich kann eine Shell benutzen und ja, ich weiss, was doppelte und einfache Anführungszeichen etc. auf der Shell machen...

Ich hatte '\t', "\t", \\t und was weiss ich noch alles versucht.

Das Problem war aber - wie lunar richtig erkannt hat - nicht auf der Shell, die hat das schon richtig gemacht, sondern dass das Tabulator-Zeichen - als Parameter mitgegeben - den Weg 'in' das Python-Programm hinein nicht überlebt hat, sondern zu einem "backslash + T" konvertiert wurde.
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

@Defnull: Stimmt, den Rest findet man in der Man-Page der Shell. bash: "Words of the form $'string' are treated specially. The word expands to string, with backslash-escaped characters replaced as specified by the ANSI C standard.", in der Man-Page der zsh steht ähnliches.
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
lunar

@defnull
Interessant, das kannte ich nicht. Allerdings hat das eigentlich wenig mit deiner ersten Antwort zu tun. Der OP hat auch einfache Anführungszeichen verwendet, wichtig war nicht der Unterschied zwischen einfachen und doppelten Anführungszeichen, sondern die Verwendung des Sigils. :)
Antworten