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.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@Kreser06: Du solltest dringend Deine Variablenschreibweise an die üblichen Konventionen anpassen; der Code ist deshalb nur schwer lesbar. Warum nichts ausgegeben wird? Du solltest nochmal nachlesen, wie ein Generator funktioniert.
Kreser06
User
Beiträge: 33
Registriert: Samstag 21. Januar 2017, 11:49

@Sirius3:
Hallo, die Variablenschreibweise werde ich natürlich anpassen, weil ich noch am testen bin ist es etwas lästig alles zu ändern, aber danke für den Tipp.
Und jetzt zu der yield-Anweisung. In meinem Fall werden ja alle Übereinstimmungen im Text gesucht und nacheinander ausgegeben.

Code: Alles auswählen

        for value in name.values():
            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)
Hier wird ja die Dictionary übergeben und mit for value in name.values(): der Wert ausgelesen z.B. 'Text 123 TEXTText1'. Danach im yield pattern.findall(value) werden die passenden RegEx Übereinstimmungen gesucht und alle an yield übergeben. Habe ich das richtig verstanden?

Und wenn ich vom Anfang an nicht die Dict., sondern Direkt den string value z.B. 'Text 123 TEXTText1' an yield weitergebe dann passiert nichts.

Kannst du/ihr mir bitte auf die Sprünge Helfen? Ich komme wirklich nicht weiter. Bin halt Anfänger. :K
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@Kreser06: es geht nicht darum, was der Generator macht, sondern wie Du ihn benutzt/aufrufst.
Kreser06
User
Beiträge: 33
Registriert: Samstag 21. Januar 2017, 11:49

ich hab's.

Code: Alles auswählen

    for value in playlist.m3u_name_dict.values():
        print (value)
        gen = anpassen.SPLIT(value)
        test = next(gen)
        print (test)
Danke das du es so spanned gemacht hast :D . Aber jetzt verstehe ich das auch. Danke
BlackJack

@Kreser06: Das sieht nicht wirklich sinnvoll aus‽
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: 6731
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