Hallo!
Ich bin neu hier (aber nich so neu bei Python ) und würde euch gerne mein aktuelles, und auch erstes größeres Proekt vorstellen.
Ich dachte, es gibt keinen besseren Ort als hier, eine Gemeinschaft deutschsprachiger, Python Programmierer.
Denn ich habe mein Projekt als Opensource Programm gestartet und da mit anscheinend doch noch Kenntnisse in Python fehlen, ist das Programm noch nicht mal ganz fertig:
Hier der aktuelle Stand:
https://sourceforge.net/projects/netlogdownload/
Die ".py" Datei ist reichlich kommentiert.
Eine kurze Beschreibung, was das Programm eigentlich tut:
Es ist eigentlich nur für Mitglieder der Social Community NETLOG (http://de.netlog.com) von Nutzen.
- Man gibt einen Nicknamen dieser Community in das Programm ein (dabei muss man selbst nicht registriert sein)
- Das Skript läd dann den HTML Code des entsprechenden Profils herunter und filtert die URL des Profilbildes heraus.
- 2 Buchstaben in dieser URL werden noch ersetzt, damit aus dem Vorschaubild ein großes Bild wird.
- Dieses wird dann lokal gespeichert.
Was ich noch gerne einbauen würde:
- Eine überprüfung ob man überhaupt eine Internet Verbindung hat (derzeit kommt noch eine unschöne Warnmeldung von urllib)
- Dass sich das heruntergeladene Bild nach dem Herunterladen einfach im Standardprogramm öffnet.
- und ein paar andere Sachen, die im Forum von Sourceforge nachzulesen sind..
Aja, hier der Paste: http://paste.pocoo.org/show/JyyCzuhEUTwdodYGSCz6/
lg
NETLOG Profilbild Download-Manager
Über Sinn oder Unsinn eines Programms zum Speichern von Bildern möchte ich nicht urteilen. Aber ein paar Tipps zum Quelltext, der eigentlich schon okay ist.
`import ctypes` ist unnötig. Das Modul `string` ist deprecated, schon seit vielen Jahren sind `tolower` und `strip` Methoden von String-Objekten. Dass das Programm dank der Aufrufe mit `os.system` und den Pfaden mit `C:\\` unnötigerweise hochgradig Windows-spezifisch ist, muss ich nicht wirklich erwähnen. Der leere String bei `wait=raw_input('')` ist unnötig. Die ganze Zeile ist eigentlich nur unter Windows nötig und ansonsten störend.
Die for-Schleife in Zeile 51 kann einfach `for char1 in nickname:` lauten. Der Test (ein `if` hat übrigens keine Klammern in Python) kann `if char1 in "!?/\\$'\"<>..."` lauten. Und was soll die `1` im Namen? Die Liste der Zeichen ist schon wieder Windows-spezifisch. Ich weiß so aus dem Stegreif nicht, ob man plattformunabhängig in Python prüfen kann, ob ein Dateiname gültig ist. Java könnte es.
Konstanten (wie `baseurl`) sind eigentlich eine gute Idee, doch wenn, dann besser am Programmanfang und den Namen in als Konvention in GROSSBUCHSTABEN. Übrigens, es freut bestimmt netlog-User, dass der Betreiber sie vom User gewählten privacy-Einstellungen bzgl. des Bilds nicht korrekt umsetzt.
Ressourcen wie Dateien oder auch URLs besser mit `with` öffnen, dann kann man auch das Schließen nicht vergessen. Jetzt ist nicht schön, dass das `exit` aus dem Programm haut, wenn `f.close()` noch nicht erfolgt ist (nicht schlimm, dass Betriebssystem räumt für einen auf, aber schlechter Stil IMHO).
Aus `raw_input` schließe ich Python 2.x. Da ist `print` ein Befehl, keine Funktion und braucht keine Klammern. Und lasse auch die `;` weg. Das hier ist kein C{++,#} oder Java.
Der Test auf `post==-1` (Leerzeichen rechts und links von Operatoren dankt einem jeder Leser) sollte stattfinden, bevor `link` berechnet wird. Vielleicht wäre hier auch ein regulärer Ausdruck einfacher. Insbesondere, wo später noch auch `.jpg` gesucht wird.
Und `==True` geht GAR NICHT. So überhaupt nicht. Boolsche Werte nochmals mit einem Boolschen Wert zu vergleichen (Zeile 100) ist stottern. Wo will man aufhören? `if (((a == 5) == True) == True) == True`? Oder noch ein `==True`? In Zeile 20 und 22 war es doch richtig.
PS: Statt 114 Zeilen Python hätte man auch "einfach" (für Posterous) folgendes machen können
Es richtig in Python zu machen wird aber schon wieder schwerer, denn man müsste eigentlich das Encoding beachten und je nachdem, ob das wohl XHTML oder nur HTML ist, im ersten Fall noch mal das XML dekodieren. Da nimmt man dann besser einen HTML-Parser wie mal ihn in lxml (muss man leider als Paket nachinstallieren) findet. Dafür kann man dort dann auch ählich wie bei JQuery mit CSS-Selektoren nach Dingen im DOM suchen.
`import ctypes` ist unnötig. Das Modul `string` ist deprecated, schon seit vielen Jahren sind `tolower` und `strip` Methoden von String-Objekten. Dass das Programm dank der Aufrufe mit `os.system` und den Pfaden mit `C:\\` unnötigerweise hochgradig Windows-spezifisch ist, muss ich nicht wirklich erwähnen. Der leere String bei `wait=raw_input('')` ist unnötig. Die ganze Zeile ist eigentlich nur unter Windows nötig und ansonsten störend.
Die for-Schleife in Zeile 51 kann einfach `for char1 in nickname:` lauten. Der Test (ein `if` hat übrigens keine Klammern in Python) kann `if char1 in "!?/\\$'\"<>..."` lauten. Und was soll die `1` im Namen? Die Liste der Zeichen ist schon wieder Windows-spezifisch. Ich weiß so aus dem Stegreif nicht, ob man plattformunabhängig in Python prüfen kann, ob ein Dateiname gültig ist. Java könnte es.
Konstanten (wie `baseurl`) sind eigentlich eine gute Idee, doch wenn, dann besser am Programmanfang und den Namen in als Konvention in GROSSBUCHSTABEN. Übrigens, es freut bestimmt netlog-User, dass der Betreiber sie vom User gewählten privacy-Einstellungen bzgl. des Bilds nicht korrekt umsetzt.
Ressourcen wie Dateien oder auch URLs besser mit `with` öffnen, dann kann man auch das Schließen nicht vergessen. Jetzt ist nicht schön, dass das `exit` aus dem Programm haut, wenn `f.close()` noch nicht erfolgt ist (nicht schlimm, dass Betriebssystem räumt für einen auf, aber schlechter Stil IMHO).
Aus `raw_input` schließe ich Python 2.x. Da ist `print` ein Befehl, keine Funktion und braucht keine Klammern. Und lasse auch die `;` weg. Das hier ist kein C{++,#} oder Java.
Der Test auf `post==-1` (Leerzeichen rechts und links von Operatoren dankt einem jeder Leser) sollte stattfinden, bevor `link` berechnet wird. Vielleicht wäre hier auch ein regulärer Ausdruck einfacher. Insbesondere, wo später noch auch `.jpg` gesucht wird.
Und `==True` geht GAR NICHT. So überhaupt nicht. Boolsche Werte nochmals mit einem Boolschen Wert zu vergleichen (Zeile 100) ist stottern. Wo will man aufhören? `if (((a == 5) == True) == True) == True`? Oder noch ein `==True`? In Zeile 20 und 22 war es doch richtig.
PS: Statt 114 Zeilen Python hätte man auch "einfach" (für Posterous) folgendes machen können
Code: Alles auswählen
curl -O `curl -s -L http://blog.posterous.com/ | grep -m 1 -o -P '(?<=src=")http://files.posterous.com/user_profile_pics/[^"]*'`
Also viel Dank einmal für die ganzen Tipps.
Also ich habe schon vor, das Programm plattformunabhängig zu machen, nur an welchem Ort sollte ich die Bilder dann speichern ?
Bei Windows ist eben: C:\users\name\pictures, am naheliegensten, bei linux wahrscheinlich ./home/name/bilder/ .. kann ich eine Abfrage machen um welches Betriebsystem es sich handelt ?
Und ja, ich weiß, dass das wait=raw_input('') nur auf Windows notwenig ist.. aber das benutzen nun mal die meisten .. nichteinmal auf Windows ist die Zeile unbedingt notwendig, wenn man das Programm in der Konsole startet..
Danke für die Verkürzung der Schleife, aber die liste ist NICHT Windows spezifisch.
Der Filter hat nichts mit dem Dateinamen zu tun, sondern vielmehr mit dem NETLOG Nicknamen, der gewisse Sonderzeichen gar nicht enthalten kann.
(Wobei du doch recht hast, sekundär wird so auch verhindert einen ungültigen Dateinamen zu wählen..)
Und ja, das mit den privacy-Einstellungen von NETLOG ist interessant, .. Ich habe den Support schon vor Monaten darauf aufmerksam gemacht, und sie meinen man könne auch in den AGB nachlesen, dass gewisse Basisinformationen (Profilbild, Alter, Geschlecht) für jeden sichtbar sind.
Wegen den Klammern beim print, tut mir leid .. ich hab in letzte Zeit sehr viel in C Programmiert und bin erst auf Python umgestiegen..
Danke nochmal, und ich werde nochmal alles überarbeiten
Also ich habe schon vor, das Programm plattformunabhängig zu machen, nur an welchem Ort sollte ich die Bilder dann speichern ?
Bei Windows ist eben: C:\users\name\pictures, am naheliegensten, bei linux wahrscheinlich ./home/name/bilder/ .. kann ich eine Abfrage machen um welches Betriebsystem es sich handelt ?
Und ja, ich weiß, dass das wait=raw_input('') nur auf Windows notwenig ist.. aber das benutzen nun mal die meisten .. nichteinmal auf Windows ist die Zeile unbedingt notwendig, wenn man das Programm in der Konsole startet..
Danke für die Verkürzung der Schleife, aber die liste ist NICHT Windows spezifisch.
Der Filter hat nichts mit dem Dateinamen zu tun, sondern vielmehr mit dem NETLOG Nicknamen, der gewisse Sonderzeichen gar nicht enthalten kann.
(Wobei du doch recht hast, sekundär wird so auch verhindert einen ungültigen Dateinamen zu wählen..)
Und ja, das mit den privacy-Einstellungen von NETLOG ist interessant, .. Ich habe den Support schon vor Monaten darauf aufmerksam gemacht, und sie meinen man könne auch in den AGB nachlesen, dass gewisse Basisinformationen (Profilbild, Alter, Geschlecht) für jeden sichtbar sind.
Wegen den Klammern beim print, tut mir leid .. ich hab in letzte Zeit sehr viel in C Programmiert und bin erst auf Python umgestiegen..
Danke nochmal, und ich werde nochmal alles überarbeiten
Hier mal das was ich auf die schnelle verändert habe:
Neu:
http://paste.pocoo.org/show/MseHYPkCwfMH9NGLa4hp/
Das wegen dem plattformabhängigen Dateipfad kommt auf jeden Fall noch..
Neu:
http://paste.pocoo.org/show/MseHYPkCwfMH9NGLa4hp/
Das wegen dem plattformabhängigen Dateipfad kommt auf jeden Fall noch..
Die aktuelle Version (0.2) funktionier übrigens schon auf Linux
(siehe Sourceforge)
Ich hab bis jetzt nur Windows und Linux realisiert (weitere kommen):
außerdem habe ich eine md5 überprüfung der Bilder eingebaut..
lg
(siehe Sourceforge)
Ich hab bis jetzt nur Windows und Linux realisiert (weitere kommen):
Code: Alles auswählen
if os.name=="nt": #windows NT
pfad="C:\\users\\"+USER+"\\pictures\\NETLOG DOWNLOADS\\";
if os.name=="posix": #linux
pfad="/home/"+USER+"/bilder/NETLOG DOWNLOADS";
lg
Was ist wenn du Windows XP hast, dann gibt es den users Ordner nicht...
Dies wäre besser:
und noch Platformunabhängiger.
Dies wäre besser:
Code: Alles auswählen
pfad = os.path.join(os.environ.get('HOME'), "pictures", "NETLOG DOWNLOADS", "")
Ja, weil None zurück gibt
Code: Alles auswählen
os.environ.get('HOME')
the more they change the more they stay the same
ganz genau.. was kann man dagegen machen ?Dav1d hat geschrieben:Ja, weilNone zurück gibtCode: Alles auswählen
os.environ.get('HOME')
Bzw. wie verwende ich den Code dann ?
-
- User
- Beiträge: 996
- Registriert: Mittwoch 9. Januar 2008, 13:48
Hier mal der Versuch, alle Möglichkeiten zum Finden des Home-Pfads auszuschöpfen:
Ich kann jetzt allerdings nicht sagen, ob es auf nem Mac Abweichungen gibt...
Code: Alles auswählen
import os
def get_home(default=None):
# os.getenv is not available on some systems
getenv = os.environ.get
# windows
homepath = getenv('HOMEPATH')
if homepath:
return os.path.join(getenv('HOMEDRIVE'), homepath)
# others
return getenv('HOME') or default
Man könnte auch noch folgendes versuchen:snafu hat geschrieben:Hier mal der Versuch, alle Möglichkeiten zum Finden des Home-Pfads auszuschöpfen:
Code: Alles auswählen
os.path.expanduser('~')
Das Leben ist wie ein Tennisball.
Unter windows existiert doch noch
Code: Alles auswählen
os.environ.get('USERPROFILE')
the more they change the more they stay the same
EyDu hat geschrieben:Man könnte auch noch folgendes versuchen:snafu hat geschrieben:Hier mal der Versuch, alle Möglichkeiten zum Finden des Home-Pfads auszuschöpfen:
Code: Alles auswählen
os.path.expanduser('~')
Danke, auf das selbe bin ich gestern auch gekommen und habe es in der 0.6 Version jetzt
drinnen
Ob es sich um Windows oder Linux handelt muss trozdem abgefragt werden, weil ja windows Backslash's und Linuxs Slashs verwendet..
Hat wer ne Ahnung wies bei MAC aussieht ?
Nicht wundern> mit dieser Version habe ich auch gleich alles auf englisch übersetzt.
lg
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Es gibt `os.path.join` und `os.path.sep`.m477hi45 hat geschrieben:Ob es sich um Windows oder Linux handelt muss trozdem abgefragt werden, weil ja windows Backslash's und Linuxs Slashs verwendet..
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
@m477hi45: Ja und? Meine Anmerkung bezog sich auf den von Dauerbaustelle gezeigten Quelltext, der fehlerhaft ist, weil er Bilder nicht als Binärdateien behandelt. Korrekterweise müsste "wb" als Modus beim Öffnen der Datei angegeben werden. Unter Unix ist das zwar egal, unter Windows aber nicht.