Új hozzászólás Aktív témák
-
senior tag
Sziasztok,
Nagyon küzdök, mint disznó a jégen... hátha tudtok segíteni...
Python-ban ollóznék össze egy olyan scriptet, ami egy nagy méretű TXT file-ból megadott keresési szövegrész-től a következő ilyen keresési szövegrészig kiveszi a köztes text tartalmat és azt külön file-okba kiteszi (ismétlődő szövegrészek, amikben pár adat eltér, ezeket kellene legyűjteni és egyenként külön file-ba tenni)Namost az elképzelésem az így az elején, hogy soronként vizsgálnám és emelném át új, írásra nyitott file-okba a tartalmat, de egyrészt nem találtam még megoldást egy keresési összetett szó (mondat) miként található meg úgy, hogy az érintett sorindexet adja vissza (azaz a keresett 'mondat' hanyadik sorokban van)
Néztem a read kezdetű python függvényeket, mindenhol a read() függvényt hozzák a mintapéldákban, amivel az egész TXT file betölthető lenne, de nálam mikor ezt használnám konkrétan nem ad vissza semmit kiprintelve. Hiba nélkül lefut a kód, de nem jelenik meg semmi adat. Nem értem. -
cousin333
addikt
Mi van meg eddig? Őszintén szólva csak részben értem a problémát. A szövegrész, amit keresel az egy sorban van, vagy több sor között szétosztva? Valami konkrét sztringet keresel? A sor elején van, a közepén, vagy különálló sor?…
Pythonban van arra lehetőség, hogy egy for ciklussal menj végig a fájlon. Pl.:
with open(‘d:/szoveg.txt’, ‘r’) as ifile:
for i, line in enumerate(ifile):
print(‘sorszam:’, i, ‘tartalom:’, line)
Bár nem tudom, mivel próbálkoztál, de szerintem nincs szükséged a sorszámra a feladat megoldásához. Ezt inkább valami generátor függvénnyel gondolnám megoldani. Megnyitja a fájlt, soronként kiolvassa, mindig amíg a kérdéses sor nem következik.
[ Szerkesztve ]
"We spared no expense"
-
Siriusb
veterán
Tipikus helyzet, amikor egy példával illusztrálva sokat segítenél. No meg, hogy mit jelent a nagy fájlméret nálad. Az is fontos lehet, hogy vannak-e sorvégződések, egy soron belül keresed-e az adott szövegrészt, vagy több sorba átnyúlik stb.
Pl. ha be tudod olvasni egyszerre az egész szövegfájlt, valószínűleg egy regex kifejezéssel (re modul) szépen meg lehetne oldani, én legalábbis ez irányba indulnék el így látatlanban. -
senior tag
válasz cousin333 #3252 üzenetére
No, az éjjel tovább írtam egy lehetséges megoldást, az elmélete az, hogy
találtam egy függvényt, ami azt csinálja hogy két keresési értékre megmondja hogy melyik sorban vannak azok a szöveges file-ban. A két keresési értéknek (mivel kötött formátumú, ismétlődő szövegrészekről van szó, így meg lehetett adni a kezdő szövegrészt és a záró szövegrészt - ezek lettek a két keresési értékek)
A függvény legyűjtötte ezen sorok számát. A sorok számát aztán beletettem egy további listába, ami egymás után folytatólag tartalmazta a kezdő és záró sorok sorszámát. Aztán ezt egy for ciklussal (mert tudtam hanyadik sorban van az utolsó záró sor sorszáma) és ahhoz használt két számlálóval - a számlálókat léptetve - már range értékként egy további for ciklussal kinyertem a köztes sorok sorszámait - így megkaptam a 'lényegi információt' tartalmazó sorok sorszámát. Egy ilyen 'range' után betettem egy ellenőrző szöveges sort, ami alapján látom hogy helyesen működik-e a script (egyszerűen 'következő tétel' kiírás jelenik meg az adott for ciklus lefutása után) - ez alapján eddig megvagyok.Most jön az, hogy au egy tételhez tartozó sorokat legyűjtő for ciklus végére teszek egy file kiíratást ami soronként hozzáadja, 'másolja' a legyűjtött sorok sorszámában lévő szöveget, majd lezárja és nyitja a következő file-t, abba is írja a legyűjtött következő sorokat és így tovább. Még az kellene, hogy a megnyitott fileok amikbe a legyűjtött sorok másolódnak olyan filenéven legyen aminek adata szintén a forrás textfile-ban van.
Most keresem azt a megoldást amivel a kulcsszó utáni adott karakterhosszúságban kiveszi és egy változóba teszi azt az infót ami aztán a file neve is lesz.A talált két keresőértékes függvény:
def search_multiple_strings_in_file(file_name, list_of_strings):
"""Get line from the file along with line numbers, which contains any string from the list"""
line_number = 0
list_of_results = []
# Open the file in read only mode
with open(file_name, 'r') as read_obj:
# Read all lines in the file one by one
for line in read_obj:
line_number += 1
# For each line, check if line contains any string from the list of strings
for string_to_search in list_of_strings:
if string_to_search in line:
# If any string is found in line, then append that line along with line number in list
list_of_results.append((string_to_search, line_number, line.rstrip()))
# Return list of tuples containing matched string, line numbers and lines where string is found
return list_of_resultsés a lényegi sorok sorszámát tartalmazó lista feltöltése:
kezdet = 0
vege = 1while vege < max(sorszamlista):
print('text kezdete: ',sorszamlista[kezdet])
print('text vége: ',sorszamlista[vege])sorkoz = range(sorszamlista[kezdet]-1, sorszamlista[vege]+1)
for n in sorkoz :
print(text[n].rstrip()) # text = fajl.readlines()
print('Következő tétel ##########################')
kezdet+=2
vege+=2[ Szerkesztve ]
-
senior tag
Az indentálás nem jelenik meg helyesen valamiért a fórummotor kiveszi így aláhúzással jelölöm
kezdet = 0
vege = 1
while vege < max(sorszamlista):
____print('text kezdete: ',sorszamlista[kezdet]) # teszt kiíratás
____print('text vége: ',sorszamlista[vege])
____sorkoz = range(sorszamlista[kezdet]-1, sorszamlista[vege]+1)____for n in sorkoz :
_________print(text[n].rstrip()) # text = fajl.readlines() #tesztelésképp kiíratás
_________print('Következő tétel ##########################')
____kezdet+=2
____vege+=2[ Szerkesztve ]
-
sztanozs
veterán
ha a kifejezés csak egyszer van:
szoveg = 'valami másvalami'
kifejezes = 'más'
hossz = 3
try:
ix = szoveg.index(kifejezes)
# ha a kifejezes is kell + hossz
print('kif szoveg: ', szoveg[ix:ix+len(kifejezes)+hossz])
# ha a kifejezes nem kell
print('csak szoveg: ', szoveg[ix+len(kifejezes):ix+len(kifejezes)+hossz])
except:
passha a kifejezés többször is van:
szoveg = '''valami másvalami
még másvalami
egészen más'''
kifejezes = 'más'
hossz = 3
try:
while True:
ix = szoveg.index(kifejezes)
# ha a kifejezes is kell + hossz
print('kif szoveg: ', szoveg[ix:ix+len(kifejezes)+hossz])
# ha a kifejezes nem kell
print('csak szoveg: ', szoveg[ix+len(kifejezes):ix+len(kifejezes)+hossz])
szoveg = szoveg[ix+len(kifejezes)+hossz:]
except:
passha a kifejezés többször is van, és eleje-vége között kell a szöveg:
szoveg = '''random szöveg
valami másvalami
még másvalami
egészen más
szöveg ami bekavarhat :D'''
eleje = 'más'
vege = 'mi'
try:
while True:
ix = szoveg.index(eleje )
iy = szoveg[ix:].index(vege)
# találat
print(szoveg[ix:ix+iy+len(vege)])
szoveg = szoveg[ix+iy+len(vege):]
except:
pass[ 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
Továbbra is úgy gondolom, hogy neked felesleges a sorszámokkal foglalkozni, elvégre a START sztring és a STOP sztring nincs átfedésben. Egyszerűen végig kell menni a fájlon, és kiírogatni a megfelelő sorokat, majd nyitni egy új fájlt, oda is kiírni... stb.
Tegyük fel, hogy van a szoveg.txt fájlod, amit fel akarsz dolgozni:
blahbla
blahbla2
START
Első sor
Adat: valami
még egy sor
STOP
blah
START
Új fájlba
újabb sor
Adat: minden
STOP
semmiEkkor csak egyszer végig kell menni a fájlon és keresni a megfelelő sorokat. A nehézséget csak az jelenti, ha a START és a STOP között van a sor, ami a fájlnevet adja, így azt nem tudhatjuk előre. Ilyenkor azt csinálnám, hogy univerzális fájlnevet adok, és a végén átnevezem:
import os
start_string = 'START'
stop_string = 'STOP'
file_string = 'Adat:'
filename = ''
output_file = None
with open('szoveg.txt', 'r') as input_file:
for line in input_file:
if line.startswith(start_string):
output_file = open('output.txt', 'w')
elif line.startswith(stop_string):
output_file.close()
os.rename('output.txt', filename + '.txt')
elif line.startswith(file_string):
filename = line[6:] # Vagy ahogy ki kell találni a fájlnevet
else:
output_file.write(line)
[ Szerkesztve ]
"We spared no expense"
-
-
senior tag
válasz sztanozs #3257 üzenetére
Egy blokkon (kivett sorokon) belül 1x fordul elő a keresett kulcsszó ami után van két szóköz és utána 8 karakter hosszan a kívánt adat.
Így a blokk legyűjtő for ciklusomba tenném amit írtál elsőre kódsort, azonban az except ágra fut, semmit sem ír ki. Kérdésem hogy a szoveg változóba esetleg rosszul hivatkozhatok, -
ez lehet a következő?fajl = open("forrásfile.TXT", "r")
szoveg = fajl.readlines()avagy
szoveg = fajl ??tehát a teljes file kell neki vagy az a sor amin épp dolgozik a for ciklusban? (Kipróbáltam mindkettőt, eredménytelenül)
[ Szerkesztve ]
-
sztanozs
veterán
Ha nem kell több sorban keresni akkor így:
fajl = open("forrásfile.TXT", "r")
kifejezes = 'valami'
hossz = 8
talalatok = []
for sor, szoveg in enumerate(fajl.readlines()):
try:
# ha a kifejezes nem kell +2 space, csak utána 8
talalat = szoveg[szoveg.index(kifejezes)+len(kifejezes)+2:][:hossz]
talaltok += [sor, talalat]
print(sor, talalat)
except:
passJOGI 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
Ebben az esetben egyszerűen így módosítanám a korábbi kódomat:
import os
start_string = 'START'
stop_string = 'STOP'
name_string = 'Adat:'
filename = None
output_file = None
with open('szoveg.txt', 'r') as input_file:
for line in input_file:
if line.startswith(start_string):
output_file = open('output.txt', 'w')
elif line.startswith(stop_string):
output_file.close()
if filename is not None:
os.rename('output.txt', filename + '.txt')
else:
output_file.write(line)
if name_string in line:
loc = line.find(name_string )
loc += len(name_string ) + 2
filename = line[loc:loc+8]
Elképzelhető, hogy kicsit módosítani kell a számokon, de azt már meg tudod nézni.
[ Szerkesztve ]
"We spared no expense"
-
senior tag
válasz sztanozs #3263 üzenetére
Ott van most az elakadásom, hogy olyan listában akarom megtalálni a string-et, amiben 'Egész komplett mondatok szerepelnek', ' és így a lista elemeire nem használható a find vagy az index metódus' -- arra hogy egyetlen szó (pl. elemeire) pozícióját megtaláljam a listában..
ugye a file-ból soronként veszem ki az adatokat és az egész algoritmus listákkal, lista feltöltésekkel dolgozik.
Ami megoldást adtál az a komplett file-ra ráfut, csak abban a for ciklusban ahol a feltöltés zajlik és ahol 'találkozik' az algoritmus a keresett szóval és meg tudná fogni az már lista adattípus és az egész sor mint a lista egyetlen eleme kerül a listába
egy kimásolandó új file-ba illő szövegszakaszt append-el bele tudom tenni egy újabb lista adattípusba, de annak minden egyes eleme a komplett sorok lesznek és nekem egyetlen sor közül kellene egy szót kivennem.[ Szerkesztve ]
-
senior tag
Jó, mostmár beugrott, működik.
Az
enumerate(fajl.readlines()):
helyett:
enumerate(az egy tételt kiadó, össze appendelt lista neve): -t adom meg és így már úgy viselkedik ahogy elképzeltem, az appendelős for ciklus után betéve a kódod egy 'összeállított' file-ba írandó tétel után kiírja a hozzá tartozó keresett szót. Ez mehet változóba és filenévként...Köszönöm
[ Szerkesztve ]
-
sztanozs
veterán
válasz cousin333 #3264 üzenetére
import os
start_string = 'START'
stop_string = 'STOP'
name_string = 'Adat:'
start = False
with open('szoveg.txt', 'r') as input_file:
with open('output.txt', 'w') as output_file:
for line in input_file:
if line.startswith(start_string):
start = True
elif line.startswith(stop_string):
start = False
elif start and name_string in line:
loc = line.find(name_string )
loc += len(name_string ) + 2
filename = line[loc:loc+8]
output_file.write(filename + '\n')[ 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 sztanozs #3268 üzenetére
Szerintem ez nem jó, mert egy fájlt olvas és csak egyet is ír. Abban igazad van, hogy azt nem figyelem pl. az else ágban, hogy van-e már fájlnév/nyitott fájl, de normál körülmények között kell lennie.
output_file.write(filename + '\n')
Ezt nem tudom értelmezni...
"We spared no expense"
-
sztanozs
veterán
válasz cousin333 #3269 üzenetére
beírja az output_fajl változó tartalmát az outputba és dob a végére egy newline karaktert, különben egy sorba kerülnének bele egymás után appendelve a 8-karakteres értékek (a write nem új sorba írja az értékeket).
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 sztanozs #3270 üzenetére
Azt értem, hogy technikailag mit csinál, csak azt nem, hogy minek? Gyakorlatilag az output.txt-be kiírkálod a leendő fájlneveket, minden tartalom nélkül. OK, így lesz egy előzetes listád, és nem menet közben kell kitalálni, de szerintem akkor is felesleges kétszer beolvasni a bemeneti fájlt. Arról nem is beszélve, ha valamiért szétcsúszik a szinkron a fájlnevek és a tartalom között…
"We spared no expense"
-
nagyúr
válasz Siriusb #3261 üzenetére
+1, én is így csinálnám. úgy értem, hogy a sorokat csak mind a megoldás részeként kevertük ide, de a feladat nem az volt, hogy meg kell mondani, honnantól meddig terjed a keresett rész, hanem hogy mi a keresett rész.
Tudod, mit jelent az, hogy nemezis? Az érintett, erősebb fél kinyilatkoztatása a méltó büntetés mértékét illetően. Az érintett fél jelen esetben egy szadista állat... én.
-
ny.erno
tag
Sziasztok!
Ha van köztünk olyan tag, aki vállal python program készítést, és meg tudná alkotni a lenti programot, keressen meg privát üzenetben!
Olyan programra lenne szükség, ami folyamatosan figyeli a bejövő whatsapp/telegram/skype üzeneteket és azokat kigyűjti egy txt fájlba. -
Livius
őstag
Sziasztok!
Van olyan valaki aki már aktívan használta vagy használja még a pythonnet modult?
Tud valaki infót vagy ötletet/példát mutatni, hogy egy C#-ban már meglévő objektumot a Pythonnak, hogyan lehetne előre beadni mint már létező objektum? Ez az objektum egy már megnyílt GUI lenne, és azt kéne a pythonNET-vel bevennem egy sima python objektumba/változóba, mert később a python kód metódusokkal kérne tőle értékeket vagy küldene neki.
Gigabyte GA-Z170-D3H, Intel Core i7-7700K, Corsair Vengeance 2x8GB DDR4-3600MHz, Intel 545s 256GB SSD, EVGA GeForce GTX 1060 GAMING 6GB
-
don_peter
senior tag
Hölgyek és Urak!
Egyelőre csak kutatási fázisban van egy projektem, amelyben azt vizsgálom, hogy milyen programozási nyelven lenne érdemes nekiállni egy cross platform-os alkalmazás leprogramozásának. Python-ra gondoltam és kikérném a véleményeteket tapasztalataitokat, hogy mobil alkalmazás készítésre merjem e használni ezt a nyelvet vagy más felé kezdjek el gondolkodni.
A program néhány tulajdonsága.
Mobil alkalmazás, Android és iOS-re,
SQL adatbázist kell majd használnia
Webes oldal is lesz majd mellette, aminek az adatbázisát fogja használni
Dizájn fontos lesz, emiatt nyilván grafikus felületet kell alkotni
Fontos továbbá, hogy a tárolt adatok érzékenyek, tehát nem lenne jó, ha hozzáférhetőek lennének az SQL hozzáférési adatok vagy a forráskód,
Esetleg, ha lenne ingyenes vagy fizetős sablonok az előnyt jelentene, mert akkor nem kellene nulláról felépíteni egy teljes alkalmazást.Előre is köszi minden tanácsot vagy megjegyzést.
----== Neo Geo és Arcade Fórum : www.neo-geo.hu ==----
-
Silεncε
őstag
válasz don_peter #3279 üzenetére
Mobilappot én még nem is láttam Pythonban írva (ez nem azt jelenti, hogy nem lehetséges, de szerintem nincs rá elterjedt, jól támogatott mód). A BE kész van vagy az is most fog készülni? Oda működhet a Python, a frontend részt (web, mobilappok) viszont valami cross-platform frameworkben csinálnám (ilyenek pl. React Native, Ionic, ezekhez JS tudás kell, vagy mostanában nagyon megy a Flutter, ahhoz meg Dart kell, ami ilyen JS++)
-
don_peter
senior tag
válasz Silεncε #3280 üzenetére
Amit eddig néztem az a python és a kivy páros lenne. Ott láttam már mobil alkalmazást, de nem komplexet. A másik amit nézek, ha python nem lesz megfelelő az a java, ott sokkal több potenciális megoldást találtam. De gondoltam teszek egy próbát a nálam okosabbaknál, hátha.
----== Neo Geo és Arcade Fórum : www.neo-geo.hu ==----
-
justmemory
senior tag
válasz don_peter #3279 üzenetére
Szia,
amennyire tudom, ez van Androidra (iOS-re nem), és python.
Anno kerestem én is megoldást erre, Androidra magamnak próbálkozom is, de nagyon macerás, főleg ha GUI is kell. iOS-t nem tudom, de szerintem ott még macerásabb, mert ott eleve nem igazán működik a python környezet belövése (mintha lenne valami, mikor volt iPhone-om, próbáltam, de sok nem maradt meg), Androidra legalább van PyDroid és társai.
Három videó, amiket néztem: 1., 2., 3.--- Imprisoned, inside this mind... --- Joined at the soul with a pair of headphones ---
-
don_peter
senior tag
válasz justmemory #3282 üzenetére
Köszi, ezeket én is néztem már. Sajna elég kevés az anyag és egyre inkább kezdek más irányban gondolkodni. Ha ilyen macera eleve fellelni és dolgozni ezzel a környezettel, akkor még nem érett meg egy komoly munkára. Talán később még lehet belőle valami.
Köszi mindenkinek a hozzászólást.
----== Neo Geo és Arcade Fórum : www.neo-geo.hu ==----
-
Csaby25
senior tag
Sziasztok! Pythont és Djangot szeretnék tanulni, milyen könyvet - videót (tanfolyamot) ajánlotok? Köszi!
[ Szerkesztve ]
A kis emberek más emberekről beszélnek, a középszerű emberek eseményekről, a nagy emberek pedig ötletekről beszélnek.
-
magortaltos
csendes tag
Igyekszünk játékosan programozást oktatni.
Mondjuk egy kis konzolos játék ennyi Pascalban (Linux alatt természetesen), nem lesz nehéz áttekinteni. Most itt a nyakunkon a Python... Vajon ki tudja ugyan ezt megírni Pythonban, hogy az szép, érthető, tanítható legyen... ?Uses Crt,Unix;
Var x,y,n : byte;
xv,yv : shortint;
c : char;Begin
Clrscr;
fpSystem('tput civis'); // Cursor_Off
gotoxy(15,3);Write('Próbálj bennemaradni a négyzetbe !');
For n:=5 to 50 do Begin
Gotoxy(n,5);Write('*');
Gotoxy(n,20);Write('*');
end;For n:=5 to 20 do Begin
Gotoxy(5,n);Write('*');
Gotoxy(50,n);Write('*');
end;x:=25; y:=7;
Repeat
if keypressed then C:=Readkey; If C=#0 then C:=Readkey;
Case C of
#72 : yv :=-1;
#80 : yv := 1;
#77 : xv := 1;
#75 : xv :=-1;
End;
gotoxy(x,y);Write(' ');
x:=x+xv; y:=y+yv;
TextColor(Random(16)); Gotoxy(x,y);Write('O');
Delay(100);
if (x=5)or(x=50)or(y=5)or(y=20) then c:=#27;
Until c=#27;gotoxy(20,55);Write('A játéknak vége !');
Repeat Until Keypressed;End.
-
axioma
veterán
válasz magortaltos #3286 üzenetére
1. miert ezt? engem anno basicben is a reszeg tengeresszel tanitottak (jo, azt csak neztuk, nem iranyitottuk), de az csak az elso lepes
2. miert lenne nehez? en ugyan sose irtam ilyen programot, de akar lepesenkent a full tablazat kirakasa se hiszem hogy bonyolitja az erthetoseget es lassu se lesz mar miatta - es me'g az adat es megjelenites szetvalasztas is szep csondben ott van tanulsagnak...
3. miert python? erettsegire pont a kepernyot nem kell tudni kezelni, csak adatokat, ha meg jatekos algotanitas a cel akkor vannak celszerszamok (gyerekoktato "ide"-k), grafikus dobozok huzigatasaval, minecraft-ban is meg most pont nem jut eszembe a masiknak a neve
szigoruan szvsz! -
-
Csaby25
senior tag
-
-
magortaltos
csendes tag
Lehet, hogy alkalmatlan a python egy ilyen egyszerű programocska megírására.....?
-
sztanozs
veterán
válasz magortaltos #3299 üzenetére
Mármint?
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...
Új hozzászólás Aktív témák
- Intel Core i5 / i7 / i9 "Alder Lake-Raptor Lake/Refresh" (LGA1700)
- Villanyszerelés
- Milyen légkondit a lakásba?
- DIGI műholdas TV
- A fociról könnyedén, egy baráti társaságban
- Mr Dini: Ha szeretnéd rootolni az LG Smart TV-d, tedd meg most!
- Debian GNU/Linux
- LEGO klub
- Azonnali informatikai kérdések órája
- VR topik (Oculus Rift, stb.)
- További aktív témák...