dircache - anordnung von numerischen filenamen

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
thomas15
User
Beiträge: 98
Registriert: Montag 7. April 2008, 19:07

hallo alle,

ich haette eine triviale frage:

wie kann ich mir den inhalt eines verzeichnisses mit dircache numerisch richtig ausgeben lassen?

ich habe ein verzeichniss mit files die numerisch durchgezehlt sind:

1.em , 2.em , 10.em
usw.

beispiel mit ls:
so ist es

Code: Alles auswählen

$ ls
1.em 10.em 2.em
 
so sollte es sein

Code: Alles auswählen

$ ls -v
1.em 2.em 10.em
 
den gleichen effekt will ich mit dircache in python auch erreichen.
weiss jemand wie?

danke im vorraus!
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

AFAIR liefer dircache eine Liste zurück =>

Code: Alles auswählen

sorted(my_list)
the more they change the more they stay the same
thomas15
User
Beiträge: 98
Registriert: Montag 7. April 2008, 19:07

bitte ein bissl mehr info:

Code: Alles auswählen

sorted(dircache.listdir('.'))
oder wie?
BlackJack

@Dav1d: Und `listdir()` sortiert die Liste vorher auch, das ist also keine Lösung weil hier keine alphabetische Sortierung erwünscht ist, sondern eine nach den Zahlen in den Namen.

@thomas15: Du wirst Dir überlegen müssen wie man die Zahl aus dem Namen extrahiert und der `sort()`-Methode eine entsprechende `key`-Funktion mitgeben müssen. `sorted()` würde ich nicht nehmen denn Du hast ja schon eine Liste, die muss nicht noch einmal kopiert werden.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

sorted, war nur als Hinweis gedacht, zum Nachschlagen http://wiki.python.org/moin/HowTo/Sorting
the more they change the more they stay the same
thomas15
User
Beiträge: 98
Registriert: Montag 7. April 2008, 19:07

danke euch beiden, ich wollte mich um das string parsen druecken.

meine benutzer speichern nach beliebigen mustern:

einmal
particle_1.em particle_10.em ...

andermal

particle1.em particle10.em ...

und nochmal

p1_1.em p1_10.em p2_1.em p2_10.em

dachte wenn es schon in ls eingebaut ist, warum sollte es nicht auch in python gehen.
wenn jemand eine bessere idee hat wie man die ls -v funtionalitaet integrieren koennte dann bitte melden! (letztes beispiel kann nicht mal ls 100% handeln)

danke!
BlackJack

@thomas15: So schwer ist das doch nicht. Du musst halt nur die einzelnen Komponenten trennen, also Zahlen von Nicht-Zahlen und die Zahlen auch in solche umwandeln.

Code: Alles auswählen

def key_func(string):
    result = list()
    for match in re.finditer(r'([\d]+)|([^\d]+)', string):
        number, no_number = match.groups()
        result.append(int(number) if number else no_number)
    return result
Und angewendet:

Code: Alles auswählen

In [39]: xs
Out[39]: ['p1_10.em', 'p2_10.em', 'p2_1.em', 'p1_1.em']

In [40]: sorted(xs, key=key_func)
Out[40]: ['p1_1.em', 'p1_10.em', 'p2_1.em', 'p2_10.em']
thomas15
User
Beiträge: 98
Registriert: Montag 7. April 2008, 19:07

@BlackJack
probiers mal aus. aber ich kann nicht alle kombinationen von dateinamen parsen.
Danke!!!!
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

BlackJack: Warum verwendest du nicht \D?
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

OK, "hätt ja könne sin" wie der Hesse sagt :lol:
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

Code: Alles auswählen

>>> files = ['p1_10.em', 'p2_10.em', 'p2_1.em', 'p1_1.em']
>>> def extract_num(text):
	return int(''.join(char for char in text if char.isdigit()))

>>> files.sort(key=extract_num)
>>> files
['p1_1.em', 'p2_1.em', 'p1_10.em', 'p2_10.em']
MFG
HerrHagen
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Da mag wohl jemand die filter-Funktion nicht.
Das Leben ist wie ein Tennisball.
BlackJack

@HerrHagen: Ich würde mal sagen das war nix. Sieht für mich falsch sortiert aus. Ersetz das 'p' mal durch 'versuch' wenn's Messdatensätze sind oder 'szene' wenn es Videoframes sind. Dann wird's vielleicht deutlicher.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mein Ansatz:

Code: Alles auswählen

import re

def int_or_bust(value):
     try:
         return int(value)
     except ValueError:
         return value

def key_func(entry):
    return [int_or_bust(e) for e in re.findall(r'\d+|\D+', entry)]

xs = ['p1_10.em', 'p2_10.em', 'p2_1.em', 'p1_1.em']

print sorted(xs, key=key_func)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Code: Alles auswählen

xs = ['p1_10.em', 'p2_10.em', 'p2_1.em', 'p1_1.em', 'p1_32.em']
def get_numbers(string):
    return [int(c) for c in string if c.isdigit()]
    
print sorted(xs, key=get_numbers)
Das hier wäre doch irgendwie schöner...
BlackJack

@ahojnnes: Wieso ist falsch schöner? Alle "Nichtziffern" werden nicht berücksichtigt und 'p11_0.em' hat den gleichen Schlüssel wie 'p1_10.em' wo letzteres einen kleineren haben sollte.
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

hehe, sehe es gerade ja...;-) war wohl etwas unausgeschlafen heute früh - nehme alles zurück und behaupte das Gegenteil.
Antworten