Bilderupload auf FTP Server

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
tomtee
User
Beiträge: 2
Registriert: Sonntag 14. Dezember 2014, 22:13

Hallo, ich bin über den Raspberry Pi zu Python gekommen und noch blutiger Anfänger. In meinem Projekt möchte ich mit der Kamera des Raspberry Bilder auf einen Ftp Server hochladen und diese Bilder sollen mit einem Index versehen sein, also Bild1.jpg, Bild2.jpg u.s.w, in diesem Fall von 2 bis 10, wobei die älteren Bilder von den neueren mit gleichem Index überschrieben werden sollen, damit sich nicht zu viele Bilder auf dem Server ansammeln.
Der upload ohne Index funktioniert auch einwandfrei, aber mit der Indizierung hab ich Probleme. Es liegt wohl an dem Namen, den ich der Funktion Upload() übergebe, aber ich hab keine Ahnung, wie ich das richtig machen könnte und hab leider auch in den einschlägigen Büchern nichts gefunden. Wenn mir da jemand weiterhelfen könnte, wäre ich sehr dankbar.

Code: Alles auswählen

#!/usr/bin/python
# coding=utf-8
import time, sys
import picamera
import ftplib

cam = picamera.PiCamera()
cam.resolution = (800, 600)
cam.rotation = 180
nummer = 1
newfilename=['bild02%d.jpg' % nummer]

def upload():
	session = ftplib.FTP ('ftp.server.com' , 'benutzername' , 'passwort' )
	directory = "/"
	session.cwd(directory)
	file = open('newfilename' , 'rb')
	session.storbinary('STOR newfilename' , file)
	file.close()
	session.quit()
	return
	
try:
    while True:
		cam.capture(newfilename)
		
		nummer += 1
		time.sleep(15)
		if nummer==11:
			nummer=1
			upload()
		else:	
			upload()
		
except KeyboardInterrupt:
	cam.close()
	sys.exit()
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@tomtee: es gibt einen Unterschied zwischen dem Literalen String 'newfilename' und der Variable newfilename. In Zeile 17 und 18 wird nicht auf magische Weise ein String durch den Inhalt einer Variable ersetzt. Warum ist newfilename eine Liste mit einem Element?

Einrücktiefe ist in Python immer 4 Leerzeichen und nicht mal 8, mal 12. Wenn die gleiche Zeile im if- und im else-Teil vorkommt, kann man sie auch einfach einmal dahinter schreiben. upload sollte als Parameter noch newfilename erhalten.
tomtee
User
Beiträge: 2
Registriert: Sonntag 14. Dezember 2014, 22:13

Das mit den Einrückungen ist klar, das mache ich auch gleich anders.
Meine frage ist, glaube ich, die nach der magischen Weise, in der die Variable mit dem String, der ja eigentlich den Index enthalten soll, korrespondiert, bzw habe ich das jetzt so verstanden, dass ich es einfacher machen kann, wenn ich einfach von

Code: Alles auswählen

cam.capture('bild.jpg')
'bild.jpg' an upload() übergebe und nur den Dateinamen ,also den string verändere?
lackschuh
User
Beiträge: 281
Registriert: Dienstag 8. Mai 2012, 13:40

@tomtee

Schau mal in der Doku von picamera nach. picamera bietet von Haus aus einen Iterator an, welchen du mit folgenden zwei Platzhaltern aufrufen kannst:
- {counter}
- {timestamp}

Also 'image{counter}.jpg' oder 'image{counter:02d}.jpg'
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@tomtee
In Fällen, in denen ich nicht genau weiß, warum etwas nicht wie erwartet funktioniert, versuche ich während dem Programmlauf an Informationen zu kommen. Das einfachste Mittel dazu ist ``print``. Du könntest also einfach mal zur Laufzeit Werte anzeigen lassen um zu sehen, was da passiert:

Code: Alles auswählen

def upload():
        session = ftplib.FTP('ftp.server.com' , 'benutzername' , 'passwort' )
        directory = "/"
        session.cwd(directory)
        file_ = open('newfilename' , 'rb')
        print file_.name
        session.storbinary('STOR newfilename' , file_)
        file_.close()
        session.quit()
        return
Noch was: Beim Aufruf einer Funktion, Methode oder Klasse gehört zwischen Name und öffnender Klammer kein Leerzeichen. Ist zwar kein Fehler, macht man aber nicht.
``file`` ist der Name einer builtin Funktion und sollte nicht überschrieben werden. Bei einem Namenskonflikt kannst Du entweder dem Namen einen Unterstrich anhängen oder aber besser noch, Du überlegst Dir einen anderen Namen.

Wenn Dir ``print`` irgendwann einmal für Debugzwecke nicht mehr ausreicht, solltest Du einen Blick ins pdb-Modul werfen. Nach meiner Frau die wichtigste Entdeckung meines Lebens! :mrgreen:

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Antworten