dateien sortieren (erstellungsdatum)

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
abstract
User
Beiträge: 33
Registriert: Mittwoch 14. September 2005, 09:29

Montag 28. November 2005, 18:02

hi! folgendes problem:
ich lass avi dateien rausrendern (blender) und will diese im anschluss umbennenen. das läuft mit dem os.rename() modul ziemlich glatt, bloss werden die dateien nach datei namen umbenannt und nicht nach erstellungs datum.
d.h. es kommt ne datei 0001_0047.avi und ne 0001_0020.avi und wenn ich dann sowas drüberlaufen lasse:

Code: Alles auswählen

        os.chdir("C:/tmp/")
        files = [];index=0;i=0;
        rename = ['1.avi','2.avi','3.avi','4.avi','5.avi','6.avi']
        files = os.listdir(os.getcwd())
        while index < 6:
            os.rename(files[index],rename[i])
            index +=1;i +=1
wird zuerst die 0001_0020.avi in 1.avi umbennant und die 0001_0047.avi in 2.avi, wobei ich es genau andersrum brauche!

kann man die dateien vorher nach erstellungsdatum sortieren ? oder jemand ne andere idee ?
Thanxx
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Montag 28. November 2005, 19:08

Dateinamen einlesen und mit Erstellungsdatum in ein Dict speichern.
Dann nach Erstellungsdatum sortiert bearbeiten, d.h. umbenennen...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
abstract
User
Beiträge: 33
Registriert: Mittwoch 14. September 2005, 09:29

Montag 28. November 2005, 19:15

wie geht das genau in dem dict ?
vielleicht n stück code ?
THanXXXX
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Montag 28. November 2005, 19:21


CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Gast

Montag 28. November 2005, 20:59

Code: Alles auswählen

os.chdir("C:/tmp/")
files = [];index=0;i=0;
dict ={}
files = os.listdir(os.getcwd())
while index < 6:
    dict[index]=files[i]
    st=os.stat(dict[index])
    mode, ino, dev, nlink, uid, gid, size, atime, mtime, ctime = st
    dict[index] = time.ctime(ctime)
    index +=1;i +=1
habs mal soweit krieg aber nur den zweiten wert gesetzt also z.B.
1: 'Mon Nov 28 19:30:18 2005'
oder eben
1: '1.avi'

wie setzt man den ersten wert ?
und wie sortier ich es dann ?
und sind dann die dateien in dem ordner auch so gesetzt?

THANXX

Edit (Leonidas): Code in Python-Tags gesetzt.
BlackJack

Montag 28. November 2005, 23:44

Wenn Du die Zeit als Zeichenkette formatierst, dann kannst Du danach nicht mehr sortieren.

Am besten erstellt man eine Liste mit Tupeln (ctime, dateiname) sortiert diese und holt dann die Dateinamen wieder aus den Tupeln. Das macht die Funktion `sort_by_ctime()`.

Dann kann man mit einer ``for``-Schleife über die Liste gehen. Da Du Nummern brauchst, kann man sich die einzelnen Listeneinträge mit `enumerate()` nummerieren lassen.

Code: Alles auswählen

import os
from operator import itemgetter


def sort_by_ctime(filenames):
    """Sort iterable of filenames by ctime and return list."""
    def ctime_filename(filename):
        """Return a tuple with ctime and filename for given filename."""
        return (os.stat(filename).st_ctime, filename)

    return map(itemgetter(1), sorted(map(ctime_filename, filenames)))

sorted_files = sort_by_ctime(os.listdir(os.getcwd()))

for i, old_name in enumerate(sorted_files):
    new_name = '%d.avi' % (i + 1)
    print old_name, '->', new_name
    # os.rename(old_name, new_name)
Mehrere Anweisungen mit ';' auf eine Zeile zu schreiben ist in Python übrigens ziemlich unüblich, genau wie das benutzen von Idexierung wenn man über eine Liste iterieren möchte.
abstract
User
Beiträge: 33
Registriert: Mittwoch 14. September 2005, 09:29

Dienstag 29. November 2005, 10:09

Thanxx werds versuchen!
hab auch ´ne andere lösung entdeckt!

und zu :
Mehrere Anweisungen mit ';' auf eine Zeile zu schreiben
ist noch von c bei mir übrig geblieben und funktioniert ja auch und spart platz !
naja aber die schlange hat mich im griff!

:lol:
Antworten