String trennen

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.
Kreser06
User
Beiträge: 33
Registriert: Samstag 21. Januar 2017, 11:49

ist ja auch noch nicht fertig. Es gibt bestimmt intelligentere Lösungen, aber für mich als Anfänger ist es OK. Der Code funktioniert soweit ganz gut, es tut was es soll. Unten der jetzige Stand. Kommt später noch mehr dazu.

main.py

Code: Alles auswählen

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from __future__ import print_function
import io
import time
import re

from playlist2userbouquet import PLAYLIST, ANPASSEN

playlist = PLAYLIST()
anpassen = ANPASSEN()
def DICTS_ERSTELLEN():
    filename_m3u = 'M3U.txt'
    playlist.NAME_DICT_LINK_DICT(filename_m3u)
def NAME_DICT_ANPASSEN():
    for key, value in playlist.m3u_name_dict.items():
        gen = anpassen.SPLIT(value)
        parts = next(gen)
        anpassen.GROSS_KLEIN_SCHREIBUNG(parts)
        playlist.m3u_name_dict[key] = anpassen.name_neu
def TEST():
    for keys, values in playlist.m3u_name_dict.items():
        print (
                str(keys) + ' - ' + 
                values + ' - ' + 
                playlist.m3u_link_dict[keys]
                )
def main():
    DICTS_ERSTELLEN()
    NAME_DICT_ANPASSEN()
    TEST()
if __name__ == '__main__':
    main()
playlist2userbouquet.py

Code: Alles auswählen

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from __future__ import print_function
import io
import time
import re

class PLAYLIST(object):
    def __init__(self):
        self.m3u_name_dict = dict()
        self.m3u_link_dict = dict()
        
    def NAME_DICT_LINK_DICT(self, filename_m3u):
        try:
            with io.open(filename_m3u, 'r', encoding='utf-8-sig') as m3u:
                i = 1
                for zeile in m3u:                    
                    if zeile.startswith('#EXTINF'):
                        if zeile[11] != '=' and not zeile.endswith('='):
                            name = zeile.strip().replace('#EXTINF:-1,','')
                            link = m3u.readline().rstrip()
                            self.m3u_name_dict[i] = name
                            self.m3u_link_dict[i] = link
                            i += 1
                            
        except FileNotFoundError:
            msg = 'Die Datei {!r} existiert nicht!'
            print(msg.format(filename_m3u))
        except IOError as error:
            print('Fehler beim Öffnen:', error)

class ANPASSEN():
    def __init__(self):
        self.PATTERNS = [
            r'\+\d',                            # +2, +7
            r'\d[+x]\d',                        # 1+1, 2x2
            r'(?<=\b)[A-ZА-Я]{1,2}\d{1,2}\b',   # A1, AB12
            r'\b[JT][ui][CJ][ei]',              # JuCe TV, TiJi
            r'[A-ZА-Я][a-zа-я]+\.?',            # Abzde, int.
            r'[A-Za-zА-Яа-я][A-ZА-Яa-zа-я]+\.?',# ABSDE, Int.
            r'(?<=\b)[A-ZА-Я]{1,2}(?=\b)',      # A, AB, ABC
            r'\d[A-ZА-Я]\b',                    # 1A
            r'\d\.?\d+',                        # 1234, 2.0, 3.123
            r'\d',
            ]
        self.SHORT_NAMES_TO_TITLE = {
            'geo', 'nat', 'дом', 'моя', 'кто', 'hit', 'box',
            'pro', 'doc', 'and', 'sci', 'fi', 'top', 'еда',
            'дон', 'мир', 'ля', 'на', 'раз', 'рен'
            }
        self.LONG_NAMES_TO_IGNORE = {
            'JuCe', 'TiJi', 'HITV', 'НСТВ', 'СССР', 'СТРК'
            }
    def SPLIT(self, value):
        playlist = PLAYLIST()
        patterns = self.PATTERNS
        if isinstance(patterns, dict):
            patterns = patterns.values()
        pattern = re.compile('|'.join(patterns))
        value = re.sub('[\[\(][^\(\)\[\]]*[\]\)]', '', value) # Klammer und deren Inhalt entfernen
        value = re.sub('(?<!(INT))(?<!(int))[_.-](?!\d)', ' ', value) # Unnötige Sonderzeichen entfernen
        value = value.strip()
        yield pattern.findall(value)
    def GROSS_KLEIN_SCHREIBUNG(self, parts):
        renamed_parts = []
        for part in parts:
            if len(part) <= 3:
                if part.lower() in self.SHORT_NAMES_TO_TITLE:
                    renamed_parts.append(part.title())
                else:
                    renamed_parts.append(part.upper())
            elif part in self.LONG_NAMES_TO_IGNORE:
                renamed_parts.append(part)
            else:
                renamed_parts.append(part.title())
        self.name_neu = ' '.join(part for part in renamed_parts)
        
BlackJack

@Kreser06: Das das noch nicht fertig ist macht keinen Unterschied das der Generator komplett sinnfrei ist. Der liefert genau ein Element. Dafür braucht man keinen Generator. Was hast Du Dir dabei gedacht?

Die Klassen `PLAYLIST` und `ANPASSEN` sind semantisch auch keine Klassen. Du machst da ganz komische und umständliche Sachen.


`playlist` und `anpassen` in der `main.py` sollten nicht auf Modulebene stehen. Was auch kein Problem wäre, denn die Klassen sollten gar nicht existieren.

Bevor Du mit ``class`` und ``yield`` arbeitest, verwende doch erst einmal ganz normale Funktionen richtig.

Und mach was gegen diese Namensschreibweise. *Jetzt*. Nicht irgendwann wenn das Programm fertig ist, und es dann doch nicht mehr geändert wird.
Kreser06
User
Beiträge: 33
Registriert: Samstag 21. Januar 2017, 11:49

Hallo BlackJack,
Danke erst mal für die Tipps. Das mit yield wurde mir hier vorgeschlagen, ich habe das einfach übernommen.

Und du hast recht, 'playlist' und 'anpassen' sind nicht da wo sie hingehören, ist mir auch bewusst und wird geändert.

Aber wie sieht es aus mit Klassen? Wie soll ich von der main.py auf die entsprechenden Funktionen in "playlist2userbouquet.py" zugreifen? Ich kenne das halt nur so, bin kein Profi auf dem Gebiet, wie du das sicherlich bemerkt hast. Habe vorher noch nichts mit Programmieren zu tun gehabt und will mir jetzt beibringen. Deswegen bin ich für jeden Tipp und Feedback dankbar.

Vielleicht kannst du mir mein Code überschreiben, damit ich ich auch die Unterschiede von meinem Code und von Einem Profi vergleichen kann. Dafür wäre ich dir sehr dankbar. Aber natürlich wenn du willst, ich will hier keinen zu Last fallen.
Das mit der Namensschreibweise habe ich auch nicht ganz kapiert. Paar Beispiele wären toll.
Nochmals Danke.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Das yield wurde in Zusammenhang mit einer Schleife vorgeschlagen. Dann ist es sinnvoll. Durch deine Modifikationen fällt auch der Sinn von yield weg. Bei einem einzigen Wert nimmt man normalerweise return.
Antworten