kann man das smarter/eleganter lösen ?

  • Hallo,


    willkommen in der Welt der Plattformunterschiede und Inkompatibiliäten :) Windows ist halt Windows und Linux ist Linux. Wenn man auf Windows für Linux entwickelt muss man halt bestimmte Sachen beachten. Python (und andere Programmiersprachen) laufen zwar prinzipiell auf Window und unixoiden-Systemen, ABER das Übertragen von Skripten kann schon bei so vermeintlich simplen Sachen wie Zeilenenden (\r\n vs \n - hast du ja selber in deinem cronjob Fragethread festgestellt) zu Fehlern führen. Und wenn du auf "low level" Sachen wie den Spracheinstellungen des System zugreift, dann ist halt Windows anders als Linux. Bzw. das ist noch nicht mal garantiert, dass sich alles Linux-Dsitros da gleich verhalten.


    IMHO hast du zwei Möglichkeiten:

    Entweder tauchst du da tief ein, baust das nötige Wissen auf und baust ggf. Plattformweichen in dein Programm ein. Oder die entwickelst direkt auf dem Pi oder eine Linux System auf deinen Hauptrechner. Das könnte ja auch grundsätzlich in einer VM laufen. Als Linux würde sich halt Debian oder Ubuntu anbieten, dann hast da a) ein Mainstream System und b) bist sehr nah an Raspbian dran.


    Gruß, noisefloor

  • ist/war so eingestellt. was mich allerdings wundert:

    wenn ich

    Code
    locale 

    eingebe, dann wird mir unter anderem LANG= und LANGUAGE = angezeigt, obwohl ich in dr raspi-config de-utf8  eingestellt habe. nun gut ...

    --- wer lesen kann, ist klar im Vorteil ---

    --- Freude entsteht aus Mangel an Information ---

    --- Scheiße ist, wenn der Furz etwas wiegt ---


  • Nur eine kurze Anmerkung: ich wuerde niemals mit den eingebauten LOCALE-Funktionalitaeten arbeiten. Die sind aus meiner Sicht fundamental verbockt, da sie mit globalem Zustand arbeiten, und durch die Umgebung gesteuert werden. Man hat also schnell Situationen, in denen ein Programm in einem anderen Kontext sich anders verhaelt, und muss dem dann hinterherprogrammieren.


    Fuer solche Dinge wuerde ich immer Babel verwenden: http://babel.pocoo.org/en/latest/

  • jetzt mal als schnellschuss:

    Python
    from babel.numbers import format_number, format_decimal
    
    format_decimal(float(gpreis), format='#,##0.##;(#)', locale='de')

    passt das ?

    --- wer lesen kann, ist klar im Vorteil ---

    --- Freude entsteht aus Mangel an Information ---

    --- Scheiße ist, wenn der Furz etwas wiegt ---


  • Ich dachte du willst Dinge einlesen? Warum willst du sie dann fuer eine Ausgabe formatieren?

  • vielleicht verstehe ich dich jetzt nicht, oder meine vorgehensweise ist die falsche, oder ichstehe einfach nur auf dem schlauch. ich ziehe mir daten (genauer: 2 zahlenwerte mit einem hieroglyphischen anhängsel) aus einer webseite. diese liegen dann als string vor. diese muss ich dann in zahlen umwandeln (=ausgabe ?), bevor ich sie in die db schreiben kann. wenn ich einen string als datentyp float in die db einfügen möchte, wird es wohl einen error geben. zuerst jedoch muss ich daten einer csv-datei in die db schreiben, da diese vorliegt. erst dann kann ich einmal täglich die zahlen aus der webseite ziehen und direkt in die db schreiben. so hatte ich es geplant. wenn es bessere wege gibt (und du kennst sie), dann immer gerne her damit.

    also:

    csv-datei enthält 180 zeilen => in db => erst dann direkt von webseite EINMAL täglich in die db. von db von den letzten 180 datensätzen die vorhandene csv überschreiben, die ich dann in json-string umwandeln kann, um sie daraufhin in meinem Modul (MagicMirror, javascript) verwenden zu können .... uff

    --- wer lesen kann, ist klar im Vorteil ---

    --- Freude entsteht aus Mangel an Information ---

    --- Scheiße ist, wenn der Furz etwas wiegt ---


  • Wenn du etwas *einliest* von einer Webseite, dann ist das doch keine *Aus*gabe. Sondern einen *Ein*gabe. Und du willst also nicht zur Ausgabe formatieren, sondern aus einer Eingabe, die in einem bestimmten Locale vorliegt, *einlesen*. Und dazu benutzt man nunmal nicht die Funktionen, mit denen man fuer eine bestimmte *Ausgabe* *formatiert*. Sondern die Funktionen, mit denen man einliest.

  • @EL:

    wenn ich das script über ssh ausführe funktioniert es nicht

    Moment mal... Das hat nur begrenzt was mit Kompatibilität zwischen Windows und Linux zu tun.

    Prinzipiell funktioniert das von allen Maschinen aus mit SSH (habs jetzt mit windows, ubuntu, debian und Android getestet). Du darfst halt logischerweise keine andere locale übermitteln wenn du die vom Raspi nutzen willst. Das sind aber Einstellungen in deinem SSH Dienst.

  • @EL:

    putty ist mit utf-8 eingestellt ...


    aber:

    __deets__ ist schon genial !

    Python
    >>> from babel.numbers import parse_decimal
    >>> goldpreis = "1.567,89"
    >>> gpreis = parce_decimal("1.567,89", locale="de")
    >>> print (gpreis)
    >>> 1567.89
    >>> type (gpreis)
    >>> <class 'decimal.Decimal'>

    WAS will ich mehr ? ich werde das dann mal scripten und über ssh versuchen ... aber zuerst mal ein bißchen datenbank


    edit: jetzt klappt's auch mit ssh :-))

    --- wer lesen kann, ist klar im Vorteil ---

    --- Freude entsteht aus Mangel an Information ---

    --- Scheiße ist, wenn der Furz etwas wiegt ---


    Edited once, last by Perlchamp ().

  • 2. code-beispiel zum smarter machen:

    wie gehabt: kann man's noch smarter lösen ?


    ein fettes merci im voraus !

    so long

    --- wer lesen kann, ist klar im Vorteil ---

    --- Freude entsteht aus Mangel an Information ---

    --- Scheiße ist, wenn der Furz etwas wiegt ---


    Edited once, last by Perlchamp: änderung des codes ().

  • Hallo,


    1. Programmlogik und Ausgabe trennen. Machst du nicht, dadurch verhält sich `is_prime_number` unerwartet.

    2. Über die Mathematik nachdenken:

    a) ist `for x in range(2, zahl)` wirklich notwendig, also von 2 bis `zahl`.

    b) 1 ist auch eine natürlich Zahl

    c) gem. deinem Code sind alle ganzen negativen Zahlen und die Null eine Primzahl


    Das ist eigentlich ein schönes Beispiel, wo man sieht, wie sinnvoll es ist, Tests zu schreiben und seine Funktion zu testen, um zu sehen, dass sie wirklich das macht, was man möchte, dass sie macht.


    Gruß, noisefloor

  • Da ist ein break Zuviel, das else vom for kann man so benutzen, ist aber verwirrend, der docstring ist missverständlich.

  • ich habe eine csv-datei, die 30 einträge hat. mehr sollen es auch nicht werden.

    für mein Verständnis liest sich das so als wenn du nur stets auf die letzten 30 Zeilen schauen magst und die csv nie mehr als 30 Zeilen haben soll.


    Ich hatte da mal was vor Jahren miterarbeitet:


    wenn es tail nicht gibt

    https://de.wikipedia.org/wiki/Tail_(Unix)


    baut man es halt selbst!

    http://www.nas-forum.org/index…read&postID=1648#post1648


    hier werden die letzten 99 Einträge stets gesichert, die Datei hat nicht mehr als 99 Einträge!


    muss halt auf 30 umgebaut werden.

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • jar:

    das habe ich bereits mit einer sqlite3-datenbank gelöst, welche per script jeden tag die letzten 30 einträge in ein neues csv-file schreibt. danke für deine zeit !

    --- wer lesen kann, ist klar im Vorteil ---

    --- Freude entsteht aus Mangel an Information ---

    --- Scheiße ist, wenn der Furz etwas wiegt ---


  • Perlchamp na ich habe die Dinge, die noisefloor auffgezaehlt hat, natuerlich nicht nochmal aufgezaehlt. Und er hat da die deutlich relevanteren Dinge erwaehnt, wie zB das diese Funktion ein boolean zurueck lieferen sollte, und nicht auch selbst die Ausgabe machen. Sowas ist strikt zu trennen.

  • noisefloor :

    1. also print(is_prime_number(zahl)) raus aus der benutzereingabe ?

    2a: wo ist deiner meinung nach die grenze zu setzen? durch das break wird ja nach der ersten teilbaren zahl die schleife abgebrochen (1897: kleinster teiler ist 7)

    2b: mittels if-statement diese eingaben verhindern ?


    go.lower bereits umgesetzt - danke

    --- wer lesen kann, ist klar im Vorteil ---

    --- Freude entsteht aus Mangel an Information ---

    --- Scheiße ist, wenn der Furz etwas wiegt ---


    Edited once, last by Perlchamp: stuss geschrieben ().