2011-07-21 16 views
6

Scenariusz: Kiedy fotografuję obiekt, wykonuję wiele zdjęć pod różnymi kątami. Mnożąc liczbę obiektów, które "strzelam", mogę wygenerować dużą liczbę obrazów. Problem: Aparat generuje obrazy oznaczone jako "DSCN100001", "DSCN100002" itp. CrypticData utworzenia i zmiany nazwy pliku Python - prośba o krytykę

Przygotowałem skrypt, który będzie monitował o specyfikację katalogu (Windows), a także "Prefiks". datę i czas utworzenia pliku i odpowiednio zmienić nazwę pliku Prefiks zostanie dodany na początku nazwy pliku, więc "DSCN100002.jpg" może stać się "FatMonkey 20110721 17:51:02". Szczegóły czasu są ważne dla mnie chronologia

Poniższy scenariusz: proszę mi powiedzieć, czy to jest Pythonic, niezależnie od tego, czy jest źle napisany i, oczywiście, czy jest czystszy - bardziej efektywny sposób robienia tego ..

import os 
    import datetime 
    target = raw_input('Enter full directory path: ') 
    prefix = raw_input('Enter prefix: ') 
    os.chdir(target) 
    allfiles = os.listdir(target) 
    for filename in allfiles: 
     t = os.path.getmtime(filename) 
     v = datetime.datetime.fromtimestamp(t) 
     x = v.strftime('%Y%m%d-%H%M%S') 
     os.rename(filename, prefix + x +".jpg") 

Odpowiedz

7

Sposób, w jaki to robisz, wygląda na Pythoniczny. Kilka alternatyw (niekoniecznie sugestii):

Można pominąć os.chdir(target) i wykonać os.path.join(target, filename) w pętli.

Można zrobić strftime('{0}-%Y-%m-%d-%H:%M:%S.jpg'.format(prefix)), aby uniknąć łączenia ciągów. Jest to jedyny, który polecam.

Można ponownie użyć nazwy zmiennej, takiej jak temp_date zamiast t, v i x. To byłoby OK.

Można pominąć przechowywania zmiennych tymczasowych i po prostu zrobić:

for filename in os.listdir(target): 
    os.rename(filename, datetime.fromtimestamp(
         os.path.getmtime(filename)).strftime(
          '{0}-%Y-%m-%d-%H:%M:%S.jpeg'.format(prefix))) 

Można uogólnić swoją funkcję do pracy rekurencyjnych katalogów za pomocą os.walk().

Można było wykryć rozszerzenie plików, więc byłoby poprawne nie tylko dla .jpeg s.

Można upewnić się, że tylko przemianowany pliki formie DSCN1#####.jpeg

3

Twój kod jest ładne i proste. Kilka możliwych ulepszeń mogę zasugerować:

  1. Command line arguments jest bardziej korzystne dla dir nazw powodu autocomplition przez TAB
  2. EXIF ​​jest bardziej dokładne źródło data i godzina zdjęć tworzeniu. Jeśli modyfikujesz zdjęcie w edytorze graficznym, modify time zostanie zmieniony, a informacje EXIF ​​zostaną zachowane. Oto dyskusja na temat biblioteki EXIF ​​dla Pythona: Exif manipulation library for python
+0

Bardzo przydatna rekomendacja.Po przeczytaniu niektórych dokumentacji uważam, że pyexiv2 jest dobrym rozwiązaniem. (Ostatnio FTP wysłał kilka zdjęć na serwer przy użyciu FileZilla, ku mojemu przerażeniu, zmodyfikowany czas dla WSZYSTKICH obrazów został zmieniony na czas wysyłania) –

2

Moja jedyna myśl to to, że jeśli chcesz, aby komputer wykonał pracę za ciebie, pozwól mu wykonać więcej pracy. Zakładam, że zamierzasz strzelać do jednego obiektu kilka razy, a następnie albo przejść do innego obiektu, albo przenieść inny obiekt na miejsce. Jeśli tak, możesz rozważyć grupowanie zdjęć według odległości znaczników czasu (może każda delta powyżej 2 minut jest uważana za nowy obiekt). Następnie na podstawie tych pseudo klastrów można nazwać zdjęcia według obiektu.

Może nie być tym, czego szukasz, ale pomyślałem, że dodam w tej sugestii.

+0

Tak. "..let (komputer) wykonuje więcej pracy ..." jest zawsze moim celem. Grupowanie plików w oparciu o starannie dobraną deltę (czytałem specyfikacje na temat delty) znacznie ułatwiłoby pracę i sprawiłoby, że cenny wolny czas byłby bardziej dostępny. –

Powiązane problemy