Zeile ohne Leerzeichen kopieren

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.
Knuspersuppe
User
Beiträge: 17
Registriert: Dienstag 14. Juli 2009, 16:51

Hi ich bins wieder!

Mein programm, um spezielle Zeilen mit dem gesuchten Wort zu suchen und herauszuschreiben funktioniert eigentlich problemlos.
Habe auch noch einen Filter eingebaut, welcher doppelte Einträge aus der Liste löscht, allerdings kommen in der Datei, in der er diese Zeilen sucht Leerzeichen am Schluss vor.

z.B Das Wort welches er suchen soll ist #test
Die Zeile in der dieses Wort vorkommt sieht komplett so aus:
#test Das ist ein Test.
Also soll er die ganze Zeile in der dieses Wort vorkommt kopieren und in eine extra datei schreiben.
Wenn X jetzt ungeschriebene Felder darstellen soll sieht das also so aus:
#test Das ist ein TestXXXXXXXXXXXXXXXXXXXXXXXXXXX
#test Das ist ein Test XXXXXXXXXXXXXXXXXXXXXXXXXXX
Wie man sieht ist in der 2. Zeile ein Leerzeichen am Schluss.
Also kann der Filter nicht eins davon löschen, da er es als einen anderen Text anerkennt wegen diesem Leerzeichen.
Wie kann ich dem Programm also sagen, dass er dieses Leerzeichen am Schluss ignorieren soll?
Der Teil vom Programm für die Suche und dem Filter sieht so aus:

Code: Alles auswählen

f=open("c:/vmi-buch/Text.txt")
         f1 = open("C://Ordner/Suchwort.txt","w")
         def Begriff1():
             for line in f.readlines():
                 if line.find("#ifdef")>=0:
                    f1.write(line)
                 elif line.find("#ifndef")>=0:
                      f1.write(line)
         Begriff1()
         f1.close()
         print text

liste= open("C://Ordner/Suchwort.txt")
dic={}
for i in liste: 
    dic[i]=''
    liste=dic.keys()
    liste.sort()
    f = open("C://Ordner/Suchwort.txt","w")
    f.writelines(liste)
    print dic
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Knuspersuppe hat geschrieben: z.B Das Wort welches er suchen soll ist #test
Die Zeile in der dieses Wort vorkommt sieht komplett so aus:
#test Das ist ein Test.

Also soll er die ganze Zeile in der dieses Wort vorkommt kopieren und in eine extra datei schreiben.
So weit ist es mir klar.
Wenn X jetzt ungeschriebene Felder darstellen soll sieht das also so aus:
Was sind denn ungeschriebene Felder?
#test Das ist ein TestXXXXXXXXXXXXXXXXXXXXXXXXXXX
#test Das ist ein Test XXXXXXXXXXXXXXXXXXXXXXXXXXX
Wie man sieht ist in der 2. Zeile ein Leerzeichen am Schluss.
Also sind Deine Zeilen anders, als wie Du sie oben als komplett definiert hast?
Also kann der Filter nicht eins davon löschen, da er es als einen anderen Text anerkennt wegen diesem Leerzeichen.
Wie kann ich dem Programm also sagen, dass er dieses Leerzeichen am Schluss ignorieren soll?
Evtl. mit strip():

Code: Alles auswählen

>>> line = "#test Das ist ein Test xxxxxxxxx "
>>> line.strip()
'#test Das ist ein Test xxxxxxxxx'
Zu Deinem Script: Man sollte open() nicht ohne Fehlerbehandlung ablaufen lassen, z.B. mit with.

Die Namen sind ein wenig nichtssagend. Was ist f1?

Begriff1() klingt nicht nach Funktion.

Es gibt "".startswith().

Die Verwendung eines Dictionaries ab Zeile 17 macht auf mich keinen Sinn ... aber evtl. durchschaue ich das grad nicht.
Knuspersuppe
User
Beiträge: 17
Registriert: Dienstag 14. Juli 2009, 16:51

Ah moment, hab da ein Fehler gemacht.

Code: Alles auswählen

f=open("c:/vmi-buch/Text.txt") 
         f1 = open("C://Ordner/Suchwort.txt","w") 
         def Begriff1(): 
             for line in f.readlines(): 
                 if line.find("#test")>=0: 
                    f1.write(line) 
                 elif line.find("#test2")>=0: 
                      f1.write(line) 
         Begriff1() 
         f1.close() 
         print text 

liste= open("C://Ordner/Suchwort.txt") 
dic={} 
for i in liste: 
    dic[i]='' 
    liste=dic.keys() 
    liste.sort() 
    f = open("C://Ordner/Suchwort.txt","w") 
    f.writelines(liste) 
    print dic 

Das mit startswith hab ich auch schon probiert, bringt aber keinen unterschied.
f steht für die Datei welche geöffnet werden soll.
Die def Begriff1 soll nur zeigen, dass hier nach einem bestimmten Begriff gesucht werden soll.
Und mit ungeschriebenen Felder meine ich alles das, was hinter einem Satz kommt, also das wo nichts steht.
Das mit dem X soll nur zeigen, dass in dem Ursprungstext indem gesucht werden soll, manchmal noch Leerzeichen hinter den Texten sind, warum auch immer.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Knuspersuppe hat geschrieben: Wie man sieht ist in der 2. Zeile ein Leerzeichen am Schluss.
Also kann der Filter nicht eins davon löschen, da er es als einen anderen Text anerkennt wegen diesem Leerzeichen.
Wie kann ich dem Programm also sagen, dass er dieses Leerzeichen am Schluss ignorieren soll?
Leerzeichen am Ende und wahrscheinlich auch am Anfang des Strings sind für dich also nicht relevant. In dem Fall solltest du diese Leerzeichen einfach völlig entfernen.

Die Methode strip() leistet da gute Dienste.

Gruß,
Matthias
Knuspersuppe
User
Beiträge: 17
Registriert: Dienstag 14. Juli 2009, 16:51

ok, Danke!
Mal schauen wie ich strip() in meinen Code einbinde^^
Knuspersuppe
User
Beiträge: 17
Registriert: Dienstag 14. Juli 2009, 16:51

Hm also irgendwie bekomm ich das nicht so hin, dass es das letzte Leerzeichen aus einer Datei löscht :?
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Knuspersuppe hat geschrieben:Hm also irgendwie bekomm ich das nicht so hin, dass es das letzte Leerzeichen aus einer Datei löscht :?
Nur das letzte? Und warum Datei? Ich dachte es wären Zeilen innerhalb einer Datei.

Wenn du das letzte Leerzeichen entfernen willst musst du erst einmal überprüfen ob eins vorhanden ist. Dafür kannst du die endswith()-Methode (http://docs.python.org/library/stdtypes ... ng-methods) des Strings verwenden. Dann kannst du gegebenenfalls das letzte Zeichen entfernen. Unter http://docs.python.org/tutorial/introdu ... ml#strings findest du ein Beispiel dafür.

Andererseits bringt dir das absolut nichts. Wenn du einen String mit 3 Leerzeichen am Ende hast und einen anderen mit 4, dann hast du nach dem Entfernen des letzten Leerzeichens einen String mit 2 Leerzeichen und einen mit drei. Unterschiedlich sind die damit immer noch. Ich glaube nicht, dass das dein gewünschtes Ergebnis ist.

Gruß,
Matthias
BlackJack

@Knuspersuppe: Die Funktion `Begriff1()` ist total überflüssig. Sie wird definiert und gleich danach aufgerufen. Dass da nach einem Begiff gesucht wird, ist damit weder klarer, noch unklarer. Es verwirrt einfach nur.

Das `f1` der Name für die geöffnete Datei ist, sieht man. Der Name sagt aber nicht aus was das für eine Datei ist. Was *bedeutet* die Datei? Was ist da drin?

`str.startswith()` macht sehr wohl einen Unterschied. Es durchsucht nicht die gesamte Zeile, sondern nur den Anfang. Das macht zum einen einen Laufzeitunterschied und zum anderen verhält sich das Programm dann auch bei Zeilen in denen '#test' mitten in der Zeile vorkommt, auch noch richtig.

Wobei mir übrigens noch einfällt, dass ich schonmal ``in`` statt `str.find()` vorgeschlagen hatte!?

Die Schleife am Ende ist überigens der totale Unsinn. Sogar wenn man statt des Dictionaries ein `set()` verwendet, ist das noch unsinnig.
Knuspersuppe
User
Beiträge: 17
Registriert: Dienstag 14. Juli 2009, 16:51

Ok, mit dem entfernen habe ich es mal hinbekommen, allerdings werden alle Leerzeichen entfernt.
Da muss ich mir noch die Links von /me anschauen.
Das Feintuning mach ich erst zum Schluss, wenn das Programm erstma so läuft wie es soll^^

Hier mal der Code zu dem Teil mit den Leerzeichen:

Code: Alles auswählen

pfad = "C:/vmi-buch/"
dateiname="Suchwort.txt"
datei = pfad+dateiname
in_file = open(datei,"r")
text = in_file.read()
f = open("C:/vmi-buch/Ergebnis.txt","w")
for Text in text:
    if Text.endswith(" ")>=0:
       Text = Text.rstrip(" ")
       f.write(Text)
       print Text
Knuspersuppe
User
Beiträge: 17
Registriert: Dienstag 14. Juli 2009, 16:51

Ich tippe mal der Fehler liegt in Zeile 10 :?
Da steht, wenn der Text mit einem Leerzeichen endet, soll er im Text alle Leerzeichen löschen...grml :oops:
Soll aber nur die Leerzeichen am Ende löschen...
Da fehlt bestimmt nur eine kleine Ergänzung in der Zeile und ich kommt net drauf xD
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

``endswith`` gibt übrigens einen Wahrheitswert zurück, da ist ein vergleich mit einer Zahl eher... seltsam und unüblich.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Knuspersuppe
User
Beiträge: 17
Registriert: Dienstag 14. Juli 2009, 16:51

Ja ist mir auch schon aufgefallen, weil normal schreib ich ja

Code: Alles auswählen

if text.endswith("blablabla"):
   Aktion

Wenn ich aber den Vergleich am Ende weglasse dann schreibt er irgendwie garnichts mehr o_O
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Dann hast du halt irgendwo einen Fehler im Code. Eine Bedingung, die äquivalent zu "if True:" ist, nutzt jedenfalls nix.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
BlackJack

@Knuspersuppe: Du gehst den Text Buchstabe für Buchstabe durch und testest, ob der einzelne Buchstabe ein Leerzeichen ist, und falls ja, dann entfernst Du es. Es sollte nicht weiter verwundern warum das alle Leerzeichen entfernt.

Du musst lernen zu formulieren was Du erwartest, also was zum Beispiel zu welchem Zeitpunkt an welchen Namen gebunden ist, und dass dann selber überprüfen! Ich nehme mal an Du hast erwartet, dass `Text` an eine komplette Zeile gebunden ist. Dass dem nicht so ist, hättest Du ganz einfach selbst heraus finden können. ``print`` und `repr()` sind Dein Freund.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

BlackJack hat geschrieben:@Knuspersuppe: Du gehst den Text Buchstabe für Buchstabe durch und testest, ob der einzelne Buchstabe ein Leerzeichen ist, und falls ja, dann entfernst Du es. Es sollte nicht weiter verwundern warum das alle Leerzeichen entfernt.
Abgesehen davon, dass dieses "for Text in text" nicht erforderlich ist, ist es extrem verwirrend, wenn Variablennamen sich ausschließlich durch die Groß- und Kleinschreibung unterscheiden. Auch gut verwechselbare Variablennamen wie z.B. "Beutel" und "Beute1" sollten möglichst nicht zusammen im Code auftauchen.

Gruß,
Matthias
BlackJack

@/me: Naja, so ganz stimmt das nicht. `text` und `Text` in einem Programm ist kein Problem und auch durchaus üblich. Zum Beispiel als ``text = Text('foo')``. Nur das man dann erwartet, das `Text` der Name einer Klasse ist.
Knuspersuppe
User
Beiträge: 17
Registriert: Dienstag 14. Juli 2009, 16:51

Ähm ganz kurze Zwischenfrage :lol:
Wie kann ich eine Zeile von einem bestimmten punkt an bis zu einem anderen bestimmten Punkt kopieren?
Also auch alles was dazwischen ist.
Also von #testAnfang bis #testEnde.
Sollte ja eigentlich nicht so schwer sein.
Ich denke mal ich muss da mit dem range() Befehl arbeiten, oder?
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Knuspersuppe hat geschrieben:Ähm ganz kurze Zwischenfrage :lol:
Wie kann ich eine Zeile von einem bestimmten punkt an bis zu einem anderen bestimmten Punkt kopieren?
Slicing von Strings wird im Python Tutorial erwähnt. Es wäre eine gute Idee, das selbst durchzuarbeiten anstatt zu erwarten, dass andere es dir vorkauen.
Knuspersuppe
User
Beiträge: 17
Registriert: Dienstag 14. Juli 2009, 16:51

Soll mir ja auch keiner vorkauen, ich erwarte auch nicht dass mir jemand den code schreibt, brauch halt nur Hilfe im Sinne von "Dafür musst du dir mal diesen Abschnitt anschauen", weil Lesen kann ich ja^^
Nur steh ich halt nen bissl unter Zeitdruck, da ich das Programm heute fertig machen muss, daher bleibt mir leider nicht die Zeit alle Tutorials durchzulesen. Das sollte jetzt auch nicht eine faule Ausrede sein...
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Knuspersuppe hat geschrieben:Soll mir ja auch keiner vorkauen, ich erwarte auch nicht dass mir jemand den code schreibt, brauch halt nur Hilfe im Sinne von "Dafür musst du dir mal diesen Abschnitt anschauen", weil Lesen kann ich ja^^
Nur steh ich halt nen bissl unter Zeitdruck, da ich das Programm heute fertig machen muss, daher bleibt mir leider nicht die Zeit alle Tutorials durchzulesen. Das sollte jetzt auch nicht eine faule Ausrede sein...
Es bringt dir nichts, wenn du einfach nur fertige Lösungen serviert bekommst, weil du dann die Sprache und ihre Möglichkeiten immer noch nicht verstehst - und es bringt uns nichts, wenn du einfach nur fertige Lösungen serviert bekommst, weil du dann auch für andere Kleinigkeiten nachfragst, statt dir Grundwissen anzueignen.

Ich habe den genannten Link schon vor zwei Tagen gepostet. Inzwischen solltest du doch Zeit gehabt haben, diesen kleinen Abschnitt über Strings zu lesen. Es demotiviert ein wenig, wenn man zu helfen versucht und feststellen muss, dass die Hilfe gar nicht angenommen wird.

Gruß,
Matthias
Antworten