Bilder mit fortlaufender nummer

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Bencem
User
Beiträge: 3
Registriert: Samstag 23. Dezember 2017, 10:46

Bilder mit fortlaufender nummer

Beitragvon Bencem » Samstag 23. Dezember 2017, 11:02

Hallo zusammen, ich bin neu in dem ganzen und möchte eine fotobox bauen.
Hab mir nen raspberry pi 3 besorgt mit ner camera.
Hab soweit das hier in python eingegeben.

from picamera import PiCamera
from time import sleep

camera = PiCamera()

camera.start_preview
sleep(5)
camera.capture(ˋ/home/pi/image001.jpg´)
camera.stop_preview()

So kann ich ein foto machen was auch gespeichert wird als image1.jpg
Ich möchte aber bei dem nächsten foto einer 002 dahinter haben so das er mir das erste image nicht löscht
also image001.jpg, image002.jpg, image03.jpg usw

Kann mir jemand dabei behilflich sein?
Danke im vorraus
Sirius3
User
Beiträge: 7069
Registriert: Sonntag 21. Oktober 2012, 17:20

Re: Bilder mit fortlaufender nummer

Beitragvon Sirius3 » Samstag 23. Dezember 2017, 11:24

@Bencem: Du mußt schauen, ob die Datei schon existiert und wenn ja, die nächste Datei nehmen. Oder Du speichert Dir irgendwo einen Zähler. `start_preview` solltest Du auch aufrufen.
Bencem
User
Beiträge: 3
Registriert: Samstag 23. Dezember 2017, 10:46

Re: Bilder mit fortlaufender nummer

Beitragvon Bencem » Samstag 23. Dezember 2017, 22:20

Sirius3 hat geschrieben:@Bencem: Du mußt schauen, ob die Datei schon existiert und wenn ja, die nächste Datei nehmen. Oder Du speichert Dir irgendwo einen Zähler. `start_preview` solltest Du auch aufrufen.


Verstehe nicht was du damit meinst mit die nächste datei nehmen, er soll doch immer eine neue datei erstellen mit der endung 002,003 usw.
und was meinst du mit start_preview aufrufen, was hat das für ne auswirkung oder wofür ist das?
Ich kenne mich nicht so gut aus das ich da was reinschreiben kann brauche leider genaue angaben
Benutzeravatar
__deets__
User
Beiträge: 2177
Registriert: Mittwoch 14. Oktober 2015, 14:29

Re: Bilder mit fortlaufender nummer

Beitragvon __deets__ » Samstag 23. Dezember 2017, 23:32

Du hast beim abtippen des Programms einen Fehler gemacht und die Klammern () hinter start_preview vergessen.

Und „nächste“ bedeutet, das du nachschauen musst, welche Dateien schon existieren, bevor du eine neue schreibst. Denn das Skript hat beim Neustart Amnesie, und weiß nicht, was es schon mal geschrieben hat.

Das ist halt programmieren. Es wirkt so, als ob du das weder kannst noch willst. Das ist ok, nur solltest du dann eher nach einer kompletten Fotoboxlösung schauen, statt das zeilenweise zusammenzustoppeln.
Benutzeravatar
snafu
User
Beiträge: 5389
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Re: Bilder mit fortlaufender nummer

Beitragvon snafu » Sonntag 24. Dezember 2017, 02:03

Hab mal was gebastelt:
  1. import glob
  2. import os
  3.  
  4. def make_filename(prefix, suffix, path='.', num_digits=3):
  5.     pattern = '{}*{}'.format(prefix, suffix)
  6.     filenames = glob.iglob(os.path.join(path, pattern))
  7.     try:
  8.         count = int(max(filenames).lstrip(prefix).rstrip(suffix)) + 1
  9.     except ValueError:
  10.         # max() or int() failed (no filenames, no digits, ...)
  11.         count = 0
  12.     formatted_count = str(count).zfill(num_digits)
  13.     return prefix + formatted_count + suffix

Ist recht viel Gefrickel, aber sofern ich kein Riesenbrett vorm Kopf hab, geht es nicht wirklich schöner. Sonst halt eine fertige Lösung nehmen...

EDIT:
Alternativ kann man das auch mit regulären Ausdrücken lösen. Wollte das hier nur erstmal mit Pythons str()-Methoden umsetzen. Prinzipiell lässt sich das noch robuster implementieren, womit der Code allerdings noch komplexer wäre. Oder man schreibt wie gesagt einen ausgeklügelten regulären Ausdruck dafür.
shcol (Repo | Doc | PyPi)
Benutzeravatar
snafu
User
Beiträge: 5389
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Re: Bilder mit fortlaufender nummer

Beitragvon snafu » Sonntag 24. Dezember 2017, 02:43

Hier die Regex-Variante:
  1. import re
  2. import os
  3.  
  4. def make_filename(prefix, suffix, path='.', num_digits=3):
  5.     pattern = re.compile(prefix + r'(\d+)' + suffix)
  6.     matches = map(pattern.match, os.listdir(path))
  7.     counts = [int(m.group(1)) for m in matches if m]
  8.     next_count = max(counts) + 1 if counts else 1
  9.     formatted_count = str(next_count).zfill(num_digits)
  10.     return prefix + formatted_count + suffix
  11.  
  12. if __name__ == '__main__':
  13.     print(make_filename('image', '.jpg'))
shcol (Repo | Doc | PyPi)
Bencem
User
Beiträge: 3
Registriert: Samstag 23. Dezember 2017, 10:46

Re: Bilder mit fortlaufender nummer

Beitragvon Bencem » Montag 25. Dezember 2017, 19:53

snafu hat geschrieben:Hier die Regex-Variante:
  1. import re
  2. import os
  3.  
  4. def make_filename(prefix, suffix, path='.', num_digits=3):
  5.     pattern = re.compile(prefix + r'(\d+)' + suffix)
  6.     matches = map(pattern.match, os.listdir(path))
  7.     counts = [int(m.group(1)) for m in matches if m]
  8.     next_count = max(counts) + 1 if counts else 1
  9.     formatted_count = str(next_count).zfill(num_digits)
  10.     return prefix + formatted_count + suffix
  11.  
  12. if __name__ == '__main__':
  13.     print(make_filename('image', '.jpg'))


Danke für eure mühe. Wo schrieb ich das rein unter meinen code oder dazwischen? Wie gesagt kenne mich nich so gut damit aus das heißt aber auch nich das ich nich lernen will wie manche sagen.
Benutzeravatar
snafu
User
Beiträge: 5389
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Re: Bilder mit fortlaufender nummer

Beitragvon snafu » Montag 25. Dezember 2017, 20:37

Na, du schreibst es an die Stelle, wo du den gewünschten Bildnamen einsetzen möchtest. Besser noch: Du belässt es als Funktion und rufst an der entsprechenden Stelle die Funktion auf.
shcol (Repo | Doc | PyPi)
Benutzeravatar
snafu
User
Beiträge: 5389
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Re: Bilder mit fortlaufender nummer

Beitragvon snafu » Montag 25. Dezember 2017, 22:51

Aus Spaß an der Freude hier noch etwas robuster und objektorientiert:
  1. import os
  2. import re
  3.  
  4. class FileNumberer(object):
  5.     def __init__(self, prefix, suffix, path='.', num_digits=3):
  6.         self.prefix = prefix
  7.         self.suffix = suffix
  8.         self.path = path
  9.         self.num_digits = num_digits
  10.  
  11.     @property
  12.     def pattern(self):
  13.         if self.num_digits is None:
  14.             digit_re = r'(\d+)'
  15.         elif self.num_digits <= 0:
  16.             raise ValueError('num_digits must be >= 1')
  17.         else:
  18.             digit_re = r'(\d{%i})' % self.num_digits
  19.         prefix = re.escape(self.prefix)
  20.         suffix = re.escape(self.suffix)
  21.         return re.compile(prefix + digit_re + suffix)
  22.  
  23.     @property
  24.     def matching_files(self):
  25.         filenames = os.listdir(self.path)
  26.         return filter(self.pattern.match, filenames)
  27.  
  28.     @property
  29.     def next_number(self):
  30.         filenames = os.listdir(self.path)
  31.         matches = map(self.pattern.match, filenames)
  32.         numbers = [int(m.group(1)) for m in matches if m]
  33.         return max(numbers) + 1 if numbers else 1
  34.  
  35.     @property
  36.     def next_filename(self):
  37.         formatted_number = str(self.next_number).zfill(self.num_digits)
  38.         return self.prefix + formatted_number + self.suffix
  39.  
  40. def main():
  41.     image_numberer = FileNumberer('image', '.jpg')
  42.     print('Matching filenames:')
  43.     print(list(image_numberer.matching_files))
  44.     print('Next filename:', image_numberer.next_filename)
  45.  
  46. if __name__ == '__main__':
  47.     main()
shcol (Repo | Doc | PyPi)
Sirius3
User
Beiträge: 7069
Registriert: Sonntag 21. Oktober 2012, 17:20

Re: Bilder mit fortlaufender nummer

Beitragvon Sirius3 » Montag 25. Dezember 2017, 23:04

@snafu: zu Deiner nicht-RegEx-Lösung: `lstrip` und `rstrip` machen nicht das, was Du denkst, was sie machen, das kann zu bösen Überraschungen führen. Und statt str und zfill nimmt man besser .format:
  1. def make_filename(prefix, suffix, path='.', num_digits=3):
  2.     pattern = '{}*{}'.format(prefix, suffix)
  3.     filenames = glob.iglob(os.path.join(path, pattern))
  4.     try:
  5.         count = int(max(filenames)[len(prefix):-len(suffix)]) + 1
  6.     except ValueError:
  7.         # max() or int() failed (no filenames, no digits, ...)
  8.         count = 1
  9.     formatted_count = str(count).zfill(num_digits)
  10.     return "{}{:0{}d}{}".format(prefix, count, num_digits, suffix)


Zu Deiner Klassenlösung: nicht alles ist sinnvollerweise ein Property. Zumindest next_number und next_filename sind eigentlich Funktionen, womit dann eigentlich die ganze Klasse wieder zu einer oder zwei Funktionen zusammengefasst werden kann. Warum verwendet next_number nicht matching_files? `pattern` kann zwar mit num_digits = None umgehen, next_filename aber nicht.

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder