Seite 1 von 1

String Prüffen (leer oder mit zeichen gefüllt)

Verfasst: Dienstag 12. Januar 2010, 10:31
von lubb
Guten Morgen

versuche gerade ein String zu prüfen, der String wird aus txt-File gelesen und geprüft wird, ob der String einen Name beenthaltet oder nur leere Zeichen.

Code: Alles auswählen

  if name==' ' or len(name)<2 :
obwohl der String nur leere Zeichen beenthaltet wird name Ok ausgegeben

Vollständige Code:

Code: Alles auswählen

  def NameProof(self, fEOC,saleCount, reportName):
	  preferred_file_encoding = locale.getpreferredencoding() 
	  i=0
	  nameOK=False
	  fWrite = open(reportName, "a")
      fEOC=codecs.open(fEOC, 'rU', preferred_file_encoding)
	  for line in fEOC:
	      i+=1
	      name=line[119:146]
	      print name, len(name)
	      if 1 < i < saleCount:
		  if name==' ' or len(name)<2 :
		      nameOK=True
		      display="WARNING: Name not found in Sale " 
		      display+= str(i)
		      display+="\n"
		      fWrite.write(display)

	  if nameOK==False:
	      fWrite.write("Name OK"+"\n")
	  fEOC.close() 
	  fWrite.close()
Beste Grüsse
Lubb

Re: String Prüffen (leer oder mit zeichen gefüllt)

Verfasst: Dienstag 12. Januar 2010, 10:54
von /me
Du hast da einen sehr ungesunden Mix aus Tabulatoren und Leerzeichen bei der Einrückung. Beseitige das erst einmal, denn im Moment muss ich mir ziemlich mühsam zusammenreimen wie der Python-Interpreter das jetzt interpretiert.

Bei der Gelegenheit könntest du auch gleich noch die IMHO unnötige Übergabe der Variablen fEOC in der Funktionsdefinition entfernen.

Verfasst: Dienstag 12. Januar 2010, 10:55
von gkuhl
Guten Morgen,

ich findes es extrem anstrengend deinen Code zu lesen. Bitte verwende Syntaxhighlighting (Python Code Tags) und halte dich an PEP8. Dein Code ist übrigens nicht lauffähig, weil er falsches Einrücken enthält. In einem anderen Thread wurden dir schon Tipps gegeben, wie man deinen Code verbessern kann, Nicht ohne Grund!

Zu deinem Problem:

Code: Alles auswählen

In [1]: "    " == " "
Out[1]: False
Grüße
Gerrit

Verfasst: Dienstag 12. Januar 2010, 11:09
von lubb
entschuldige die Unverständlichkeit meiner Code.
code Läuft bei auf dem Linux Rechner mir einwandfrei, verstehe ich nicht warum bei euch nicht habe versucht die Tabulator zu entfernen naja, ich geb mir mühe leute :(

Verfasst: Dienstag 12. Januar 2010, 11:13
von BlackJack
@lubb: Du verwendest nur zwei statt vier Zeichen zur Einrückung und dazu auch noch Tabs statt ausschliesslich Leerzeichen. Darum stimmt die Einrückung bei der Anzeige hier im Forum nicht, und man muss raten was denn nun die tatsächliche Einrückung sein soll. Nicht die Tabulatoren nachträglich entfernen, sondern am besten gar nicht erst in den Quelltext schreiben. :-)

Die Namensgebung hält sich nicht an PEP8, ist semantisch fragwürdig, benutzt anscheinend "Typpräfixe", und Abkürzungen die nicht allgemein bekannt sind.

Bei den "falschen" Namen fällt besonders `nameOK` auf. Wenn das *falsch* ist, dann ist der Name in Ordnung!? Explizite Vergleiche auf `True` und `False` sollte man sich übrigens sparen. `nameOK` ist ja schon an einen Wahrheitswert gebunden, den kann man also auch *direkt* verwenden. In dem Fall also ``if not nameOK:``.

Zum eigenlichen Problem: Die Bedingung greift wenn `name` gleich *einem* Leerzeichen ist oder die Länge kleiner als zwei. Wenn es mehr als 1 Leerzeichen ist, dann greift die Bedingung natürlich nicht. Schau Dir mal die `strip()`-Methode auf Zeichenketten an.

Ansonsten hattes Du doch schon einmal mehrere Vorschläge bekommen, wie man so etwas besser schreibt. Zum Beispiel wie man die "manuelle" Aktualisierung von `i` mit `enumerate()` weg bekommt. Ausserdem solltest Du vielleicht darüber nachdenken eine Funktion zu schreiben, welche die entsprechenden Zeilen zwischen 1 und `saleCount` aus einer Datei liest, wenn Du das in mehreren Funktionen brauchst. Apropos Funktionen: Warum steckt diese Funktion in einer Klasse?

Verfasst: Dienstag 12. Januar 2010, 13:18
von lubb
Vielen Dank Leuts,

mit Strip kann ich die Leere Zeichen entfernen und so die Zeichenkette überprüfen, ob Zeichen beenthaltet.

Code: Alles auswählen

city = line[279:310]
city=city.strip()
if city=='' :
schönen Dank nochmal für eure Geduld und die schnelle Hilfe

Beste Grüße
Lubbad

Verfasst: Dienstag 12. Januar 2010, 13:38
von derdon
Wenn du wissen möchtest, ob eine Zeichenkette leer ist oder nicht, geht auch folgendes:

Code: Alles auswählen

if city:
    # zeichenkette ist nicht leer
    pass