Seite 1 von 2

Zeilenumbruch programmieren

Verfasst: Montag 5. Mai 2014, 09:59
von nfehren
Servus Leute. Ich muss einen String einholen in Python und dann, wenn er länger als 80 Zeichen ist, nach 80 Zeichen einen Zeilenumbruch machen.
Der Zeilenumbruch sollte aber kein Wort durchtrennen, sondern dann einfach vor dem Wort abtrennen. Wie ist das auszuführen?

Re: Zeilenumbruch programmieren

Verfasst: Montag 5. Mai 2014, 10:01
von mutetella
Dazu gibt es das textwrap Module.

mutetella

Re: Zeilenumbruch programmieren

Verfasst: Montag 5. Mai 2014, 13:08
von nfehren
Das klappt ja wunderbar aber ich muss das zur Übung selbst programmieren.
Den Zeilenumbruch an sich habe ich schon:

Code: Alles auswählen

s = ("Das hier wird ein längerer Text der einem Test dienen soll, einen Zeilenumbruch zu machen. Die Zeilen dürfen 50"
     "Zeichen breit sein und müssen danach ein newline vorweisen können. Im Nachhinein muss man das Programm so "
     "verbessern, das es keine ganzen Wörter abschneidet. Viel Glück!")
j = 1
z = 50

while j <= len(s):
    for i in range (j -1 , j + z -1):
        if i < len(s):
            print(s[i],end='')
    if s[i] == " ":
        print("")
    j += 50
Aber der schneidet halt die Wörter ab und das möchte ich nicht. Wie kann das verhindert werden?

Re: Zeilenumbruch programmieren

Verfasst: Montag 5. Mai 2014, 13:22
von BlackJack
@nfehren: In dem Du Dir einen Algorithmus ausdenkst der sich nicht an den Zeichen, sondern an Worten orientiert. Das ist doch *Deine* Hausaufgabe. Wie würdest Du das denn Schritt für Schritt angehen, wenn Du das von Hand machen müsstest? Du musst das so beschreiben das es jemand anders nach der Anleitung machen kann, und dann noch so formalisieren, dass es der Computer versteht.

Re: Zeilenumbruch programmieren

Verfasst: Montag 5. Mai 2014, 13:31
von darktrym
Gehts nicht einfacher mit split und mitzählen wieviel Platz noch übrig ist?

Code: Alles auswählen

line_len, COLUMN_SIZE = 0, 80
for word in s.split():
    line_len += len(word) + 1
    if line_len > COLUMN_SIZE:
        line_len = len(word) + 1
        print()
    print("%s " % word, end="")
 

Re: Zeilenumbruch programmieren

Verfasst: Montag 5. Mai 2014, 13:32
von nfehren
BlackJack hat geschrieben:@nfehren: In dem Du Dir einen Algorithmus ausdenkst der sich nicht an den Zeichen, sondern an Worten orientiert. Das ist doch *Deine* Hausaufgabe. Wie würdest Du das denn Schritt für Schritt angehen, wenn Du das von Hand machen müsstest? Du musst das so beschreiben das es jemand anders nach der Anleitung machen kann, und dann noch so formalisieren, dass es der Computer versteht.

Aber der Algorithmus muss sich doch dann an Worten und Zeichen orientieren oder? sonst hab ich z.B. 8 kleine Worte und 8 ganz lange Worte und dann ist das ja kein richtiger Zeilenumbruch..

Ich weiß aber leider echt nicht wie das umzusetzen ist.

Re: Zeilenumbruch programmieren

Verfasst: Montag 5. Mai 2014, 13:35
von /me
nfehren hat geschrieben:
BlackJack hat geschrieben:Ich weiß aber leider echt nicht wie das umzusetzen ist.
Ich würde von Position 80 rückwärts suchen bis ein Leerzeichen kommt.

Re: Zeilenumbruch programmieren

Verfasst: Montag 5. Mai 2014, 14:25
von Sirius3
@nfehren: Du sollst ja auch nicht statt 80 Zeichen 10 Wörter nehmen, sondern so lange Wörter aneinanderreihen, bis keins mehr in 80 Zeichen passt.

Re: Zeilenumbruch programmieren

Verfasst: Dienstag 6. Mai 2014, 10:03
von nfehren
Könnt ihr mir bisschen mit der Umsetzung helfen?

Re: Zeilenumbruch programmieren

Verfasst: Dienstag 6. Mai 2014, 10:50
von /me
nfehren hat geschrieben:Könnt ihr mir bisschen mit der Umsetzung helfen?
Ja klar.

Nimm den String. Suche ab Position 80 rückwärts bis du ein Leerzeichen findest. Gib den Text bis zum Leerzeichen aus. Nimm jetzt den dahinter liegenden Teil als neuen String und beginne mit dem Algorithmus von vorne.

Du brauchst nur noch eine Abbruchbedingung wenn das Stringende erreicht ist.

Re: Zeilenumbruch programmieren

Verfasst: Dienstag 6. Mai 2014, 10:52
von Hyperion
Wenn Du uns mal Deine Ansätze zeigst, gerne :-)

Einfach so bekommst Du von uns keine Lösung auf dem Silbertablett serviert! Das sollte mittlerweile bekannt sein ;-)

Probiere es doch mal nach EyDus Idee! Dabei musst Du ja eigentlich nur den aktuellen Trenn-Index bestimmen, der immer dem alten + 80 Zeichen und dann maximal 80 Zeichen rückwärts beträgt. So schwer klingt das für mich jetzt nicht...

Re: Zeilenumbruch programmieren

Verfasst: Dienstag 6. Mai 2014, 13:04
von nfehren
Ich bin die ganze Zeit am Probieren wie man es machen müsste versteh ich von der Logik her blos bei der Syntaxs umsetzung haperts..
Habe bis her einiges probiert und gelöscht aber soviel hab ich noch (Achtung auch schwachsinn dabei):

Code: Alles auswählen

#erste_zeile = ""
#for i in range (0,49):
#    erste_zeile += s[i]
#
#erste_zeile = erste_zeile[:-3]
#print(erste_zeile)
#
#zweite_zeile = ""
#for i in range (47,100):
#    zweite_zeile += s[i]
#
#zweite_zeile = zweite_zeile[:-6]
#print(zweite_zeile)

zeile1 = ""
for i in range (0,49):
    zeile1 += s[i]
zeile1_neu = ""
for i in range(49,0):
    while s[i] == " ":
        zeile1_neu += s[i]
        i -= 1
print(zeile1_neu)




#while erste_zeile[i] != " ":
#    i -= 1
#    print(erste_zeile[i])
    

Re: Zeilenumbruch programmieren

Verfasst: Dienstag 6. Mai 2014, 13:33
von Sirius3
@nfehren: versuch mal in Worten zu beschreiben, was Du denkst, was Du da programmiert hast.

Re: Zeilenumbruch programmieren

Verfasst: Dienstag 6. Mai 2014, 13:36
von nfehren
Ich wollte den String solange durchgehen bis ich ein Leerzeichen finde.

Re: Zeilenumbruch programmieren

Verfasst: Dienstag 6. Mai 2014, 13:43
von EyDu
Hyperion hat geschrieben:Probiere es doch mal nach EyDus Idee!
Manche von uns sind wohl so omnipräsent, dass sie auch Ideen äußern, obwohl sie zu einem Thema keinen Betrag geschrieben haben :mrgreen:

Re: Zeilenumbruch programmieren

Verfasst: Dienstag 6. Mai 2014, 14:05
von cofi
@EyDu Das war eine Aufforderung an dich, eine Idee beizusteuern :)

@nfehren: Das ist zu Grob. Spiele das doch mal mit einem Beispieltext durch, dann siehst du auch die einzelnen Faelle an die du denken musst.
Wie stellst du fest, dass du umbrechen musst? Wie verwaltest du die Information welche Woerter du schon ausgegeben hast und welche noch kommen, etc etc

Re: Zeilenumbruch programmieren

Verfasst: Dienstag 6. Mai 2014, 14:33
von Hyperion
cofi hat geschrieben:@EyDu Das war eine Aufforderung an dich, eine Idee beizusteuern :)
So sieht es nämlich aus... außerdem wollte ich testen, ob dem OP das auffällt, indem er die bis dato vorgeschlagenen Ideen, z.B. von /me, durchgeht...

Klingt doch glaubhaft, oder? :mrgreen:

Re: Zeilenumbruch programmieren

Verfasst: Dienstag 6. Mai 2014, 14:53
von EyDu
Nagut, wenn es so ist. Eigentlich lösen wir hier ja keine Hausaufgaben, aber hier können wir vielleicht mal eine Ausnahme machen.

Code: Alles auswählen

# -*- coding: utf-8 -*-
TEXT = u"Das hier wird ein längerer Text der einem Test dienen soll, einen Zeilenumbruch zu machen. Die Zeilen dürfen 50 Zeichen breit sein und müssen danach ein newline vorweisen können. Im Nachhinein muss man das Programm so verbessern, dass es keine ganzen Wörter abschneidet. Viel Glück!"

j=" ".join;w=lambda t:"\n".join(map(j,reduce(lambda l,y:(l[-1].append(y)if 80>=len(j(l[-1]+[y]))else l.append([y]),l)[1],t.split(),[[]])))

print w(TEXT)
Man kann da sicher noch ein wenig kürzen, aber ehrlich gesagt wollte ich aus einer überischtlichen Lösung keine unübersichtliche machen. Probleme mit Wörter >80 Zeichen werden natürlich ignoriert.

Re: Zeilenumbruch programmieren

Verfasst: Dienstag 6. Mai 2014, 15:13
von /me
EyDu hat geschrieben:Man kann da sicher noch ein wenig kürzen, aber ehrlich gesagt wollte ich aus einer überischtlichen Lösung keine unübersichtliche machen.
Das ist eindeutig die absolut übersichtlichste Variante die einem als erstes in den Sinn kommt. Vielleicht mag der Fragesteller trotzdem noch mal einen anderen Ansatz ausprobieren.

Re: Zeilenumbruch programmieren

Verfasst: Dienstag 6. Mai 2014, 15:53
von nfehren
EyDu hat geschrieben:Nagut, wenn es so ist. Eigentlich lösen wir hier ja keine Hausaufgaben, aber hier können wir vielleicht mal eine Ausnahme machen.

Code: Alles auswählen

# -*- coding: utf-8 -*-
TEXT = u"Das hier wird ein längerer Text der einem Test dienen soll, einen Zeilenumbruch zu machen. Die Zeilen dürfen 50 Zeichen breit sein und müssen danach ein newline vorweisen können. Im Nachhinein muss man das Programm so verbessern, dass es keine ganzen Wörter abschneidet. Viel Glück!"

j=" ".join;w=lambda t:"\n".join(map(j,reduce(lambda l,y:(l[-1].append(y)if 80>=len(j(l[-1]+[y]))else l.append([y]),l)[1],t.split(),[[]])))

print w(TEXT)
Man kann da sicher noch ein wenig kürzen, aber ehrlich gesagt wollte ich aus einer überischtlichen Lösung keine unübersichtliche machen. Probleme mit Wörter >80 Zeichen werden natürlich ignoriert.
Natürlich sehr nett das du dir die Mühe machst und mir den Code-Schnipsel schreibst aber darauf war ich nicht wirklich aus.. Ich möchte die Sache verstehen. Sonst könnte ich ja auch einfach dieses textwrap modul benutzen. Das was du geschrieben hast verstehe ich zum großteil nicht. Trotzdem vielen dank für die Mühe