Seite 1 von 1

Einlesen von Daten

Verfasst: Mittwoch 29. Oktober 2014, 12:44
von Lienz20013
Ich habe 8 txt-files die ich einlesen möchte (Probe_3.txt, Probe_4.txt, ... , Probe_10.txt). Das mach ich mit:

Code: Alles auswählen

files = glob.glob("*.txt")
Aber nun wird Probe_10.txt als erstes eingelesen und dann Probe_3.txt u.s.w. Bestimmt wegen der eins. Das will ich nicht, ich will das mit Probe drei angefangen wird. Also die Zahl nach Probe_ soll ausschlagebend dafür sein an welcher stelle das txt-file eingelesen wird.

Re: Einlesen von Daten

Verfasst: Mittwoch 29. Oktober 2014, 12:49
von BlackJack
@Lienz20013: Es wird mehr oder weniger zufällig mit der 10 angefangen: Dateinamen werden in der Reihenfolge geliefert in der sie der Dateisystemtreiber liefert! Und da gibt es keinerlei Garantien. Die können alphabetisch sortiert sein, oder nach Alter der Datei, oder auch nach einem ganz anderen, zufällig wirkendem Kriterium (Hashwert des Names, Position in einer Baum-Struktur), oder auch abhängig von der Mondphase.

Wenn Du also eine bestimmte Reihenfolge haben möchtest, musst Du die Namen sortieren. Wenn das nach der Zahl sein soll, statt alphabetisch, musst Du eine `key`-Funktion schreiben die aus einem Namen diese Zahl extrahiert und zurück gibt und die dann als `key`-Argument beim sortieren übergeben.

Re: Einlesen von Daten

Verfasst: Mittwoch 29. Oktober 2014, 14:10
von Lienz20013
Ja ich hatte mir sowas gedacht aber das läuft nicht

Code: Alles auswählen

sorted_files = sorted(files.items(), key=operator.itemgetter(6))

Re: Einlesen von Daten

Verfasst: Mittwoch 29. Oktober 2014, 14:22
von pillmuncher
Das wundert mich nicht. Schau mal:

Code: Alles auswählen

>>> from operator import itemgetter
>>> names = 'hallo-11', 'hallo-2', 'hallo-1'
>>> sorted(names, key=itemgetter(6))
['hallo-11', 'hallo-1', 'hallo-2']
>>> for name in names:
...     print(itemgetter(6)(name))
...
1
2
1

Re: Einlesen von Daten

Verfasst: Mittwoch 29. Oktober 2014, 14:23
von Sirius3
@Lienz20013: was macht `operator.itemgetter(6)`? Jedenfalls nicht, die Zahl aus Deinen Namen extrahieren.

Re: Einlesen von Daten

Verfasst: Mittwoch 29. Oktober 2014, 14:37
von BlackJack
@Lienz20013: Naja das sortiert jetzt nach dem 7. Zeichen/Byte im Dateinamen. Falls dort die erste Ziffer steht, dann wird ausschliesslich nach der ersten Ziffer sortiert, was irgendwie nicht hilft. Du musst die gesamte Zahl aus dem Dateinamen extrahieren. Eventuell könnte man auch einen allgemeineren Ansatz wählen und die Namen in Zeichenkettenteile und Zahlen aufteilen und danach sortieren. Das wird oft auch als „natural order” bezeichnet.

Re: Einlesen von Daten

Verfasst: Mittwoch 29. Oktober 2014, 16:23
von Sirius3
Hier mal eine Lösung per regulärer Ersetzung:

Code: Alles auswählen

import re
import functools

normalize_numbers = functools.partial(re.sub, '\d+', lambda n: '{0:0>20}'.format(n.group(0)))
print sorted(['test_10_10','test_3_13', 'test_3_7'], key=normalize_numbers)