Új hozzászólás Aktív témák
-
Hege1234
addikt
válasz Hege1234 #3102 üzenetére
upsz elfelejtettem entert nyomni
amit bemásoltam python-ba ez a folytatása
a kodi-ban nincs pynput ezért azt bemásoltam mappástól úgy már felismerte
ugyan ezt próbáltam a requests-el is ez lehet nem volt jó ötlet..
addig minden jól működik amíg az url string helyett elérési utat adok megTraceback (most recent call last):
File "C:\Users\hadam\AppData\Local\Programs\Python\Python39\lib\site-packages\urllib3\connectionpool.py", line 597, in urlopen
httplib_response = self._make_request(conn, method, url,
File "C:\Users\hadam\AppData\Local\Programs\Python\Python39\lib\site-packages\urllib3\connectionpool.py", line 384, in _make_request
six.raise_from(e, None)
File "<string>", line 2, in raise_from
File "C:\Users\hadam\AppData\Local\Programs\Python\Python39\lib\site-packages\urllib3\connectionpool.py", line 380, in _make_request
httplib_response = conn.getresponse()
File "C:\Users\hadam\AppData\Local\Programs\Python\Python39\lib\http\client.py", line 1345, in getresponse
response.begin()
File "C:\Users\hadam\AppData\Local\Programs\Python\Python39\lib\http\client.py", line 307, in begin
version, status, reason = self._read_status()
File "C:\Users\hadam\AppData\Local\Programs\Python\Python39\lib\http\client.py", line 276, in _read_status
raise RemoteDisconnected("Remote end closed connection without"
http.client.RemoteDisconnected: Remote end closed connection without response
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "c:\kodi\requests\adapters.py", line 439, in send
resp = conn.urlopen(
File "C:\Users\hadam\AppData\Local\Programs\Python\Python39\lib\site-packages\urllib3\connectionpool.py", line 637, in urlopen
retries = retries.increment(method, url, error=e, _pool=self,
File "C:\Users\hadam\AppData\Local\Programs\Python\Python39\lib\site-packages\urllib3\util\retry.py", line 368, in increment
raise six.reraise(type(error), error, _stacktrace)
File "C:\Users\hadam\AppData\Local\Programs\Python\Python39\lib\site-packages\urllib3\packages\six.py", line 685, in reraise
raise value.with_traceback(tb)
File "C:\Users\hadam\AppData\Local\Programs\Python\Python39\lib\site-packages\urllib3\connectionpool.py", line 597, in urlopen
httplib_response = self._make_request(conn, method, url,
File "C:\Users\hadam\AppData\Local\Programs\Python\Python39\lib\site-packages\urllib3\connectionpool.py", line 384, in _make_request
six.raise_from(e, None)
File "<string>", line 2, in raise_from
File "C:\Users\hadam\AppData\Local\Programs\Python\Python39\lib\site-packages\urllib3\connectionpool.py", line 380, in _make_request
httplib_response = conn.getresponse()
File "C:\Users\hadam\AppData\Local\Programs\Python\Python39\lib\http\client.py", line 1345, in getresponse
response.begin()
File "C:\Users\hadam\AppData\Local\Programs\Python\Python39\lib\http\client.py", line 307, in begin
version, status, reason = self._read_status()
File "C:\Users\hadam\AppData\Local\Programs\Python\Python39\lib\http\client.py", line 276, in _read_status
raise RemoteDisconnected("Remote end closed connection without"
urllib3.exceptions.ProtocolError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "c:\kodi\requests\api.py", line 119, in post
return request('post', url, data=data, json=json, **kwargs)
File "c:\kodi\requests\api.py", line 61, in request
return session.request(method=method, url=url, **kwargs)
File "c:\kodi\requests\sessions.py", line 542, in request
resp = self.send(prep, **send_kwargs)
File "c:\kodi\requests\sessions.py", line 655, in send
r = adapter.send(request, **kwargs)
File "c:\kodi\requests\adapters.py", line 498, in send
raise ConnectionError(err, request=request)
requests.exceptions.ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response')) -
sztanozs
veterán
válasz Hege1234 #3103 üzenetére
Hogy néz ki a save.txt?
import requests
import os
from pynput.keyboard import Key, Controller as K
file = open("c:\kodi\save.txt")
lines = file.readlines()
line = lines[1]
os.startfile("c:\Program Files\Kodi2\kodi.exe")
time.sleep(2)
K().type(line+' ')
file = open("c:\kodi\save.txt")
lines2 = file.readlines()
url = lines2[0]
headers = { 'Content-Type': 'application/json' }
json = {"jsonrpc":"2.0","method":"Player.Open","params":{"item":{"file": url}}}
requests.post('http://kodi:kodi@192.168.1.10:8080/jsonrpc?Base', headers= headers, data= str(json))És ez a rész minek kell?
K().type(line+' ')
Amúgy a request-es rész csak akkor működik, ha engedélyezed a kodiban a http-n keresztüli távoli vezérlést.
[ Szerkesztve ]
JOGI NYILATKOZAT: A bejegyzéseim és hozzászólásaim a személyes véleményemet tükrözik; ezek nem tekinthetők a munkáltatóm hivatalos állásfoglalásának...
-
JoinR
senior tag
válasz Hege1234 #3102 üzenetére
data = data = {...}
helyettdata = {...}
elég. Egyprint(url)
vagyprint(data)
sorral ki tudnád írni a tartalmat, hogy tuti jó-e amit beküldesz.
Nem ismerem a Kodit, úgyhogy lehet hülye kérdés, de ha ezt a kódot a gépedről futtatod, akkor minek oda másolgatni bármilyen modult? A kodi csak egy http post request-et fog látni, mindegy, az már az ő dolga, hogyan dolgozza fel.[ Szerkesztve ]
-
sztanozs
veterán
válasz Hege1234 #3103 üzenetére
Kodi RPC engedélyezése:
https://www.tinymediamanager.org/blog/kodi-json-rpc-api/JOGI NYILATKOZAT: A bejegyzéseim és hozzászólásaim a személyes véleményemet tükrözik; ezek nem tekinthetők a munkáltatóm hivatalos állásfoglalásának...
-
-
-
sztanozs
veterán
válasz Hege1234 #3114 üzenetére
Hogyan került bele a resp-be a result? az nem látszik a kódból...
mondjuk urllib helyett requests modult használnék:import json
import base64
import requests
credentials = b'kodi:kodi'
encoded_credentials = base64.b64encode(credentials)
authorization = b'Basic ' + encoded_credentials
headers = { 'Content-Type': 'application/json', 'Authorization': authorization }
url = 'http://192.168.1.10:8080/jsonrpc?Base'
data = [
{"jsonrpc":"2.0","method":"Player.GetProperties","params":[1,["time"]],"id":17},
{"jsonrpc":"2.0","method":"Player.GetItem","params":[1,["file"]],"id":18}]
response = requests.post(url, headers=headers, data=json.dumps(data))
# vagy
# response = requests.post(url, headers=headers, json=data)
result = response.json()
print(result)JOGI NYILATKOZAT: A bejegyzéseim és hozzászólásaim a személyes véleményemet tükrözik; ezek nem tekinthetők a munkáltatóm hivatalos állásfoglalásának...
-
JoinR
senior tag
válasz Hege1234 #3116 üzenetére
Nem konzisztens, amit írsz; keverjük a result és resp változót.
Ha aprint(result)
az egy lista, ahogy itt írod, akkor csak integerrel tudsz hivatkozni (pl.result[0]
) egy adott elemére. Viszont a resp-es kódrészletben meg key-re hivatkozol (resp['result']
), mivel ott már a beágyazott dict-be kerülsz valahogy.Ha a result egy dict-ek listája, akkor meg kell keresned, hogy melyik elemében (azaz melyik dict-ben) van
time
key és melyikbenitem
key.
Pl:result = [{"id":17,"jsonrpc":"2.0","result":{"time":{"hours":0,"milliseconds":416,"minutes":52,"seconds":59}}},
{"id":18,"jsonrpc":"2.0","result":{"item":{"file":"smb://192.168.1.10/n filmek 720p/@.mkv","id":340,"label":"The Expendables 3","type":"movie"}}}]
for i in result:
if i['result'].get('time'):
mytime = i['result']['time']
if i['result'].get('item'):
myfile = i['result']['item']['file']
print(mytime)
print(myfile)
[ Szerkesztve ]
-
sztanozs
veterán
válasz Hege1234 #3116 üzenetére
Igen, ahogy a kolléga is írja a visszaadott jon egy lista [ ], amiben dictionary-k vannak { }
A listán végig-iterálva szépen meg tudod nézni, hogy mi van bennük.Amúgy mivel az elküldött data is két elemet tartalmaz, így láthatóan erre a két elemre kapsz választ a response-ban. Szerintem, ha a kérésben megadsz "id":valami_egyedi_szám mezőt is, akkor a válaszokat ehhez hozzá tudod majd kötni.
[ Szerkesztve ]
JOGI NYILATKOZAT: A bejegyzéseim és hozzászólásaim a személyes véleményemet tükrözik; ezek nem tekinthetők a munkáltatóm hivatalos állásfoglalásának...
-
sztanozs
veterán
válasz Hege1234 #3119 üzenetére
használj valami kódszerkesztőt vagy IDE-t szerintem, interaktív módban nem túl vidám a python: Atom, Visual Studio Code, PyCharm
JOGI NYILATKOZAT: A bejegyzéseim és hozzászólásaim a személyes véleményemet tükrözik; ezek nem tekinthetők a munkáltatóm hivatalos állásfoglalásának...
-
-
cousin333
addikt
válasz Hege1234 #3125 üzenetére
No offense, de ez így kissé gányolásnak tűnik az elemek egyesével történő kiírásával.
A helyedben megnézném beépített a datetime modult: [link]
A kiolvasott időadatokból készítenék egy datetime objektumot, majd, közvetlenül kiírás előtt megformáznám a time.strftime() függvénnyel.A lényeg, hogy a beolvasott adatokat valami kulturált belső objektumban tárolnám, és azt dolgoznám fel, írnám ki. Javaslom például a pandas modult. Van read_json() metódusa is, bár én még azt nem használtam.
"We spared no expense"
-
sztanozs
veterán
válasz Hege1234 #3123 üzenetére
h,m,s = map(int, [result[0]['result']['time'][val] for val in ['hours','minutes','seconds']])
time = f'{h:02}{m:02}{d:02}'
print(result[1]['result']['item']['file'],time, sep='\n')
# fájlba menteni
with open('filenév.txt', 'w') as outfile:
outfile.write(time)[ Szerkesztve ]
JOGI NYILATKOZAT: A bejegyzéseim és hozzászólásaim a személyes véleményemet tükrözik; ezek nem tekinthetők a munkáltatóm hivatalos állásfoglalásának...
-
-
cousin333
addikt
válasz Hege1234 #3127 üzenetére
Lényegét tekintve ennyi:
import datetime
t = datetime.time(hour=result[0]['result']['time']['hours'], minute=result[0]['result']['time']['minutes'], second=result[0]['result']['time']['seconds'])
print(t.strftime("%H %M %S"))
Ha az elemek nevei nem lennének többesszámban (hours) még egyszerűbb lenne a dolog:
t = datetime.time(**result[0]['result']['time'])
[ Szerkesztve ]
"We spared no expense"
-
sztanozs
veterán
válasz Hege1234 #3133 üzenetére
mondjuk nem ártana egy python gyorstalpalót lenyomnod, szvsz már rég meg tudtad volna csinálni magadtól, ha végigtolsz egy 2-3 órás python-alapok videót...
JOGI NYILATKOZAT: A bejegyzéseim és hozzászólásaim a személyes véleményemet tükrözik; ezek nem tekinthetők a munkáltatóm hivatalos állásfoglalásának...
-
Hege1234
addikt
válasz Hege1234 #3137 üzenetére
with open('c:\\kodi\\save.txt', 'a+') as outfile:
outfile.write(result[1]['result']['item']['file']+'\n'+time+'\n'+result[1]['result']['item']['label']+'\n'+'----------'+'\n')
outfile.seek(0)futtatás után a seek(0) miatt nem úgy kellene működnie, hogy az új 4 sor a fájl elejére kerüljön és ne végére?
-
-
sztanozs
veterán
válasz Hege1234 #3144 üzenetére
beszúrást nem tud, ahogy a többiek is írták:
- file megnyit olvsásra, beolvas sztringbe, bezár
- file megnyit írásra, beleírod az elejét, visszaírod a beolvasottat, bezár
https://stackoverflow.com/questions/4454298/prepend-a-line-to-an-existing-file-in-pythonAmúgy még mindig tartom magam az előző véleményemhez - egyáltalán nem bántásból -, de ha olyan kérdések merülnek fel, hogy miért nem ír ki valmit, amikor nem rakod bele print-be vagy write-ba a változót, akkor még csiszolj kicsit az alapokon.
JOGI NYILATKOZAT: A bejegyzéseim és hozzászólásaim a személyes véleményemet tükrözik; ezek nem tekinthetők a munkáltatóm hivatalos állásfoglalásának...
-
-
sztanozs
veterán
válasz Hege1234 #3159 üzenetére
Összeraktam inkább rendesen...
import requests
from bs4 import BeautifulSoup
def parse_src(text_response, src=''):
try:
soup = BeautifulSoup(text_response, 'html.parser')
for vid in soup.find_all('source'):
src = vid['src']
except:
pass
return src
def parse_text(text_response, line, src=''):
try:
return text_response.split("\n")[line]
except:
return src
m3_data = [
{
'name': 'CINE LIFE HD',
'url': 'http://streamstat.net/videoplayer.cgi?sid=14358315&ext=.m3u8',
'logo': 'https://cinelife.com/wp-content/uploads/2020/04/cinelife_logo.png',
'parser': parse_src,
'parser_args': {},
},
{
'name': 'FEM 3',
'url': 'https://onlinestream.live/fem3/videoplayer/6455-1',
'logo': 'http://1241.hu/userfiles/image/tvcsatornak/fem3.jpg',
'parser': parse_src,
'parser_args': {},
},
{
'name': 'Extreme Sports Channel',
'url': 'https://raw.githubusercontent.com/Special2020/Iptv-hu.m3u/master/Uj%20T%20A.m3u',
'logo': 'https://cdn.pngsumo.com/tv-guide-extreme-sports-channel-the-home-of-action-sports-action-sports-png-320_240.png',
'parser': parse_text,
'parser_args': {'line': 308},
},
{
'name': 'FIX TV',
'url': 'http://streamstat.net/videoplayer.cgi?sid=148177550&ext=.m3u8',
'logo': 'http://1241.hu/userfiles/image/tvcsatornak/pic_atkoto_55_fix_tv.png',
'parser': parse_src,
'parser_args': {},
},
]
exif_info = '#EXTM3U\n'
for channel in m3_data:
html_response = requests.get(channel['url'])
parser = channel['parser']
extra = channel['parser_args']
src = parser(html_response.text, **extra)
if src:
channel['src'] = src
exif_info += f'#EXTINF:0,tvg-logo={channel["logo"]}, {channel["name"]}\n{src}\n'
print(exif_info, file=open("test.m3u8", "w"))[ Szerkesztve ]
JOGI NYILATKOZAT: A bejegyzéseim és hozzászólásaim a személyes véleményemet tükrözik; ezek nem tekinthetők a munkáltatóm hivatalos állásfoglalásának...
-
sztanozs
veterán
válasz Hege1234 #3178 üzenetére
Ezekkel a linkekkel nincs semmi baj (legalább is a kapcsolat létrejön), csak a szerveroldalon van valami gond velük. A címből nem lehet megállapítani, hogy problémás-e, meg kell nézni, hogy jön-e adat a stream-en, és ha nem csak discard...
Az alábbi funkcióval ellenőrizhető, hogy megnyitható-e a cím, és hogy 5 mp-en belül jön-e adat:
def check_server(url):
try:
with requests.get(url, timeout=5, stream=True) as r:
next(r.iter_content())
return True
except requests.exceptions.ConnectionError:
return FalseA következő sor helyére tehető be az ellenőrzés:
if src:
ígyif src and check_server(src):
JOGI NYILATKOZAT: A bejegyzéseim és hozzászólásaim a személyes véleményemet tükrözik; ezek nem tekinthetők a munkáltatóm hivatalos állásfoglalásának...
-
sztanozs
veterán
válasz Hege1234 #3358 üzenetére
filter kell neked:
file = open("characters.txt")
lines = [*filter(lambda line:len(line)<=150, file.readlines())]
characters = lines[0]ha nem kell, hogy indexelhető legyen hanem elég az iterátor, akkor nem kell listává alakítás:
file = open("characters.txt")
for line in filter(lambda line:len(line)<=150, file.readlines()):
# művelet
characters = lineJOGI NYILATKOZAT: A bejegyzéseim és hozzászólásaim a személyes véleményemet tükrözik; ezek nem tekinthetők a munkáltatóm hivatalos állásfoglalásának...
-
Hege1234
addikt
válasz Hege1234 #3418 üzenetére
file = open("dat.txt")
lines = file.readlines()
dat = lines[0]dat.txt
i5fstZQAjiTCw6ZdzOjaSxrjwerror:
raise ValueError('Invalid header value %r' % (values[i],))
ValueError: Invalid header value b'i5fstZQAjiTCw6ZdzOjaSxrjw\naz egészbe az kavar bele, hogy ott a végén az \n vagy az, hogy nem tudom a headers-be juttattni a dat-ot?
-
Hege1234
addikt
válasz Hege1234 #3443 üzenetére
sikerült
import re
f = open("log.txt_log").read()
link = re.findall("https?:.+\.mpd(?!\?)", f)
link = link[0].strip()
print(link)
print(link, file=open("link.txt", "w"))----------------------
ebben viszont elakadtam
link.txt-t beolvasva hogyan tudnék abból az egy sorból szövegrészeket felcserélni?
3 különböző szöveget kellene felcserélni
ezt jrepl-el csak úgy lehetett megoldani, hogy 1 szöveget kicserélt elmentette
azt a fájlt behívva kicseréli a 2. at ezt megint elmenteni
majd behívni és kicserélni a 3. at is
ezt pythonnal meg lehetne oldani egyszerre?ez nem tudom lényeges-e, de esetleg ebből átláthatóbb:
set "int=_w[0-9]+"
set "int_new=_w999999999"
call "jrepl" "!int!" "!int_new!" /m /f "link.txt" /o "result1.txt"
setlocal enabledelayedexpansion
set "int=_ps[0-9]+"
set "int_new=_ps0000100"
call "jrepl" "!int!" "!int_new!" /m /f "result1.txt" /o "final.txt"
setlocal enabledelayedexpansion
set "int=_pd[0-9]+"
set "int_new=_pd60000000"
call "jrepl" "!int!" "!int_new!" /m /f "final.txt" /o -ebből:
https://stream7.nava.hu/navahu_bdrm/_definst_/amlst:mnfa-84/manifest_w1646702604_ps3854000_pd60000_qc2Vzc2lkPSZvbXE9dHJ1ZSZucD0mbGI9WDlYaVNvY3Q4dGpaJTJCRkt5UllXbWNxS1c3cWRZcDNnYmdOTUJVaks5MTduaUN4M1k5Sm1Vc2FPV0RyblFmV2pQbWdhM0FJVXFuYkdUJTBEJTBBNDZTUGRyZTAzUSUzRCUzRCUwRCUwQQ==.mpd
erre:
https://stream7.nava.hu/navahu_bdrm/_definst_/amlst:mnfa-84/manifest_w999999999_ps0000100_pd60000000_qc2Vzc2lkPSZvbXE9dHJ1ZSZucD0mbGI9WDlYaVNvY3Q4dGpaJTJCRkt5UllXbWNxS1c3cWRZcDNnYmdOTUJVaks5MTduaUN4M1k5Sm1Vc2FPV0RyblFmV2pQbWdhM0FJVXFuYkdUJTBEJTBBNDZTUGRyZTAzUSUzRCUzRCUwRCUwQQ==.mpd
ezzel megtalálható
"_w[0-9]+_ps[0-9]+_pd[0-9]+"de, hogyan lehetne felcseréltetni a benne lévő számokat mindig ezekre?
_w999999999
_ps0000100
_pd60000000 -
sztanozs
veterán
válasz Hege1234 #3444 üzenetére
import re
f = open("log.txt_log").read()
link = re.findall(r"https?:.+\.mpd(?!\?)", f)[0].strip()
link = re.sub("_w[0-9]+", "_w999999999", link)
link = re.sub("_ps[0-9]+", "_ps0000100", link)
link = re.sub("_pd[0-9]+", "_pd60000000", link)
print(link)
print(link, file=open("final.txt", "w"))[ Szerkesztve ]
JOGI NYILATKOZAT: A bejegyzéseim és hozzászólásaim a személyes véleményemet tükrözik; ezek nem tekinthetők a munkáltatóm hivatalos állásfoglalásának...
-
cousin333
addikt
válasz Hege1234 #3452 üzenetére
Én most ennyire jutottam. Elismerem, hogy nem a legszebb kód evör
import re
regex = r'S[1-9]*[0-9]\sE[1-9]*[0-9]:?'
r = re.compile(regex)
def replacer(x):
a, b = x.group().split()
return f'S{int(a[1:]):02}E{int(b[1:]):02}'
s = 'Rick and Morty - S5 E2 Mortyplicity'
re.sub(r, replacer, s)
Ebben az esetben az s az a cím sztring. A kimenet:
'Rick and Morty - S05E12 Mortyplicity'
[ Szerkesztve ]
"We spared no expense"
-
Hege1234
addikt
válasz Hege1234 #3459 üzenetére
köszi, így sikerült rájönnöm, hogyan hagyjam el az end-et
for key in keys:
f = open("key.txt", "a+")
f.write('--key '+key+' ')
f.close
felmerült még egy "probléma"
szeretném ezeket a kulcsokat amik egy sorba kerültek a legvégére egy '\n' -t tenni
viszont, ha ezt most így csinálom akkor ugyan ott vagyok ahonnan indultamfor key in keys:
f = open("key.txt", "a+")
f.write('--key '+key+' '+'\n')
f.close
hogyan lehetne azt megcsinálni, hogy egy sorba teszi és a legvégén hozzáad egy új sort
hogy következő alkalomkor is az egy sorba gyűjtött kulcsok már új sorba kerüljenek? -
axioma
veterán
válasz Hege1234 #3460 üzenetére
A cikluson kivul ures print irja ki _csak a vegere a \n -t.
String osszerakassal, zanzasitva (bocs, mobilrol):f.write('--key '+(' --key '.join(keys)))
Persze lehet a join hasznalata nelkul ugy ahogy irtam, kulon stringbe gyujtve, csak hosszabb:st=''
for key in keys:
st+=' --key '+key
with open("key.txt","a+") as f:
f.write(st[1:])
(a [:1] csak ha zavar a sor eleji plusz szokoz, de lehet a vegere ha ott jobban elfer)[ Szerkesztve ]
-
cousin333
addikt
-
cousin333
addikt
válasz Hege1234 #3487 üzenetére
Én valami ilyesmit csinálnék (nem teszteltem):
def convert(txt):
return ', '.join(f"'{chunk}'" for chunk in txt.split())
with open("d:/input.txt", "r") as reader, open("d:/output.txt", "w") as writer:
writer.writelines(map(convert, reader))
[ Szerkesztve ]
"We spared no expense"
-
cousin333
addikt
válasz Hege1234 #3491 üzenetére
Azért ez egy kicsit más feladat...
Az a probléma, hogy a keys argumentumoknál egymást kéne követnie a paramétereknek (lásd a működő sorokat), vesszővel elválasztva. Nálad viszont egyetlen sztring argumentumként megy be az egész. És azért van ", mert a ' már szerepel a sztringben...
Igazából neked ez az egész konkrét művelet, amit kérdeztél, - az aposztrófokkal, meg a vesszőkkel - szükségtelen. Először is, az eredeti key.txt fájlt használd, ne az én kódommal módosítottat. Ezt a két sort
keys = fs.readlines()
keys = keys[0].strip()
Ezt cseréld le erre:
lines = fs.readlines()
keys = lines[0].strip().split()
A futtatás parancsot
debug = subprocess.run([mp4decr, keys, video, videoout])
meg erredebug = subprocess.run([mp4decr, *keys, video, videoout])
[ Szerkesztve ]
"We spared no expense"
-
cousin333
addikt
válasz Hege1234 #3495 üzenetére
Az univerzális megoldás valóban a try-except (lásd 8.3 fejezet). Lényegében a kritikus részt a try blokkba írod, és ha lefut, örülsz. Ha hiba van, akkor az except ág(ak) fut(nak) le. Ily módon szelektíven lehet kezelni a problémát: ha pl. a fájl nem található (lásd FileNotFoundError) akkor vállat vonsz és továbblépsz a következő fájlra, ha viszont más a hiba, akkor lehet, hogy ez nem elegendő megoldás, de jó, ha tudsz a problémáról.
A fenti példában (is) lehet célirányosabb megoldást is találni, például megvizsgálni a vtt értékét, mielőtt dolgozni kezdesz vele, hiszen a findall egyik lehetséges hibája, hogy éppenséggel nem talál semmit:
vtt = re.findall("[a-zA]...')
if vtt is not None:
vtt = vtt[0].strip()
...
A fenti esetben feltételezhető, hogy None értéket kap. De az is vizsgálható, hogy lista-e, és/vagy van-e annyi eleme, amennyi neked kell. Szívás, de a kód egy jelentős része mindig arra megy el, hogy ezeket a hibákat felderítsd és megnyugtatóan lekezeld.
[ Szerkesztve ]
"We spared no expense"
-
axioma
veterán
válasz Hege1234 #3498 üzenetére
Miben lehet csak szam? Az i az teny hogy jobban atlathato ha egy egesz, de pythonban [es erre vigyazz] akar a beepitett fuggvenynevet is hasznalhatod [felulcsapod!] valtozokent, ill. ua valtozo mas-mas tipust is felvehet.
Miert kell a ciklus? Nem csak egyet akarsz bekerni? Azt az egesz koztes reszt nem ertem.
Az input utan en csakprint(my_list[minoseg])
-re gondolnek, ha meg tobb bekerest akarsz akkor az is belul kene legyen a ciklusban [ami nagy valoszinuseggel nem is szamlalos for hanem tesztelos while kene legyen][ Szerkesztve ]
-
cousin333
addikt
válasz Hege1234 #3498 üzenetére
Uhhh... Bevallom nem tudom, mit csinál a kódod, de sok sebből vérzik.
Erre a problémára a legegyszerűbb megoldás a szótár (dictionary) használata. Ez gyakorlatilag kulcs-érték párokat jelent, random sorrendben. A kulcs és az érték is bármilyen típus lehet (sztring is).
qualities = {'0': 1080, '1': 720, '2': 540, '3': 480}
Ha úgyis csak szám-opciókat akarsz, akkor egyszerűbben is legenerálhatod:
my_list = [1080, 720, 540, 480, 360]
qualities = {i: j for i, j in enumerate(my_list)}
Ha mondjuk azt akarod, hogy a kulcs inkább sztring legyen, ne szám:
qualities = {str(i): j for i, j in enumerate(my_list)}
print('Minőség kiválasztása\r\n')
print('\r\n'.join(f'{i} = {j}' for i, j in qualities.items()))
minoseg = input('\nÍrd ide a számot: ')
quality = qualities[minoseg]
ekkor a quality változóban benne lesz a szám, 1080, 540 vagy amit kiválasztasz.
[ Szerkesztve ]
"We spared no expense"
-
axioma
veterán
válasz Hege1234 #3502 üzenetére
Az csak annyi hogy az i mar nem szoveg hanem szam lesz ha igy irod:
i = int(input("\nírd ide a számot: "))
A belso zarojelben kap egy stringet amit a kulso konvertal szamma, es azt ta'rolja.
Persze akkor a try-ban kene ez is legyen.
[Amugy ha hiba eseten return None, akkor irhatod a pass helyere.
Viszont a None-vel meg kivul bajod lesz, a try-catch lehetne a foprogram reszen, minden a try blokkban ami hasznalja az i-t - mert a hibas indexet is elkapja, except-ben meg hibauzenet.
Megjegyzem ha nem ragaszkodsz az enumerate-hez, akkor betennek egy dummy 0. elemet az options-be de csak 1-tol iratnam ki, akkor nem kell a valaszt tologatni; vagy ld. a korabbi dict-es megoldast a tombindex helyett.]
Mondjuk ha iskolai feladat akkor while ciklus kene amig nem lesz int, vagy egy megadhato 'break'.[ Szerkesztve ]
-
axioma
veterán
válasz Hege1234 #3504 üzenetére
Mi a bonyolult, hogy hova keruljon a try? Az 'elore' int-eles nagyon megszokott, azt atveheted, de pont a tipustalansag miatt akar olyat is leirhatsz a bekeres utan, hogy
i=int(i)
[persze jobb lenneans=input(...)
es utanai=int(ans)
, ha mar kulonrakod, igy sokkal erthetobb-kovethetobb].
A try-ra pedig ha a 'foprogramban' nem baj hogy nem kezeled a None-t [megj. lehetne rossz valasz eseten ervenyes default is], akkor csak kozmetikai javitas. De tenyleg fugg attol, mi a kodkeszitesed celja [tananyagot kovetsz, valami meglevot akarsz sajat kutfobol szemelyre szabni, valami csak altalad hasznalt lesz es/vagy fix file-bol jon az adat nem 'eri meg' a rossz inputra felkeszulni - pl. prog.versenyeken is igy megy -, vagy valami tok mas]. Ezek fuggvenyeben jobban lehet a segitseget is kalibralni. En eddig inkabb ravezetni akartalak, nezd meg a hasznzlt kulcsszavakat mas kodban v. tutorialban.[ Szerkesztve ]
-
axioma
veterán
válasz Hege1234 #3506 üzenetére
Jaaa, hogy meglevo batch helyett irod, akkor mar ertem hogy hogyan kerulhetett bele ciklus...
Szerintem kicsit osszevonom neked, szolj ha nem igy ertetted a "ne lepjen ki"-t:while True:
try:
ans = input("\nírd ide a számot: ")
num = int(ans)
if 1<=num<=5:
return num-1
print("csak 1-5-ig írhatsz ide számot!")
except ValueError:
print("ide csak számot írhatsz!")
Ez igy addig nem lep ki, es raadasul szelektiv hibauzenetet ad, amig nem jo erteket ir be a user. Igy viszont kilepni lesz nehez belole (jo, ctrl-c vagy ablak becsuk).
Termeszetesen ekkor mar nem kell a kulso try-except.
Me'g egy aprocska megjegyzes: ha a pick fuggvenyed ismeri az options-t, akkor nem sok ertelme van annak, hogy az indexszel tersz vissza, lehetne egybol az ertekkel (return options[num-1]
es aquality=pick(options)
is egyszerusodik).Kiegeszites: ha me'gis dict-tel csinalnad akkor a szamot se kene kulon konvertalni es kulon vizsgalni, igaz kevesbe szelektiv hibauzenettel, de az egesz ide egyszerusodik:
def pick(options):
print("\nminőség kiválasztása:\n")
for idx, element in options.items():
print("{} = {}".format(idx, element))
while True:
try:
ans = input("\nírd ide a számot: ")
return options[int(ans)]
except ValueError,KeyError:
print("ide csak 1-5 egész számot írhatsz!")
options = {1:"1080", 2:"720", 3:"540", 4:"480", 5:"360"]
quality = pick(options)
print(quality)
(azert nem megy tombbel, mert a pythonban - minden mas esetben udvozlendo modon - le'tezik a negativ indexeles, tehat ha tombbel csinalnad es IndexError-t varnal, akkor a 0 beirasa az 5-os erteknek felelne meg es hiba nelkul atmenne)
(Valamint a teljes konvertalas kikerulheto, ha a dict-nek a kulcsa az '2' alakban van megadva es nem 2 szamkent. Mondjuk a szamossal me'g az 1+1 input is ervenyes, ugy meg a '2 ' - plusz szokoz - se menne at... szoval azt nem javaslom. Anno ezeket ahol megoldhato nem inputtal - valasztott szam + enter -, hanem keyboard figyelessel oldottak meg, ott akkor 1 billt nez csak meg, mar amig nincs 10-nel tobb opciod.)[ Szerkesztve ]
-
axioma
veterán
válasz Hege1234 #3509 üzenetére
Nem futtattam csak nyersen irtam, typo siman lehet benne. Exception-re csak remlett hogy lehet, aktivan nem irkaltam ilyeneket csak max. copy-paste, de amugy itt van, tuple-kent lehet: [link] De ez csak az en lustasagom, szebb ha kulon van a hibauzenet a kulonbozo hibakra, nyilvan attol fugg hogy hol lesz hasznalva. [Ha log-ba menne, akkor ki kene iratni a hibauzenetben hogy mi volt az eredeti szoveges 'ans', akkor mar csak tudja a kodolo hogy az miert nem jo ott, ha nem kategorizalt a hibaszoveg akkor is.]
Az egerfigyelesrol gozom sincs, en bill.figyelest anno pascal csinaltam ebbol kitalalhatod a koromat (also korlatjat minimum).[ Szerkesztve ]