Seite 1 von 1

replace.startswith()

Verfasst: Dienstag 28. Dezember 2021, 09:42
von veilside
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)

Re: replace.startswith()

Verfasst: Dienstag 28. Dezember 2021, 09:50
von sparrow
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.

Re: replace.startswith()

Verfasst: Dienstag 28. Dezember 2021, 10:58
von Sirius3
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("=")

Re: replace.startswith()

Verfasst: Dienstag 28. Dezember 2021, 11:25
von __blackjack__
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.