Seite 1 von 2

Re: String trennen

Verfasst: Donnerstag 9. Februar 2017, 19:30
von Sirius3
@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.

Re: String trennen

Verfasst: Freitag 10. Februar 2017, 20:24
von Kreser06
@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

Re: String trennen

Verfasst: Freitag 10. Februar 2017, 21:13
von Sirius3
@Kreser06: es geht nicht darum, was der Generator macht, sondern wie Du ihn benutzt/aufrufst.

Re: String trennen

Verfasst: Freitag 10. Februar 2017, 21:52
von Kreser06
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

Re: String trennen

Verfasst: Freitag 10. Februar 2017, 22:37
von BlackJack
@Kreser06: Das sieht nicht wirklich sinnvoll aus‽

Re: String trennen

Verfasst: Freitag 10. Februar 2017, 23:00
von Kreser06
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)
        

Re: String trennen

Verfasst: Freitag 10. Februar 2017, 23:24
von 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.

Re: String trennen

Verfasst: Samstag 11. Februar 2017, 15:29
von Kreser06
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.

Re: String trennen

Verfasst: Samstag 11. Februar 2017, 16:36
von snafu
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.