Seite 1 von 1

dateien sortieren (erstellungsdatum)

Verfasst: Montag 28. November 2005, 18:02
von abstract
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

Verfasst: Montag 28. November 2005, 19:08
von jens
Dateinamen einlesen und mit Erstellungsdatum in ein Dict speichern.
Dann nach Erstellungsdatum sortiert bearbeiten, d.h. umbenennen...

Verfasst: Montag 28. November 2005, 19:15
von abstract
wie geht das genau in dem dict ?
vielleicht n stück code ?
THanXXXX

Verfasst: Montag 28. November 2005, 19:21
von jens

Verfasst: Montag 28. November 2005, 20:59
von Gast

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.

Verfasst: Montag 28. November 2005, 23:44
von BlackJack
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.

Verfasst: Dienstag 29. November 2005, 10:09
von abstract
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: