Fragen zur Einrückung (Block) & Codierung

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
Benutzeravatar
andie39
User
Beiträge: 152
Registriert: Dienstag 7. Dezember 2021, 16:32

Guten Abend und Frohes Neues,

ich habe Zeit gefunden meine Übungen weiter zu machen, dabei bin ich auf folgendes gestoßen siehe Bild:

Bild

Es sind zwei Varianten die das gleiche machen und genau so muss es auch geschrieben werden, meine Frage ist:
Im unteren Teil ist es so wie ich es kenne, der print Befehl ist um 4 Positionen eingerückt, da es das ist, was passieren soll wenn die if definiton true ist.

Im oberen mit dem continue aber ist der Print Befehl nicht gegenüber if eingerückt.
Warum?

Wie man auch sieht ist das alles im Jupyter Notebook geschehen und hat geklappt.

Aber hier in Pythonista habe ich ein Problem:

Code: Alles auswählen


with open("data.csv") as file:
    for line in file:
        print(line)
        
Hier bekomme ich diese Meldung:

for line in file:
File "/var/containers/Bundle/Application/DC8FF04D-3846-411A-8E4E-9360D3BC014F/Pythonista3.app/Frameworks/Py3Kit.framework/pylib/encodings/ascii.py", line 27, in decode
return codecs.ascii_decode(input, self.errors)[0]
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 54: ordinal not in range(128)


Scheinbar kann er es nicht decodieren.
Was kann man da machen und warum passiert das nicht beim Jupyter Notebook?
Benutzeravatar
sparrow
User
Beiträge: 4540
Registriert: Freitag 17. April 2009, 10:28

Zu der Einrückung: Das print gehört nicht zum if-Block. Also passt die Ebene.

Zum Fehler der Codierung: Es fehlt die Angabe der Codierung beim Öffnen der Datei. In beiden Fällen. Aber auf dem PC wird zufällig die richtige genommen. Was da benutzt wird, hängt vom System ab, weshalb man die Codierung immer mit an gibt.
Benutzeravatar
andie39
User
Beiträge: 152
Registriert: Dienstag 7. Dezember 2021, 16:32

Danke.

Wieso nicht?
Beim zweiten Fall gehört es doch auch zum if Block.


Und wie gibt man die Codierung an?
Benutzeravatar
noisefloor
User
Beiträge: 4195
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

der Code oben ist nicht identisch - der Vergleich ist umgedreht, das beeinflusst auch die Positition, wo `print` steht.

Gruß, noisefloor
Benutzeravatar
sparrow
User
Beiträge: 4540
Registriert: Freitag 17. April 2009, 10:28

Und zum Umgang mit dem csv Modul lohnt sich ein Blick in die Dokumentation. Da steht nicht nur, wie man das Encoding angibt, sondern auch andere spannende Dinge. Zum Beispiel, dass man das newline-Argument überschreibt.
Benutzeravatar
__blackjack__
User
Beiträge: 14078
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@andie39: Nein, beim Zweiten gehört es nicht zum ``if``-Block. Nach dem ``continue`` würde es ja auch überhaupt keinen Sinn machen weil ``continue`` den nächsten Schleifendurchlauf auslöst — sofort. Das ist ein unbedingter Sprungbefehl. Einer der nicht an der Einrückung zu erkennen ist wenn man nur über die Struktur schaut die sich durch die Einrückung ergibt. Einer der Gründe warum ich ``continue`` meide wo es geht, und es geht fast immer.

Für die Kodierung hat `open()` ein Argument: `encoding`.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
andie39
User
Beiträge: 152
Registriert: Dienstag 7. Dezember 2021, 16:32

@sparrow: Danke. Hab es gelöst :)

@blackjack: Also im zweiten Teil ist es doch so:
Es wird in der ersten Zeile geprüft ob die Variabel data welche ja die Zeilen sind nur ohne Semikolon etc einen bestimmten Wert in einem bestimmten Bereich hat. Wenn das true ist, dann wird die Zeile gedruckt.

Das passier jedes Mal neu bis alle Zeilen durch sind.

Aber der erste Teil wirkt auf mich als wird erst die nur geprüft ob für jede Zeile die Bedingung zutrifft oder nicht und die Variabel data mit allen Zeilen gefüllt wird, die bei der Bedingung true ergeben und dann diese neue Variabel data ausgegeben wird
Benutzeravatar
__blackjack__
User
Beiträge: 14078
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ups, ich bin da mit erstem und zweitem durcheinander gekommen und habe die verwechselt. Also beim *ersten* gehört das `print()` nicht zu ``if``-Block. Aus den genannten Gründen.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
Dennis89
User
Beiträge: 1562
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,
andie39 hat geschrieben: Mittwoch 5. Januar 2022, 20:53 Aber der erste Teil wirkt auf mich als wird erst die nur geprüft ob für jede Zeile die Bedingung zutrifft oder nicht und die Variabel data mit allen Zeilen gefüllt wird, die bei der Bedingung true ergeben und dann diese neue Variabel data ausgegeben wird
Es wird eine Zeile ausgelesen, der Inhalt wird formatiert an 'data' gebunden. 'data' ist eine Liste, das ist für den Vergleich der jetzt kommt wichtig. Es wird nämlich nur ein Teil von 'data' verglichen und zwar der, der sich hinter dem Index 1 verbirgt. (data[1]).
Ist der kleiner als der angegebene Vergleichswert beginnt die 'for'-Schleife wieder von vorne und bindet die nächste Zeile an 'data'. 'data' hat dabei immer nur die aktuell ausgelesene Zeile und diese wird ausgegeben wenn Index 1 von 'data' größer als der Vergleichswert ist.

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
andie39
User
Beiträge: 152
Registriert: Dienstag 7. Dezember 2021, 16:32

Dennis89 hat geschrieben: Donnerstag 6. Januar 2022, 11:31 Hallo,
andie39 hat geschrieben: Mittwoch 5. Januar 2022, 20:53 Aber der erste Teil wirkt auf mich als wird erst die nur geprüft ob für jede Zeile die Bedingung zutrifft oder nicht und die Variabel data mit allen Zeilen gefüllt wird, die bei der Bedingung true ergeben und dann diese neue Variabel data ausgegeben wird
Es wird eine Zeile ausgelesen, der Inhalt wird formatiert an 'data' gebunden. 'data' ist eine Liste, das ist für den Vergleich der jetzt kommt wichtig. Es wird nämlich nur ein Teil von 'data' verglichen und zwar der, der sich hinter dem Index 1 verbirgt. (data[1]).
Ist der kleiner als der angegebene Vergleichswert beginnt die 'for'-Schleife wieder von vorne und bindet die nächste Zeile an 'data'. 'data' hat dabei immer nur die aktuell ausgelesene Zeile und diese wird ausgegeben wenn Index 1 von 'data' größer als der Vergleichswert ist.

Grüße
Dennis

Ja im zweiten Teil/Version.
Das schrieb ich ja auch.

Aber im ersten mit Continue sieht es ja so aus, als wird data bis zum Ende der Iteration gefüllt und erst dann ausgegeben.
Benutzeravatar
__blackjack__
User
Beiträge: 14078
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@andie39: Ich weiss nicht was Du damit meinst, aber es klingt falsch. In beiden Versionen wird ``data`` am Anfang jeder Iteration ”gefüllt”. Danach wird dann entschieden ob das ausgegeben werden soll oder nicht. Nur halt auf unterschiedliche Arten. In der ersten Version wird die Ausgabe ”übersprungen” wenn die Bedingung zutrifft. In der zweiten Version wird die Ausgabe ausgeführt wenn die gegenteilige Bedingung zutrifft.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten