Einlesen von Daten

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
Lienz20013
User
Beiträge: 88
Registriert: Freitag 26. September 2014, 14:42

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.
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.
Lienz20013
User
Beiträge: 88
Registriert: Freitag 26. September 2014, 14:42

Ja ich hatte mir sowas gedacht aber das läuft nicht

Code: Alles auswählen

sorted_files = sorted(files.items(), key=operator.itemgetter(6))
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

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
In specifications, Murphy's Law supersedes Ohm's.
Sirius3
User
Beiträge: 17748
Registriert: Sonntag 21. Oktober 2012, 17:20

@Lienz20013: was macht `operator.itemgetter(6)`? Jedenfalls nicht, die Zahl aus Deinen Namen extrahieren.
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.
Sirius3
User
Beiträge: 17748
Registriert: Sonntag 21. Oktober 2012, 17:20

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)
Antworten