[gelöst] Hilfe bei einfachem Newbie-Script

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.
rethus
User
Beiträge: 26
Registriert: Montag 7. August 2006, 19:53

[gelöst] Hilfe bei einfachem Newbie-Script

Beitragvon rethus » Dienstag 8. August 2006, 15:10

Mit Hilfe dieses Forums habe ich nun schon ein Script für meine Bedürfnisse zusammengebaut.
Nun habe ich hier ein kleines Problem, das für Euch sicherlich nicht mal einen Augenzwinkern dauert um es zu lösen... aber ich sitze hier schon ne Zeit dran.

Also folgende funktion will noch nicht funktionieren:

Code: Alles auswählen

def write_table(blocks, out_file):
    global inhalt
    for headline, body in blocks:
        # Headline zwischenspeichern fürs Inhaltsverzeichnis
   inhalt=[]
   inhalt.append(headline.replace("\n",""))
   # Tabellen-Grundgerüst erstellen
   out_file.write('<br><table class="table" border="0"><a name="%s"></a> <col width="128*"> <col width="400*">' % headline)
        out_file.write('<tr><th colspan="2">%s</th></tr>' % headline)
        # Inhaltliche Zeilen parsen
   for key, value in iter_description(body):
            out_file.write('<tr><td>%s</td><td>%s</td></tr>' % (key, value))
        # Schließen des Tabellen-Grundgerüstes
   out_file.write('</table><p align="right"><a href="#top">nach oben</a></p>')
   print inhalt[:100]
   print len(inhalt)

def create_Index():
   global inhalt
   index="<table>"
   # Inhalt des Arrays auf 3 Spalten aufteilen
   i=0
   
   while i <= len(inhalt):
      index="<tr><td>inhalt[i]</td>"
      i= i+1
      index="<tr><td>inhalt[i]</td>"
      i= i+1
      index="<tr><td>inhalt[i]</td></tr>"
      i= i+1
   index="</table>"
   print index
   
def main():
    in_file = open('text2.txt')
    out_file = open('text3.txt', "wt")
    write_table(BlockIterator(in_file), out_file)
    create_Index()
    in_file.close()
    out_file.close()


Kommentar zum Code:

Zeile 2: Keine Ahnung ob das richtig ist, um den im folgenden deklarierten Array Global auch für die Funktion create_Index (Zeile 18) zugänglich zu machen...

Zeile 5: Hier möchte ich die ermittelten headlines in einen Array speichern, der in der Funktion create_Index "Zeile 18" verarbeitet werden soll.

Zeile 6: Hier ziehe ich ein überflüssigen Zeilenumbruch raus.

Zeile 15: Hier eine Kontrollausgabe (funzt ;-)
Zeile 16: Anzahl der Schlüssel 1 - das versteh ich nicht... hab sicher die falsche funktion aufgerufen, oder? Die Anzahl brauche ich, um die Ausgabe in Zeile 24 zu steuern.

Zeile 18 bis 32: Ausgabe soll im endeffekt eine 3 Spaltige Tabelle sein, in der die einzelnen headlines eingetragen werden (also bei 30 headlines - 10 in die erste spalte, 10 in die 2. Spalte & 10. in die 3. Spalte)

Zeile 38: aufruf der Funktion zum erstellen des Inhaltsverzeichnisses.

Könnt Ihr mir helfen, die Fehler heraus zu ziehen?

Danke schon mal....
Zuletzt geändert von rethus am Dienstag 8. August 2006, 16:14, insgesamt 1-mal geändert.
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

Beitragvon murph » Dienstag 8. August 2006, 15:14

ein paar fehler sollten doch klar sein...wenn er einen indented block erwartet, muss da was mit den leerstellen sein...
du könntest auch mal im forum suchen nach global und wie man das verwendet!
def create_Index():
index="<table>"
# Inhalt des Arrays auf 3 Spalten aufteilen
i=0

while i <= len(inhalt):
index="<tr><td>inhalt[i]</td>"
i= i+1
index="<tr><td>inhalt[i]</td>"
i= i+1
index="<tr><td>inhalt[i]</td></tr>"
i= i+1
index="</table>"
print index

du greifst hier nicht auf inhalt als variable zurück, sondern schreibst deren buchstaben("inhalt").
dafür gibt es dann so etwas wie

Code: Alles auswählen

index="<tr><td>%s</td></tr>" % inhalt[i]


und in der pep steht, dass funktionen kleingeschrieben sind und mit unterstrichen verbunden werden, wenn sie mehrere sprachelemente enthalten (wie zb to_send oder trage_ein(data))
klassen dafür dann in camel schreiben, also anstelle der leerstelle dann dedn nächsten großschreiben wie MyCar
rethus
User
Beiträge: 26
Registriert: Montag 7. August 2006, 19:53

Beitragvon rethus » Dienstag 8. August 2006, 15:24

Naja, da haben wir ja dann schon einen Fehler weniger :lol:

Aber was ein intendent-Block ist, und was der mit Leerstellen zu tun hat, da hab ich keine Ahnung...
bitte langsam... bin Newbie :wink:

Nun bekomme ich als Ausgabe in der Konsole folgende Fehlermeldung:
Traceback (most recent call last):
File "./con1.py", line 115, in ?
main()
File "./con1.py", line 109, in main
create_Index()
File "./con1.py", line 98, in create_Index
index="<tr><td>%s</td>" % inhalt[i]
IndexError: list index out of range


Wie nutze ich diesen Array denn richtig, bzw. wie bekomme ich herraus, wieviele einträge darin gespeichert sind, um die WHILE-Schleife entsprechend anzusteuern?
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

Beitragvon murph » Dienstag 8. August 2006, 15:26

über len:

Code: Alles auswählen

>>> my_list = ['a','b','c']
>>> print my_list
['a', 'b', 'c']
>>> print len(my_list)
3


edit:
habe einfrage übersehen:
das liegt an deinem letzten i = i+1:
damit versuchst du, auf inhalt[3] zuzugreifen, was es aber nicht gibt,
da beim zählen bei null angefangen wird!
außerdem hat das sonst auch überhaupt keinen sinn in diesem zusammenhang^^
Zuletzt geändert von murph am Dienstag 8. August 2006, 15:29, insgesamt 1-mal geändert.
rethus
User
Beiträge: 26
Registriert: Montag 7. August 2006, 19:53

Beitragvon rethus » Dienstag 8. August 2006, 15:28

Aber warum geht das oben bei mir nicht?
Wenn ich die Kontrollstruktur ausgebe (siehe oben... Ziele 16) dann schreibt der nur 1....

Wo mach ich denn da was falsch?
rethus
User
Beiträge: 26
Registriert: Montag 7. August 2006, 19:53

Beitragvon rethus » Dienstag 8. August 2006, 15:30

Ah, habs... ich blindfisch hab ja den Array innerhalb der Schleife jedesmal neu initialisiert... :roll: nun hab ich ihn direkt unter "global inhalt" verschoben... jetzt ist die Ausgabe len(inhalt) schon ganz anders....

Danke erstmal... ich schau jetzt mal, ob das Script jetzt funzt.
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

Beitragvon murph » Dienstag 8. August 2006, 15:31

weil du nichts mehr dazupackst.
das andere schreibst du ja nur in die textdatei, du hast nur einen zugriff,
un d dass ist der da:

Code: Alles auswählen

inhalt.append(headline.replace("\n",""))
rethus
User
Beiträge: 26
Registriert: Montag 7. August 2006, 19:53

Beitragvon rethus » Dienstag 8. August 2006, 15:35

Code: Alles auswählen

inhalt.append(headline.replace("\n",""))
steht in einer For-schleife... das geht...
Der Fehler lag bei der deklaration des arrays (siehe ein Posting vor deinem)....

Kannst du mir noch einen Tip geben, wie ich nun den Array auch in der Funktion create_Index verwenden kann, bzw. was an meiner While-Schleife nicht stimmt?
rethus
User
Beiträge: 26
Registriert: Montag 7. August 2006, 19:53

Beitragvon rethus » Dienstag 8. August 2006, 15:41

So, die WHILE-Schleife führt er nun richtig aus....

Die Stelle <= war falsch... ich hab jetzt nur < angegeben, damit macht er es.

Man o man, das sind meistens die Kleinigkeiten, die aufhalten... aber solange man die findet....
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Beitragvon Rebecca » Dienstag 8. August 2006, 15:47

rethus hat geschrieben:Aber was ein intendent-Block ist, und was der mit Leerstellen zu tun hat, da hab ich keine Ahnung...

Indentation = Einrueckung.
rethus
User
Beiträge: 26
Registriert: Montag 7. August 2006, 19:53

Beitragvon rethus » Dienstag 8. August 2006, 15:53

Supi, danke....

So schnell ist man wieder was schlauer... und ich freu mich wie ein Schneekönig, das das Script nun funktinoiert.

Eine kleine Verbesserungsidee hab ichnoch... vielleicht könnt Ihr mir da auch helfen...

In meinem Script habe ich ja einen Dateihandler offen (siehe Zeile 36). Dort schreibt ja die Funktion schon munter Daten hinein.
Gibts nun ne Möglichkeit, die von mir erstellte Tabelle ganz an den Anfang der Datei zu setzen?
Also praktisch eine Funktion um den Dateizeiger wieder an den Anfang zu bekommen, ohne die Datei zu schließen und erneut zu öffnen?
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

Beitragvon murph » Dienstag 8. August 2006, 15:55

es gibt seek(0)
dann geht er an die 0te stelle!
rethus
User
Beiträge: 26
Registriert: Montag 7. August 2006, 19:53

Beitragvon rethus » Dienstag 8. August 2006, 16:02

Danke, das funzt... aber der überschreibt dann die Zeilen, anstatt den Inhalt, den ich da an den Anfang der Datei setzen möchte einzurücken.

Wie bekomme ich es hin, das der die Zeilen am Anfang nicht überschreibt, sondern nach unten verschiebt?
rethus
User
Beiträge: 26
Registriert: Montag 7. August 2006, 19:53

Beitragvon rethus » Dienstag 8. August 2006, 16:14

Ok, ich habs... hab einfach anstatt out_file.write den Wert in einer Variablen gespeichert, und nach dem Funktionsaufruf von create_Index die Inhalte in die Datei geschrieben.

Vielen Dank nochmals...
BlackJack

Beitragvon BlackJack » Mittwoch 9. August 2006, 19:37

Versuch mal bitte alle `global`\s loszuwerden. Das ist in den meisten Fällen ein Zeichen für einen schlechten Entwurf.

Daten sollten in Funktionen als Argumente hineinkommen und als Rückgabewerte herauskommen. Das macht den Quelltext viel übersichtlicher als die Kommunikation über globale Variablen und man kann die Funktionen einfacher wiederverwenden und testen.

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]