replace.startswith()

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
veilside
User
Beiträge: 3
Registriert: Montag 6. Dezember 2021, 15:55

Hallo zusammen,

ich versuche etwas ziemlich banales..

Ich habe ein String, welches ein = und ein # enthält.

fs = "Filesize = 10G # Das ist die Dateigröße"

nun möchte ich erst das Kommentar (also alles hinter #) entfernen und anschließend die Daten in ein Dictionary schreiben.

leider scheitere ich schon dabei, das Kommentar zu entfernen...

Hier mein bisher fehlerhafter Code:

Code: Alles auswählen

with open (file, 'r') as file:
   lines = file.readlines()
   d = {}
   for line in lines:
      if "Filesize" in line:
         fs = line
         if '#' in fs:
            fs.replace(fs.startwith('#'), '')
            print (fs)
Benutzeravatar
sparrow
User
Beiträge: 4501
Registriert: Freitag 17. April 2009, 10:28

Hinter das print und vor die Klammer kommt kein Leerzeichen.
Eingerückt wird mit 4 Leerzeichen. Nicht mit 3.

Warum bindest du den Wert von "line" zusätzlich an den Namen "fs"? Das ist vor allem verwirrend. Was ist ein fs?
Warum prüfst du erst ob "Filesize" in der Zeile steht und später (nach dem unnötigen binden an einen zusätzlichen Namen) ob "#" in der Zeichenkette ist? Das kann man doch beides in einer Prüfung machen.


Was denkst du was diese Zeile tut?

Code: Alles auswählen

fs.replace(fs.startwith('#'), '')

Erstens heißt es "startswith" und nicht "startwith". Dann gibt "startswith" einen boolschen Wert zurück. Wie genau soll denn "True" oder "False" in einer Zeichenkette ersetzt werden?

Möglicherweise möchtest du die Methode .split() anschauen, die Zeichenketten haben.
Sirius3
User
Beiträge: 18216
Registriert: Sonntag 21. Oktober 2012, 17:20

Du willst nichts ersetzen, sondern einen String aufspalten. Dafür gibt es z.B. partition:

Code: Alles auswählen

line, _, _ = line.partition("#")
key, sep, value = line.partition("=")
Benutzeravatar
__blackjack__
User
Beiträge: 13919
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ergänzende Anmerkungen: Bei Textdateie sollte man beim öffnen immer explizit die Kodierung angeben.

In den ``with``-Block braucht man nur den Code schreiben, bei dem die Datei offen sein muss. Da Du sofort die komplette Datei in den Arbeitsspeicher liest, ist das nur diese eine Zeile in der Du das tust. Alternativ könntest Du das `readlines()` aber auch sein lassen und über `file` iterieren.

Das ``in`` sucht in der gesamten Zeichenkette und `startswith()` nur am Anfang. In der gezeigten Zeichenkette macht das ``startswith("#")`` auch aus dem Grund keinen Sinn, weil die nicht mit "#" anfängt. Durch das ``in`` würde der Code sich aber auch Zeilen wie ``Blocksize = 42 # Muss Teiler von FileSize sein!`` näher anschauen obwohl der Suchbergriff dort in einem Kommentar steht. Auch das entfernen der Kommentare ist eventuell nicht so einfach falls "#" auch in Werten vorkommen kann. Beispielsweise in URLs wie "http://www.example.com/page.html#anchor_id" oder auch in einer Einstellung die Kommentarzeichen konfiguriert ``CommentStart = "#" # Damit fangen Kommentare an.``

Falls das ein standardisiertes Format wie beispielsweise TOML ist, sollte man einen passenden Parser verwenden. Selbst bei allgemeinen INI-Dateien würde ich erst einmal versuchen ob `conmfigparser` aus der Standardbibliothek oder das externe `ConfigObj` geeignet sein könnten.
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
Antworten