Python programozás - Szoftverfejlesztés fórum

üzenetek

hozzászólások


Hege1234
(addikt)

esetleg fontold meg a "credits" kiszedését is
akkor úgy kb. 40 MB lesz összesen

not_needed = ["url", "previously-shown", "rating", "credits"]


Atomantiii
(őstag)

Igen most nézem, elvileg az sem kell meg még hozzáadtam párat, így már 40 MB alatt van.


Atomantiii
(őstag)

Abban tudnál még segíteni, hogy ezt hogy tudom átírni, hogy ne a tárhelyről, hanem a saját gépemről töltse be a forrás xml-t és oda is mentse le?

Próbáltam, de nem igazán akar összejönni, mindig hibát ír erre a sorra:
edited_tv_programs = ET.tostring(root, encoding='unicode')

Traceback (most recent call last):
File "d:\EPG\xmlremove.py", line 24, in <module>
edited_tv_programs = ET.tostring(root, encoding='unicode')
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Python312\Lib\xml\etree\ElementTree.py", line 1083, in tostring
ElementTree(element).write(stream, encoding,
File "C:\Python312\Lib\xml\etree\ElementTree.py", line 728, in write
serialize(write, self._root, qnames, namespaces,
File "C:\Python312\Lib\xml\etree\ElementTree.py", line 851, in _serialize_xml
tag = elem.tag
^^^^^^^^
AttributeError: 'ElementTree' object has no attribute 'tag'

[ Szerkesztve ]


Atomantiii
(őstag)

Közben rájöttem, most már jó.

[ Szerkesztve ]


Atomantiii
(őstag)

Ez így nagyon szuper, de esetleg lehetne neki mondani valahogy egy olyat, hogy törölje még ezt ki az xml-ből? " clumpidx="0/1" és helyette csak egy ilyet rakjon be: "

Notepad++-ban egy sima keresés és cserével megoldható, de jó lett volna valahogy automatizálni.


Hege1234
(addikt)

az elejére akkor ezt add még hozzá:
import re

edited_tv_programs = ... alatt pedig ez legyen:
edited_tv_programs = re.sub(r'( clumpidx=.*\")', r'', edited_tv_programs)

[ Szerkesztve ]


Atomantiii
(őstag)

Köszi, holnap kipróbálom.


Atomantiii
(őstag)

Közben találtam még egy olyat, hogy egyes sorokban van feleslegben egy ilyen a <desc lang="hu"> után, hogy zárójel nulla pont zárójel szóköz, ami felesleges. Ezt próbáltam kitörölni, de sehogy sem sikerül.

<desc lang="hu">(0.) Get ready as we bring you all of the greatest hits from singing sensation Ariana Grande!</desc>

edited_tv_programs = re.sub(r'<desc lang="hu">(0.) ', r'<desc lang="hu">', edited_tv_programs)

Akárhogy csináltam mindig csak a kezdő zárójel tűnt el de a 0 és a többi maradt.

[ Szerkesztve ]


Hege1234
(addikt)

sztem az valahogy így nézne ki:

edited_tv_programs = re.sub(r'<desc.*hu.*(\(.*\.\) )', r'<desc lang="hu">', edited_tv_programs)

ha csak tényleg a (0.) ami nem kell akkor így

edited_tv_programs = re.sub(r'<desc.*hu.*(\(0.\) )', r'<desc lang="hu">', edited_tv_programs)

[ Szerkesztve ]


Atomantiii
(őstag)

Köszi, jó lett.

edited_tv_programs = re.sub(r'<desc lang="hu">(\(.*\.\) )', r'<desc lang="hu">', edited_tv_programs)

Elvileg elég lenne a desc lang hu-s rész nélkül is, de így is jó. Már itt kínlódtam vele egy jó ideje, sehol sem találtam meg, hogy hivatkozzak a zárójelre, a 0-ra és a .-ra egyszerre.

Így az eredeti 85 MB-os fájlból lett 33 MB.

[ Szerkesztve ]


sztanozs
(veterán)
Blog

Szerintem mashogyan kellene megkozeliteni... vsz csak azt kellene kivalogatni, ami neked kell.
Fel tudod rakni valahova mashova a fajlt? Melohelyrol nem erem el...

[ Szerkesztve ]


Atomantiii
(őstag)

Működik Hege javaslata is, persze biztos meg lehet csinálni máshogy is. Itt a forrás fájl.

import xml.etree.ElementTree as ET
import re

xml_content = ET.parse('forras.xml')
root = xml_content.getroot()

not_needed = ["credits", "category", "country", "date", "episode-num", "icon", "length", "previously-shown", "rating", "star-rating", "url"]

for programme in root.findall(".//programme"):
for element_name in not_needed:
elements = programme.findall(f".//{element_name}")
for element in elements:
if element in programme:
programme.remove(element)

edited_tv_programs = ET.tostring(root, encoding='unicode')

# kiszedi a clumpidx="0/1"-et
edited_tv_programs = re.sub(r' clumpidx=.*\"', r'', edited_tv_programs)

# kiszedi a (0.)-át
edited_tv_programs = re.sub(r'<desc lang="hu">(\(.*\.\) )', r'<desc lang="hu">', edited_tv_programs)

# kiszedi a ...-ot
edited_tv_programs = re.sub(r'<desc lang="hu">(\.\.\. )', r'<desc lang="hu">', edited_tv_programs)

with open('edited.xml', 'w', encoding='utf-8') as file:
file.write(edited_tv_programs)


sztanozs
(veterán)
Blog

:( sajna google drive (se onedrive, se pastebin) sem jatszik...


Atomantiii
(őstag)

Mega.nz esetleg?


sztanozs
(veterán)
Blog

nope :DDD de ranezek majd este otthonrol, ha el nem felejtem...

[ Szerkesztve ]


Atomantiii
(őstag)

Oké, a fájl eleje meg legvége egy kicsit más szerkezetű, mert máshonnan vannak leszedve az adatok és úgy van összefűzve a 2 xml fájl.


cigam
(félisten)
Blog

Adott egy Python program. Raspberry-n fut, és az IO lábakon keresztül vezérel 2 relésort (4db "zöld", és 4db "piros"). A parancsokat egy másik program adja neki hálózaton. Szépen rendben teszi is a dolgát, és kapcsolgatja a reléket. A relék kimenete egy "utasító"ra van kötve, amin keresztül kommunikálni lehet az operatőrökkel. Ez az eszköz képes a kamerákhoz tartozó piros/zöld lámpák vezérlésére.
Sajnos a gyárban valamit nagyon elkeféltek, mert ha azt a parancsot kapja, hogy a kamerán egyszerre világítson a zöld és a piros lámpa, akkor az zöld marad, holott a pirosnak kellene prioritást kapni, hiszen azzal jelzik neki, hogy ne igazgassa ide oda kamerát, mert "adásban van". Remélem érthető bevezője volt ennek a kódnak.
Arra tippelek, hogy a 156. sornál kezdődő résznél lehet a megoldás kulcsa.

def setStates():
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
for gpo_group in config_object["gpo_groups"]:
for gpo in gpo_group["gpos"]:
GPIO.setup(gpo["pinNumber"], GPIO.OUT)
GPIO.output(gpo["pinNumber"], getOutputValue(False))
gpo["lastState"] = False

Szerintem ide kellene egy ellenörzést beiktatni, hogy abban az esetben ha "gpo_groups"-on belül mindekkető be van kapcsolva (a zöld "preview", és piros "program" is), akkor a zöldet kapcsolja ki, és csak a piros legyen bekapcsolva. Jó irányba kapisgálok?

[ Szerkesztve ]


kovisoft
(őstag)

Szerintem nem a setStates függvény az, amit keresel. Ha megnézed, a setStates és a GPO_off gyakorlatilag pont ugyanazt csinálja: kikapcsolja az összes bekonfigurált pint. És a setStates csak induláskor van egyszer meghívva, miután a konfig be lett olvasva.

Nem értem, hogy pontosan hogyan működik maga a program, hogyan lehet neki utasításokat adni, de szerintem a GPIO.output hívásokat kellene végignézned, hogy melyik lehet az, amelyik neked a lámpákat vezérli, és oda lehetne betenni egy olyan feltételt, hogy a zöldet ne kapcsolja, ha egyúttal a pirosat is kellene kapcsolnia. Ez valószínűleg a processTallyData lehet, mert az on_flash ránézésre egyetlen pint villogtat.


cigam
(félisten)
Blog

Aha... Köszi!
A projekt "fő" programja, a tallyarbiter. Ez kommunikál a képkeverővel, figyeli a megadott csatornák állapotát. Egy csatonának 2 "állapotjelzője" van:
-preview csatonára kapcsolva
-program csatornára kapcsolva
A képkeverő csatornáinak az állapotát küldi el a "kliens" programkonak. Ez lehet egy mikrovezérlő(vel egybeépített színes LED), vagy egy relé modul,...
Esetemben a Pi-re kötött relé modul pedig a kapott adatoknak megfelelően kapcsolgatja ki/be a zöld/piros lámpákat attól függően, hogy a képkeverőn hogyan kapcsolták preview vagy program csatornára a kamerákat.

A valóságban egyszerübb mint itt elmesélni, leírni a működését :)

Nézegetem ezt a processTallyData() fügvényt, de mint az a bizonyos borjú az új kapura ... Valahogy nem megy a kód értelmezése (a Python (szemantika) ismeretének hiánya is nehezíti, hogy most éppen mire gondolt a költő: powered_pins.append(gpo["pinNumber"])
Miért van eltárolva a "bekcsolt" lábak listája?
Miért van két külön ciklus a be ill. a kikapcsolásra?
Hová kéne berakni a plussz ellenörzést, és hogyan? Hiszen a ciklus végimegyaz összes előre definiált IO porton. Hogyan ellenörzöm, hogy az adott pi "program"kimenetnek van kapcsolva, vagyis a hozzá tartozó "preview" kimenetet ki kell kapcsolni?

Erre még aludni kell párat ...

[ Szerkesztve ]


kovisoft
(őstag)

Én sem vágom, hogy itt ki kinek mikor mit küld, mit hív, stb. De szerintem az első cikus végzi a device_state-ben megkapott device-ok megadott pin-jeinek a bekapcsolását. És a powered_pins-ben összegyűjti azokat a pin-eket, amiket bekapcsolt. Utána a második ciklus pedig azt csinálhatja, hogy végigmegy az összes device összes pin-jén, és azokat kikapcsolja, amiket az első ciklus nem kapcsolt be. Azaz a végére pontosan azok lesznek bekapcsolva, amiknek bekapcsolva kell lenniük, az összes többi pedig ki lesz kapcsolva.

Tehát ha jól gondolom, akkor az első ciklusba tudnál betenni valami feltételvizsgálatot, hogy ha be tudod azonosítani azt az eszközt és a pin-eket, amik a zöld és piros lámpákat jelentik, akkor a zöldet ne kapcsolja be, ha a pirosat be kellene kapcsolni.

Nem tudom, meg lehet-e oldani mondjuk, hogy a konfigban hamarabb szerepeljen a piros lámpa pin-je, mert akkor mire a zöldre kerül a ciklus, addigra már lehetne látni, hogy a pirost be kell-e kapcsolni.

Ha ez nem járható út, akkor esetleg csinálhatsz az egész elé egy harmadik ciklust, ami kb. ugyanazt csinálja, mint a mostani első ciklus, de ténylegesen nem kapcsol pin-t, csak megjegyzi egy változóban, hogy a pirosat be kellene-e kapcsolni. És ha ez a változó be van állítva, akkor a bekapcsoló ciklusban kihagyja a zöldet.

Persze ehhez tudni kellene, hogy tényleg a processTallyData az a függvény, ami a kapcsolgatást végzi. Ezt mondjuk ki tudod próbálni, ha kikommentezed benne a bekapcsolást, és attól elmúlik a lámpák bekapcsolása.

üzenetek