Seite 1 von 1

Fragen zur Einrückung (Block) & Codierung

Verfasst: Dienstag 4. Januar 2022, 23:03
von andie39
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?

Re: Fragen zur Einrückung (Block) & Codierung

Verfasst: Dienstag 4. Januar 2022, 23:20
von sparrow
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.

Re: Fragen zur Einrückung (Block) & Codierung

Verfasst: Mittwoch 5. Januar 2022, 00:27
von andie39
Danke.

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


Und wie gibt man die Codierung an?

Re: Fragen zur Einrückung (Block) & Codierung

Verfasst: Mittwoch 5. Januar 2022, 06:45
von noisefloor
Hallo,

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

Gruß, noisefloor

Re: Fragen zur Einrückung (Block) & Codierung

Verfasst: Mittwoch 5. Januar 2022, 07:27
von sparrow
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.

Re: Fragen zur Einrückung (Block) & Codierung

Verfasst: Mittwoch 5. Januar 2022, 13:24
von __blackjack__
@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`.

Re: Fragen zur Einrückung (Block) & Codierung

Verfasst: Mittwoch 5. Januar 2022, 20:53
von andie39
@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

Re: Fragen zur Einrückung (Block) & Codierung

Verfasst: Mittwoch 5. Januar 2022, 21:08
von __blackjack__
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.

Re: Fragen zur Einrückung (Block) & Codierung

Verfasst: Donnerstag 6. Januar 2022, 11:31
von Dennis89
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

Re: Fragen zur Einrückung (Block) & Codierung

Verfasst: Sonntag 9. Januar 2022, 01:25
von andie39
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.

Re: Fragen zur Einrückung (Block) & Codierung

Verfasst: Sonntag 9. Januar 2022, 02:58
von __blackjack__
@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.