Metadaten aus Dateinamen extrahieren

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
Kurt.Wallander
User
Beiträge: 28
Registriert: Donnerstag 24. September 2015, 22:46

Hallo,

bevor ich wieder die Nacht zum Tage mache oder wahlweise meinen Kopf durch die Wand hämmere, hier eine Frage, die wahrscheinlich nicht so schwer zu beantworten ist:

Ich versuche aus den Dateinamen in einem Verzeichnis (ausschließlich MP3-Dateien) Metadaten zu extrahieren, um diese anschließend in die ID3-Tags zu schreiben. Für die BASH habe da schon gewisse Erfahrungen gemacht, aber da später noch ein Datenbankabfrage dazu kommt, beschäftige ich mich jetzt dann doch mal mit Python, weil die Kommunikation mit MySQL in der BASH einfach keinen Spaß macht. Hier das Skript (bzw. ein Teil daraus), das mir Kopfzerbrechen bereitet:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf8 -*-

# Module laden

from glob import glob

# Metadaten aus Dateinamen extrahieren

for pfad in glob('/var/www/Aufnahmen/aufnahme_fertig_*.mp3'):
   datei = pfad.lstrip('/var/www/Aufnahmen/aufnahme_fertig_')
   split = datei.index('_')
   alias = datei[0:split]
   jahr = datei[split+1:split+5]
   monat = datei[split+6:split+8]
   tag = datei[split+9:split+11]
   stunde = datei[split+12:split+14]
   minute = datei[split+15:split+17]
   print pfad
   print datei
   print alias
   print jahr
   print monat
   print tag
   print stunde
   print minute
   print "Index: "
   print split
   print ""
Und das ist die Ausgabe:

Code: Alles auswählen

# ./rb-add-record.py
/var/www/Aufnahmen/aufnahme_fertig_einslive_2015-09-25_20-05.mp3
slive_2015-09-25_20-05.mp3
slive
2015
09
25
20
05
Index: 
5

/var/www/Aufnahmen/aufnahme_fertig_kiraka_2015-09-26_14-05.mp3
kiraka_2015-09-26_14-05.mp3
kiraka
2015
09
26
14
05
Index: 
6
Ich denke, der Fehler liegt in folgender Zeile des Skripts:
split = datei.index('_')

Was mich nur wundert, ist, dass die Ausgabe aller Metadaten so weit zu funktionieren scheint, nur der alias funzt nicht. Ich komme gerade einfach nicht drauf. Ich denke, mit Reg Expressions wäre das Ganze sicher eleganter hinzubekommen, aber ich muss gestehen, dass ich mit denen auf Kriegsfuß stehe.

Könnte jemand einem blutigen Python-Anfänger unter die Arme greifen? Danke!
Kurt
BlackJack

@Kurt.Wallander: Der Fehler liegt in Zeile 11, die könnte man kürzer schreiben, denn das hat den gleichen Effekt wie ``pfad.lstrip('/A_aefghimnrtuvw')``. Du solltest also vielleicht mal nachlesen was diese Methode tatsächlich tut. ;-)

Und hier würde ich entweder mehr mit `split()` bzw. `rsplit()` arbeiten oder tatsächlich das `re`-Modul verwenden.
Kurt.Wallander
User
Beiträge: 28
Registriert: Donnerstag 24. September 2015, 22:46

Danke dir für den Schubser ;-) Dann schaue ich mir das heute Abend nochmal an und lese mich nochmal ein. Wahrscheinlich war ich in der Tat wieder zu schnell mit dem Lesen oder habe es einfach noch nicht kapiert :-)
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Statt die Datumsteile einzeln zu speichern, bietet sich ein datetime-Objekt an:

Code: Alles auswählen

datei = os.path.basename(pfad)
_, _, alias, date = datei.split('_', 3)
date = datetime.datetime.strptime(date, '%Y-%m-%d_%H-%M.mp3')
Kurt.Wallander
User
Beiträge: 28
Registriert: Donnerstag 24. September 2015, 22:46

Ihr Lieben,

dank eurer Unterstützung habe ich alles so hingekriegt, wie ich mir das vorgestellt hatte:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf8 -*-

# Module laden

import MySQLdb
from glob import glob
import os

# Verbindung zur Datenbank aufbauen

connection = MySQLdb.connect("localhost", "root", "passwortblablabla", "radiobeere")

# Metadaten aus Dateinamen extrahieren

for pfad in glob('/var/www/Aufnahmen/aufnahme_fertig_*.mp3'):
   datei = os.path.basename(pfad)
   verz = os.path.dirname(pfad)
   teil = pfad.split('_')
   alias = teil[2]
   jahr = teil[3]
   monat = teil[4]
   tag = teil[5]
   stunde = teil[6]
   minute = teil[7]
   cursor = connection.cursor()
   cursor.execute("SELECT name FROM sender WHERE alias=%s",(alias))
   for row in cursor:
      sender = "%s" % row

# Datei taggen und umbenennen

   os.system('id3v2 -t'+'"'+sender+', '+tag+'.'+monat+'.'+jahr+', '+stunde+':'+minute+' Uhr'+'"'+' '+pfad)
   os.rename(pfad,verz+'/'+alias+'_'+jahr+'-'+monat+'-'+tag+'_'+stunde+'-'+minute+'.mp3')
Einen kleinen Schönheitsfehler gibt's noch: An den diversen Python-Modulen fürs ID3-Tagging bin ich gescheitert, also delegiere ich die Angelegenheit eine Stufe tiefer an mein geliebtes Tool id3v2. Aber damit kann ich leben.

Danke nochmals für eure Unterstützung!
Kurt
BlackJack

@Kurt.Wallander: Schönheitsfehler gibt's noch mehrere und `os.system()` würde ich als mehr als einen Schönheitsfehler beschreiben. :-P

Per Konvention wird mit vier Leerzeichen pro Ebene eingerückt und Leerzeichen um binäre Operatoren gesetzt. Siehe Style Guide for Python Code.

Auf Modulebene gehört normalerweise nur Code der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.

Die Kommentare im Programm sind alle überflüssig weil sie nur das beschreiben was man im nachfolgenden Code trivialerweise nochmal sehen kann. Das ist kein Mehrwert für den Leser. Faustregel: Nicht beschreiben *was* der Code macht, sondern *warum*, sofern das nicht offensichtlich ist.

Sowohl die Datenbankverbindung als auch einzelne Cursor-Objekte sollte man explizit schliessen wenn man sie nicht mehr benötigt.

`datei` wird definiert aber dann nirgends verwendet.

Namen sollten nicht ohne Not verkürzt werden. Statt `verz` kann man auch `verzeichnis` schreiben, dann braucht der Leser sich nicht raten was das wohl heissen mag. `teil` ist unpassend weil an den Namen nicht *ein* Teil gebunden wird, sondern eine Liste mit vielen Teilen.

Das mit dem `split()` ist so nicht wirklich robust weil *jetzt* in dem Präfix zwar keine weiteren '_' vorkommen, aber wenn man das mal ändert, dann muss man darauf achten auch die ”magischen” Indices für die Einzelteile anzupassen. Ausserdem passt das jetzt nicht mehr mit den gezeigten Beispielen überein weil dort die Bestandteile von Datum und Zeit nicht mit '_' sondern mit '-' getrennt waren und die Dateinamensendung durch einen Punkt von der Zeitangabe‽

Die Datenbankanfrage wird so nicht funktionieren, ausser alle Deine `alias`-Werte haben nur ein Zeichen. Was nach den Beispieldaten aber nicht so aussieht. Die Schleife über den Cursor wo man doch maximal *ein* Ergebnis erwartet macht keinen Sinn. Ausserdem kann es hier passieren das entweder ein `NameError` auftritt wenn bei der ersten Datei kein passender Wert in der Datenbank vorliegt oder aber das beim gleichen Fall bei weiteren Dateien der `alias` von der vorhergehenden Datei verwendet wird ohne das man darüber informiert wird.

Das Umwandeln der Datenbankabfrage in eine Zeichenkettendarstellung ist sicher nicht das Ergebnis das Du haben möchtest. Ich habe an der Stelle erhebliche Zweifel ob Du das überhaupt mal so ausprobiert hast.

Statt `os.system()` sollte man das `subprocess`-Modul verwenden. Damit kann man das Programm direkt ausführen, ohne eine unbekannte Shell als Vermittler. Das ist robuster weil man sich keine Gedanken machen muss was man für die Shell speziell escapen muss und wie.

Dieses zusammenstückeln von Werten und Zeichenketten mittels ``+`` ist total unübersichtlich. Bei den kurzen Teilstücken die nur Interpunktion und Leerzeichen enthalten ist das sogar mit Syntaxhervorhebung schlecht auseinanderzuhalten. Für so etwas wurde Zeichenkettenformatierung erfunden.

Pfadteile setzt man mit `os.path.join()` zusammen und nicht mit ``+`` und '/'.

Dann noch ein paar Funktionen aus dem Hauptprogramm herausziehen weil das doch schon ganz schön lang und tief verschachtelt ist und weil passend gewählte Funktionsnamen ja auch eine Art Dokumentation sind. Dann komme ich ungefähr auf das hier (ungetestet):

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf8 -*-
from __future__ import absolute_import, division, print_function 
import os
from contextlib import closing
from datetime import datetime as DateTime
from glob import glob
from subprocess import call

import MySQLdb

RECORDINGS_FILENAME_PATTERN = '/var/www/Aufnahmen/aufnahme_fertig_*.mp3'
DB_HOST = 'localhost'
DB_USER = 'root'
DB_PASSWORD = 'passwortblablabla'
DB_DATABASE = 'radiobeere'
TIMESTAMP_FORMAT = '%Y-%m-%d_%H-%M'


def extract_metadata(filename):
    filename, extension = os.path.splitext(filename)
    _, station_alias, date, time = filename.rsplit('_', 3)
    timestamp = DateTime.strptime(
        '{0}_{1}'.format(date, time), TIMESTAMP_FORMAT
    )
    return station_alias, timestamp, extension


def get_station_name(connection, alias):
    with closing(connection.cursor()) as cursor:
        cursor.execute(
            'SELECT name FROM sender WHERE alias=%s', (alias,)
        )
        row = cursor.fetchone()
        if not row:
            raise KeyError('no name for alias {0!r}'.format(alias))
        return row[0]


def tag_mp3(path, station_name, timestamp):
    call(
        [
            'id3v2',
            '-t',
            '{0}, {1:%d.%m.%Y, %H:%M} Uhr'.format(station_name, timestamp),
            path
        ]
    )


def main():
    with closing(
        MySQLdb.connect(DB_HOST, DB_USER, DB_PASSWORD, DB_DATABASE)
    ) as connection:
        for pfad in glob(RECORDINGS_FILENAME_PATTERN):
            verzeichnis, dateiname = os.path.split(pfad)
            sender_alias, zeitstempel, extension = extract_metadata(dateiname)
            sendername = get_station_name(connection, sender_alias)
            tag_mp3(pfad, sendername, zeitstempel)
            os.rename(
                pfad,
                os.path.join(
                    verzeichnis,
                    '{0}_{1:{2}}{3}'.format(
                        sender_alias, zeitstempel, TIMESTAMP_FORMAT, extension
                    )
                )
            )


if __name__ == '__main__':
    main()
Kurt.Wallander
User
Beiträge: 28
Registriert: Donnerstag 24. September 2015, 22:46

Danke dir für die umfassende Analyse und die hilfreichen Tipps. Ich habe mich nicht der Illusion hingegeben, dass mein erstes Python-Skript perfekt ist. Ich sehe: Ich kann noch viel lernen. Ich sage es mal so: Der Lauf-Anfänger ist erstmal froh, wenn er nicht sofort auf die Nase fällt. Der gute Stil kommt dann mit der Übung und dadurch, dass erfahrenere Fußgänger gelegentlich intervenieren und die schlimmsten Stürze vermeiden helfen. Deshalb nochmals: Danke!
BlackJack

Ich verwende für Datenbankzugriffe ja ganz gerne SQLAlchemy als Abstraktionsschicht weil man dann Datenbanken(systeme) leichter austauschen kann:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf8 -*-
from __future__ import absolute_import, division, print_function
import os
import sys
from datetime import datetime as DateTime
from glob import glob
from subprocess import call, check_output

from sqlalchemy import create_engine, MetaData, select

RECORDINGS_FILENAME_PATTERN = '/var/www/Aufnahmen/aufnahme_fertig_*.mp3'
DB_URL = 'mysql+mysqldb://root:passwortblablabla@localhost/radiobeere'
TIMESTAMP_FORMAT = '%Y-%m-%d_%H-%M'
ID3V2 = 'id3v2'


def extract_metadata(filename):
    filename, extension = os.path.splitext(filename)
    _, station_alias, date, time = filename.rsplit('_', 3)
    timestamp = DateTime.strptime(
        '{0}_{1}'.format(date, time), TIMESTAMP_FORMAT
    )
    return station_alias, timestamp, extension
 
 
def get_station_name(station_table, alias):
    result = (
        select([station_table.c.name], station_table.c.alias == alias)
            .execute()
            .scalar()
    )
    if result is None:
        raise KeyError('no name for alias {0!r}'.format(alias))
    return result
 
 
def tag_mp3(path, station_name, timestamp):
    call(
        [
            ID3V2,
            '-t',
            '{0}, {1:%d.%m.%Y, %H:%M} Uhr'.format(station_name, timestamp),
            path
        ]
    )
 
 
def main():
    print('Checking for {0}...'.format(ID3V2))
    try:
        id3v2_info = check_output([ID3V2, '--version']).splitlines()[0]
    except EnvironmentError as error:
        print('{0} not callable.\n{1}'.format(ID3V2, error))
        sys.exit(1)
    else:
        print(id3v2_info, 'found.')

    engine = create_engine(DB_URL)
    metadata = MetaData(engine)
    metadata.reflect(only=['sender'])
    sender_table = metadata['sender']

    for pfad in glob(RECORDINGS_FILENAME_PATTERN):
        verzeichnis, dateiname = os.path.split(pfad)
        sender_alias, zeitstempel, extension = extract_metadata(dateiname)
        sendername = get_station_name(sender_table, sender_alias)
        tag_mp3(pfad, sendername, zeitstempel)
        os.rename(
            pfad,
            os.path.join(
                verzeichnis,
                '{0}_{1:{2}}{3}'.format(
                    sender_alias, zeitstempel, TIMESTAMP_FORMAT, extension
                )
            )
        )
 
 
if __name__ == '__main__':
    main()
Kurt.Wallander
User
Beiträge: 28
Registriert: Donnerstag 24. September 2015, 22:46

Ich wärme diesen Thread nochmal auf. In der Zwischenzeit habe ich das ein oder andere Tutorial (quer)gelesen, habe mir ein E-Book über Python-Programmierung gekauft und (zum Teil) durchgearbeitet, habe viel herum probiert und bin oft auf die Nase gefallen, es gab aber auch Heureka-Momente. Vor allem aber bin ich immer wieder zu diesem Thread zurückgekehrt, weil ich am (eigenen) konkreten Beispiel am besten lerne. Dann bin ich das Skript nochmal neu angegangen und habe versucht, deine Hinweise, BlackJack, zu beherzigen. Allerdings habe ich nicht alle Vorschläge übernommen. Zum einen, weil ich nicht nur Copy&Paste machen, sondern zumindest halbwegs verstehen wollte, was ich da tue. Zum anderen, weil sich die Voraussetzungen ein wenig geändert haben.

So ist das Benennungsmuster bei den Ausgangsdateien tatsächlich ein anderes und ich brauche Datum und Zeit in verschiedenen Varianten. Die Trenner bei den Ausgangsdateien sind durchgängig Unterstriche, es gibt keine Bindestriche. Außerdem gibt es eine neue Variable timestamp, die ich für die Sortierung im Web-Frontend nutze, und es erfolgt jetzt nach erfolgreicher Bearbeitung der Ausgangsdatei ein Eintrag in eine Datenbank-Tabelle "aufnahmen", um vom Web-Frontend besser auf die Aufnahmen zurückgreifen zu können. Geknackt habe ich auch das Problem mit mutagen. Ich hatte für das ID3-Tagging ja nur auf id3v2 zurückgegriffen, weil ich bei der Verwendung von mutagen immer vor die Wand gelaufen war. Beim Versuch, ID3-Tags in eine Datei zu schreiben, die noch keine Tags hat, spuckt mutagen immer diesen ID3NoHeaderError aus. Alle Ansätze, das zu umgehen, die ich im Netz gefunden hatte, funktionierten bei mir nicht. Seit gestern weiß ich nun auch, warum: Ich hatte in meiner Entwicklungsumgebung (Raspbian auf einem RaspberryPi) eine veraltete Version von mutagen installiert, nämlich die aus den Paketquellen. Gestern habe ich die aktuelle (1.31) von der Entwickler-Homepage heruntergeladen und installiert und - Tadaaa! - läuft.

Zu erwähnen ist vielleicht noch, dass ich die Login-Daten für die Datenbank in eine eigene Python-Datei ausgelagert habe. Zum einen, weil ich auch von anderen Python-Skripten aus darauf zugreife und so nur EINE Datei ändern muss, wenn sich mal die Login-Daten ändern. Zum anderen, weil ich mit Git arbeite und so beim Pushen die Gefahr nicht so groß ist, versehentlich das richtige Passwort zu veröffentlichen ;-) .gitignore sei Dank.

Perfekt ist das sicher alles noch nicht, aber hoffentlich konnte ich wenigstens die gröbsten Schnitzer ausmerzen - und bekomme die neue Version nicht gleich wieder um die Ohren gehauen :-) Für Hinweise bin ich dankbar. Sowieso. Ich bin ja immer noch Anfänger und lernbegierig. Sei also bitte nicht allzu streng, BlackJack :-)

Ach so, eins noch: Für das Verkürzen von sehr langen Code-Zeilen habe ich auf Backslashes zurückgegriffen und nicht mit Einrückungen gearbeitet. Lag mir irgendwie eher. Hat das irgendwelche Nachteile?

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf8 -*-

import MySQLdb
import login
from contextlib import closing
from glob import glob
import os
import time
from mutagen.mp3 import MP3
from mutagen.id3 import ID3, TIT2, TPE1, TALB
import datetime


filename_pattern = '/var/www/Aufnahmen/aufnahme_fertig_*.mp3'


def audio_length(filename):

    length = str(datetime.timedelta(seconds = int((MP3(filename)).info.length)))

    return length


def extract_metadata(filename):

    _, _, station_alias, year, month, day, hour, minutes, _ = filename.split('_')
    timestamp = int(time.mktime((int(year), int(month), int(day), int(hour), int(minutes), 0, 0, 0, -1)))

    return station_alias, year, month, day, hour, minutes, timestamp


def get_station_name(connection, station_alias):

    with closing(connection.cursor()) as cursor:
        cursor.execute('SELECT name FROM sender WHERE alias=%s', (station_alias,))
        row = cursor.fetchone()

        if not row:
            raise KeyError('Sender nicht in der Datenbank vorhanden')

        return row[0]


def id3_tag(path, title, artist, album):

    audio = ID3()
    audio.save(path)
    audio = ID3(path)
    audio.add(TIT2(encoding=3, text = u"%s" % title))
    audio.add(TPE1(encoding=3, text = u"%s" % artist))
    audio.add(TALB(encoding=3, text = u"%s" % album))
    audio.save(v2_version=3)


def write_to_db(connection, date, time, station, new_filename, timestamp, length):

    with closing(connection.cursor()) as cursor:

        cursor.execute('INSERT INTO aufnahmen(datum, uhrzeit, sender, datei, zeitstempel, laenge) \
        VALUES (%s,%s,%s,%s,%s,%s)',(date, time, station, new_filename, timestamp, length,))
        connection.commit()


def main():

    with closing \
    (MySQLdb.connect(login.DB_HOST, login.DB_USER, login.DB_PASSWORD, login.DB_DATABASE)) \
    as connection:

        for path in glob(filename_pattern):

            directory = os.path.dirname(path)
            filename, extension = os.path.splitext(os.path.basename(path))

            length = audio_length(path)
            station_alias, year, month, day, hour, minutes, timestamp = extract_metadata(filename)
            station = get_station_name(connection, station_alias)

            date = '{0}-{1}-{2}'.format(year, month, day)
            time = '{0}:{1}'.format(hour, minutes)
            title = '{0}, {1}.{2}.{3}, {4} Uhr'.format(station, day, month, year, time)

            new_filename = '{0}_{1}-{2}-{3}_{4}-{5}{6}'.format \
            (station_alias, year, month, day, hour, minutes, extension)

            id3_tag(path, title, station, date)
            write_to_db(connection, date, time, station, new_filename, timestamp, length)
            os.rename(path, (os.path.join(directory, new_filename)))

if __name__ == '__main__':
    main()
Kurt.Wallander
User
Beiträge: 28
Registriert: Donnerstag 24. September 2015, 22:46

PS: Ich ziehe die Frage nach den Backslashes zurück. Hinsichtlich PEP8-Konformität muss ich eh nochmal nachbessern ...
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Kurt.Wallander: warum hast Du jetzt noch mehr Rückgabewerte, das ist doch viel zu unübersichtlich. BlackJack hat Dir doch schon gezeigt, wie Du mit einem Datetime-Objekt arbeiten kannst.

Was solle denn dieses u"%s" % title bewirken?
Kurt.Wallander
User
Beiträge: 28
Registriert: Donnerstag 24. September 2015, 22:46

Sirius3 hat geschrieben:@Kurt.Wallander: warum hast Du jetzt noch mehr Rückgabewerte, das ist doch viel zu unübersichtlich. BlackJack hat Dir doch schon gezeigt, wie Du mit einem Datetime-Objekt arbeiten kannst.
Ganz ehrlich: Weil ich es noch nicht so richtig verstanden habe, wie das mit diesem Datetime-Objekt funktioniert. Sagen wir: ... nicht verstanden hatte. Gerade habe ich mir BlackJacks Vorschlag noch mal angeschaut - ich glaube zum hundertsten Mal - und ich glaube, jetzt hat's Klick gemacht. Manchmal dauert es etwas länger bei mir, der ich ja noch nicht seit zehn Jahren mit Python umgehe :-) Ich gehe die Tage noch mal ran.
Sirius3 hat geschrieben:Was solle denn dieses u"%s" % title bewirken?
Ich muss - wenn ich das Mutagen-Tutorial richtig verstanden habe - den String explizit als UTF8 in die Datei schreiben. Ich habe mich an dieser Anleitung orientiert:
http://mutagen.readthedocs.org/en/latest/tutorial.html
Beispiel dort:

Code: Alles auswählen

audio.add(TIT2(encoding=3, text=u"An example"))
Nun kann ich ja nicht einfach die Variable in Quotes setzen, weil dann der Variablenname als Wert interpretiert wird. Deshalb diese Vorgehensweise mit der Formatsequenz %s. Funktionieren tut das so, aber wahrscheinlich ist auch das so falsch oder besser zu lösen ...
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Kurt.Wallander: title ist bei Dir ein Bytestring, weil er aus einem Dateinamen kommt. Dein jetziges Vorgehen ist es, das in einen Unicode-String umzuwandeln, wenn der titel nur ASCII enthält und sonst mit einer Exception auszusteigen. Das geht verständlicher mit "title.decode('ascii')" statt irgendwas in ein Unicodestring hineinzuformatieren.
Kurt.Wallander
User
Beiträge: 28
Registriert: Donnerstag 24. September 2015, 22:46

Ich sehe schon: Ich muss noch viel lernen :-)
Kurt.Wallander
User
Beiträge: 28
Registriert: Donnerstag 24. September 2015, 22:46

Okay, ich glaube, der Groschen ist gefallen. Da das Dateiformat, von dem ich ausgehe, eine anderes ist (s.o., also z.B. so: aufnahme_fertig_kiraka_2015_10_26_21_33_08.mp3), sieht meine Funktion extract_metadata nun wie folgt aus:

Code: Alles auswählen

def extract_metadata(filename):

    _, _, station_alias, date_time = filename.split('_',3)    
    date_time = datetime.datetime.strptime(date_time, date_time_format)

    return station_alias, date_time
Wobei date_time_format global wie folgt definiert wird:

Code: Alles auswählen

date_time_format = '%Y_%m_%d_%H_%M_%S'
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Kurt.Wallander: wobei date_time recoding_date und date_time_format DATE_TIME_FORMAT heißen sollte.
Kurt.Wallander
User
Beiträge: 28
Registriert: Donnerstag 24. September 2015, 22:46

Ersteres wegen der Eindeutigkeit bzw. Verwechslungsgefahr mit der datetime-Funktion, nehme ich an? Und die Schreibweise in Versalien? Ist das Kovention oder einfach nur besserer Stil?
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Kurt.Wallander: ersteres, weil date_time nur den Datentyp beschreibt, aber nicht den Inhalt der Variable. Zweiteres, weil Konstanten per Konvention groß geschrieben werden.
Kurt.Wallander
User
Beiträge: 28
Registriert: Donnerstag 24. September 2015, 22:46

Okay, danke!
Antworten