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

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
lubb
User
Beiträge: 50
Registriert: Mittwoch 6. Januar 2010, 17:05

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
Zuletzt geändert von lubb am Dienstag 12. Januar 2010, 10:57, insgesamt 1-mal geändert.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

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
lubb
User
Beiträge: 50
Registriert: Mittwoch 6. Januar 2010, 17:05

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 :(
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?
lubb
User
Beiträge: 50
Registriert: Mittwoch 6. Januar 2010, 17:05

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
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

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
Antworten