zoeken binnen file.

classic Classic list List threaded Threaded
9 messages Options
Reply | Threaded
Open this post in threaded view
|

zoeken binnen file.

Johan Hendriks
Goedemiddag allemaal.

Ik heb twee vraagjes.

Ik ben na vele jaren afhoudend te zijn geweest met scripten toch maar
eens begonnen.
Na lang twijfelen heb ik dan gekozen om alles wat ik wil scripten in
python te gaan doen.

Nu heb ik mijzelf een projectje opgelegd, maar al gauw loop ik tegen het
een en ander aan.

Ik heb een bestand waar 1 tot 10 getallen in staan, dit ziet er zo uit.

200
100
80
45
46

Nu wil ik deze getallen opzoeken in files die in een directory staan.
Deze  bestanden bevatten allemaal één regel met BoxID="xx" waar xx dus
het getal is wat ik wil opzoeken. Eenmaal gevonden dan wil ik het
bestand geheel wegschrijven als getal.datum.xml

Wat mij nu niet lukt is om een string of variabele aan te maken en deze
te loopen door de bestanden.

Mijn gedachte was om het bestand te lezen, dan de zoekstring aan te
maken en dan door de bestanden te gaan en deze eruit zoeken.


Ik heb nu het volgende.


#!/usr/bin/env python
import os, string

# get box ID's to work with
with open("/root/scripts/boxid","r") as f:
     content = f.read()
     truck = content.split()
     print '\n'.join(boxid)

Dit geeft mij het volgende op het scherm.

200
100
80
45
46

Dus het inlezen van het bestand gaat goed, en ik heb dus als ik het goed
begrijp een list met 5 waardes.

# get number of boxid's
number = len(boxid)
print (number)

Dit gaat ook goed, hij geeft netjes het getal 5.

Maar nu wil ik dus zoeken op BoxID="200",  BoxID="100", BoxID="80",
BoxID="45" en BoxID="46"

#Create search strings!
#searchstring = ('BoxID="46"')
searchstring = "BoxID=\"boxid[3]\""
print searchstring

Hier gaat het mis.

De output van print search string is BoxID="boxid[3]"
Ik krijg het niet voor elkaar om daar BoxID="200" van te maken.

Als ik searchstring set op ('BoxID="46"') en dan verder ga met het
script, dan vind hij de bestanden waar deze regel in voor komt. en print
deze ook netjes op het scherm.

# read the XML files

path = "/usr/local/samba/data/XML"
for fname in os.listdir(path):
#    print fname    # dit werkt, en ik krijg alle bestanden te zien.
     document = os.path.join(path, fname)
     for line in open(document):
#        print document   # dit werkt ook, en dan zien ik alle bestanden
met het gehele pad
         if searchstring in line:
             print fname

Hoe kan ik de searchstring zo krijgen dat hij alle bestanden afloopt op
zoek naar BoxID=" < alle getallen uit het bestand > "

Het zal de leeftijd wel zijn, maar ben hier nu al een paar dagen mee
bezig, maar ik zie het niet helemaal zuiver meer. :D

Is er iemand die mij een klein beetje kan helpen.


Mijn tweede vraag is zijn er in Nederland gebruikers groepen die python
programmeer lessen geven, of zijn er lokale groepen of mensen die dit doen?

Alvast bedankt voor uw tijd, en mijn excuses als de mailing list hier
niet voor bedoeld is.

gr
Johan
_______________________________________________
Python-nl mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/python-nl
Reply | Threaded
Open this post in threaded view
|

Re: zoeken binnen file.

Jan Murre-2
Dag Johan,

Het gaat mis omdat je index (3 in dit geval) onderdeel is van de string, terwijl je wilt dat die dynamisch wordt. In python kan dat handig met de format method die hoort bij een string object:

i = 3
'BoxID=\"boxid[{}]"'.format(i)  # NB: de volledige string heeft enkel quotes, je kunt daarbinnen dan dubbele quotes gebruiken zonder te escapen.

Groet,

Jan




2014-04-25 16:28 GMT+02:00 Johan Hendriks <[hidden email]>:
Goedemiddag allemaal.

Ik heb twee vraagjes.

Ik ben na vele jaren afhoudend te zijn geweest met scripten toch maar eens begonnen.
Na lang twijfelen heb ik dan gekozen om alles wat ik wil scripten in python te gaan doen.

Nu heb ik mijzelf een projectje opgelegd, maar al gauw loop ik tegen het een en ander aan.

Ik heb een bestand waar 1 tot 10 getallen in staan, dit ziet er zo uit.

200
100
80
45
46

Nu wil ik deze getallen opzoeken in files die in een directory staan.
Deze  bestanden bevatten allemaal één regel met BoxID="xx" waar xx dus het getal is wat ik wil opzoeken. Eenmaal gevonden dan wil ik het bestand geheel wegschrijven als getal.datum.xml

Wat mij nu niet lukt is om een string of variabele aan te maken en deze te loopen door de bestanden.

Mijn gedachte was om het bestand te lezen, dan de zoekstring aan te maken en dan door de bestanden te gaan en deze eruit zoeken.


Ik heb nu het volgende.


#!/usr/bin/env python
import os, string

# get box ID's to work with
with open("/root/scripts/boxid","r") as f:
    content = f.read()
    truck = content.split()
    print '\n'.join(boxid)

Dit geeft mij het volgende op het scherm.

200
100
80
45
46

Dus het inlezen van het bestand gaat goed, en ik heb dus als ik het goed begrijp een list met 5 waardes.

# get number of boxid's
number = len(boxid)
print (number)

Dit gaat ook goed, hij geeft netjes het getal 5.

Maar nu wil ik dus zoeken op BoxID="200",  BoxID="100", BoxID="80", BoxID="45" en BoxID="46"

#Create search strings!
#searchstring = ('BoxID="46"')
searchstring = "BoxID=\"boxid[3]\""
print searchstring

Hier gaat het mis.

De output van print search string is BoxID="boxid[3]"
Ik krijg het niet voor elkaar om daar BoxID="200" van te maken.

Als ik searchstring set op ('BoxID="46"') en dan verder ga met het script, dan vind hij de bestanden waar deze regel in voor komt. en print deze ook netjes op het scherm.

# read the XML files

path = "/usr/local/samba/data/XML"
for fname in os.listdir(path):
#    print fname    # dit werkt, en ik krijg alle bestanden te zien.
    document = os.path.join(path, fname)
    for line in open(document):
#        print document   # dit werkt ook, en dan zien ik alle bestanden met het gehele pad
        if searchstring in line:
            print fname

Hoe kan ik de searchstring zo krijgen dat hij alle bestanden afloopt op zoek naar BoxID=" < alle getallen uit het bestand > "

Het zal de leeftijd wel zijn, maar ben hier nu al een paar dagen mee bezig, maar ik zie het niet helemaal zuiver meer. :D

Is er iemand die mij een klein beetje kan helpen.


Mijn tweede vraag is zijn er in Nederland gebruikers groepen die python programmeer lessen geven, of zijn er lokale groepen of mensen die dit doen?

Alvast bedankt voor uw tijd, en mijn excuses als de mailing list hier niet voor bedoeld is.

gr
Johan
_______________________________________________
Python-nl mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/python-nl


_______________________________________________
Python-nl mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/python-nl
Reply | Threaded
Open this post in threaded view
|

Re: zoeken binnen file.

Floris van Manen
In reply to this post by Johan Hendriks
Je hebt een folder met daarin een aantal bestanden en in elk bestand een aantal regels met op elke regel één getal?
Vervolgens wil je een lijst van alle bestanden en daarvan alle regels waarvan de waarde <= is aan een gegeven integer (float) waarde?

In dat geval zou je een dict kunnen maken met als sleutel de naam van het bestand en als value de lijst van de getallen in dat bestand.

Afhankelijk van het aantal keren dat je die data wilt doorzoeken, kun je er voor kiezen om de getallen als index te kiezen met als value een lijst van bestandsnamen.

.F


bijvoorbeeld:


#!/usr/bin/env python
# encoding: utf-8

import os
from collections import defaultdict

fv = defaultdict(list)
vf = defaultdict(list)

folder = 'tmp'
for fn in os.listdir(folder):
    ffn = os.path.sep.join([folder, fn])
    if fn.endswith('.txt'):
        with open(ffn, 'r') as fp:
            content = fp.readlines()
            values = [int(x) for x in content if x]
            print ffn
            print values
            fv[ffn].append( values)
            for v in values:
                vf[v].append( ffn )


print '='*20
print fv
print '='*20
print vf

print '='*20
zoek = 46
for k,v in vf.iteritems():
    if k <= zoek:
        print v







_______________________________________________
Python-nl mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/python-nl
Reply | Threaded
Open this post in threaded view
|

Re: zoeken binnen file.

Johan Hendriks
Ik heb een hele rits bestanden, en elk uur komen daar een paar 100 bij.
In elk van deze bestanden staat maar één regel met daarin BoxID="<nummer>"

Nu wil ik dus uit al deze bestanden bijvoorbeeld alleen de bestanden met
BoxID="30", maar morgen kan dit weer anders zijn en dan wil ik
bijvoorbeeld BoxID 90 en 200
Ik schrijf de nummers die ik wil hebben in het bestand boxid, dat is het
eerste stukje, die leest hij goed uit. Daarna wil ik het script laten
filteren op de daadwerkelijke bestanden en dus op de nummers die ik
opgegeven heb in het bestand boxid.

Ik hoop dat het wat duidelijker is... Maar ik ben er nu al zo lang mee
bezig dat ik door de bomen het bos niet meer zie...

Alvast bedankt voor het antwoord..





op 25-04-14 17:10, Floris van Manen schreef:

> Je hebt een folder met daarin een aantal bestanden en in elk bestand een aantal regels met op elke regel één getal?
> Vervolgens wil je een lijst van alle bestanden en daarvan alle regels waarvan de waarde <= is aan een gegeven integer (float) waarde?
>
> In dat geval zou je een dict kunnen maken met als sleutel de naam van het bestand en als value de lijst van de getallen in dat bestand.
>
> Afhankelijk van het aantal keren dat je die data wilt doorzoeken, kun je er voor kiezen om de getallen als index te kiezen met als value een lijst van bestandsnamen.
>
> .F
>
>
> bijvoorbeeld:
>
>
> #!/usr/bin/env python
> # encoding: utf-8
>
> import os
> from collections import defaultdict
>
> fv = defaultdict(list)
> vf = defaultdict(list)
>
> folder = 'tmp'
> for fn in os.listdir(folder):
>      ffn = os.path.sep.join([folder, fn])
>      if fn.endswith('.txt'):
>          with open(ffn, 'r') as fp:
>              content = fp.readlines()
>              values = [int(x) for x in content if x]
>              print ffn
>              print values
>              fv[ffn].append( values)
>              for v in values:
>                  vf[v].append( ffn )
>
>
> print '='*20
> print fv
> print '='*20
> print vf
>
> print '='*20
> zoek = 46
> for k,v in vf.iteritems():
>      if k <= zoek:
>          print v
>
>
>
>
>
>
>
> _______________________________________________
> Python-nl mailing list
> [hidden email]
> https://mail.python.org/mailman/listinfo/python-nl

_______________________________________________
Python-nl mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/python-nl
Reply | Threaded
Open this post in threaded view
|

Re: zoeken binnen file.

Albert Visser
In reply to this post by Johan Hendriks
Hoi Johan,

On Fri, 25 Apr 2014 16:28:15 +0200, Johan Hendriks  
<[hidden email]> wrote:

> Goedemiddag allemaal.
>

Je belangrijkste issues lijken me het samenstellen van de zoekstring en  
het aflopen van alle mogelijkheden bij het zoeken.

Zoals eerder verteld kun je een zoekstring opbouwen als zoekstring =  
'BoxID="{}".format(boxid)
Bij het doorlezen van het boxid bestand kun je een in plaats van de  
boxid's te printen een list opbouwen met alle dingen die je zoekt.
Bv.
with open("/root/scripts/boxid","r") as f:
     boxids = ['BoxID="{}".format(x.strip()) for x in f.readlines()]

Tijdens de lus waarin je de bestanden doorloopt kun je dan alle  
zoekstrings stuk voor stuk uitproberen:

for filename in all_files:
     found = False
     with open(filename) as f_in:
         for search in boxids:
             if search in f_in.read():
                 found = True
                 break
     if found:
         print(filename) # of wat je er dan ook mee wilt doen

Als dit te snel gaat: ik heb hier wat statements in elkaar geschoven, als  
je wilt kun je de langere versie ook krijgen.
Disclaimer: ik heb deze code niet getest dus of het werkt weet ik niet,  
het is meer bedoeld om je een idee te geven van hoe je dit kan aanpakken.
NB ik gebruik hier print(x) in plaats van print x, dat is omdat ik me heb  
aangewend om met Python 3 te werken; ik zou je aanraden om als je net  
begint dat niet met Python 2 te doen tenzij je daar een absoluut goede  
reden voor hebt.

>
>
> Mijn tweede vraag is zijn er in Nederland gebruikers groepen die python  
> programmeer lessen geven, of zijn er lokale groepen of mensen die dit  
> doen?
>

Geen idee maar mailing lijsten zoals deze zijn hier volgens mij bij  
uitstek geschikt voor. Als beginner zou je misschien ook Python-tutor  
kunnen proberen, maar dat is dan wel in het Engels.
Hou er rekening mee dat veel mensen liever je eigen code willen zien en  
daar advies over geven dan je programma's voor je schrijven - ik zeg  
altijd maar dat je meer leert van een paar keer iets fout doen dan van een  
"first-time right".


> Alvast bedankt voor uw tijd, en mijn excuses als de mailing list hier  
> niet voor bedoeld is.

Zie boven
>
> gr
> Johan
> _______________________________________________
> Python-nl mailing list
> [hidden email]
> https://mail.python.org/mailman/listinfo/python-nl


--
Vriendelijke groeten / Kind regards,

Albert Visser

Using Opera's mail client: http://www.opera.com/mail/
_______________________________________________
Python-nl mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/python-nl
Reply | Threaded
Open this post in threaded view
|

Re: zoeken binnen file.

Johan Hendriks
In reply to this post by Floris van Manen
op 25-04-14 17:10, Floris van Manen schreef:

> Je hebt een folder met daarin een aantal bestanden en in elk bestand een aantal regels met op elke regel één getal?
> Vervolgens wil je een lijst van alle bestanden en daarvan alle regels waarvan de waarde <= is aan een gegeven integer (float) waarde?
>
> In dat geval zou je een dict kunnen maken met als sleutel de naam van het bestand en als value de lijst van de getallen in dat bestand.
>
> Afhankelijk van het aantal keren dat je die data wilt doorzoeken, kun je er voor kiezen om de getallen als index te kiezen met als value een lijst van bestandsnamen.
>
> .F
>
>
> bijvoorbeeld:
>
>
> #!/usr/bin/env python
> # encoding: utf-8
>
> import os
> from collections import defaultdict
>
> fv = defaultdict(list)
> vf = defaultdict(list)
>
> folder = 'tmp'
> for fn in os.listdir(folder):
>      ffn = os.path.sep.join([folder, fn])
>      if fn.endswith('.txt'):
>          with open(ffn, 'r') as fp:
>              content = fp.readlines()
>              values = [int(x) for x in content if x]
>              print ffn
>              print values
>              fv[ffn].append( values)
>              for v in values:
>                  vf[v].append( ffn )
>
>
> print '='*20
> print fv
> print '='*20
> print vf
>
> print '='*20
> zoek = 46
> for k,v in vf.iteritems():
>      if k <= zoek:
>          print v
>
>
>
>
>
>
>
> _______________________________________________
> Python-nl mailing list
> [hidden email]
> https://mail.python.org/mailman/listinfo/python-nl
Niet helemaal ...

Ik heb een directory (/usr/local/samba/data/XML) met daarin enkele
files, en per uur komen hier een 100 tal files bij.
In ieder bestand in deze directory staat een regel met BoxID="xxx",waar
xxx een getal is tussen 0 en 999.
Nu wil ik deze bestanden filteren op BoxID  Soms heb ik er 1 nodig, soms
meerdere. en het kan zijn dat er meerdere bestanden zijn met hetzelfde
BoxID.
Nu dacht ik als ik een bestand aanmaak (/root/scripts/boxid) en ik zet
daar de nummers in die ik wil dan ben ik klaar.

Echter lukt dat nog niet helemaal, of beter gezegd helemaal niet. Blijkt
toch even wat anders te gaan dan gedacht.

Ik ga ook met de antwoorden van de andere even aan de slag..

Alvast bedankt allemaal.

gr
Johan
_______________________________________________
Python-nl mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/python-nl
Reply | Threaded
Open this post in threaded view
|

Re: zoeken binnen file.

Floris van Manen
In reply to this post by Johan Hendriks

On 25 Apr 2014, at 17:20, Johan Hendriks <[hidden email]> wrote:

> k heb een hele rits bestanden, en elk uur komen daar een paar 100 bij.
> In elk van deze bestanden staat maar één regel met daarin BoxID="<nummer>"

Bedoel je dat er meer regels in het bestand staan, maar slecht één die begint met
BoxID="
?

En je wilt het <nummer> in het bestand koppelen aan de naam van het bestand?


.F
_______________________________________________
Python-nl mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/python-nl
Reply | Threaded
Open this post in threaded view
|

Re: zoeken binnen file.

Johan Hendriks
Ieder bestand is uniek, en bevat maar 1 regel met BoxID="xxx"
In het bestand /root/scripts/boxid vul ik in welke boxid bestanden ik wil.
bijvoorbeeld box id 46 en 163
Dan is het bestand boxid voorzien van deze twee getallen. Nu was mijn
gedachte dat ik deze twee getallen inlees en dan de bestanden doorzoek
op BoxID="46" en BoxID="163"
Als ik deze gevonden heb, dan wil ik ze wegkopieren of heroemen naar een
bestands naam met id.

Maar het hele sorteer process is al een hele kluif voor mijn script
kunsten :(

gr
Johan



op 25-04-14 23:42, Floris van Manen schreef:

> On 25 Apr 2014, at 17:20, Johan Hendriks <[hidden email]> wrote:
>
>> k heb een hele rits bestanden, en elk uur komen daar een paar 100 bij.
>> In elk van deze bestanden staat maar één regel met daarin BoxID="<nummer>"
> Bedoel je dat er meer regels in het bestand staan, maar slecht één die begint met
> BoxID="
> ?
>
> En je wilt het <nummer> in het bestand koppelen aan de naam van het bestand?
>
>
> .F
> _______________________________________________
> Python-nl mailing list
> [hidden email]
> https://mail.python.org/mailman/listinfo/python-nl

_______________________________________________
Python-nl mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/python-nl
Reply | Threaded
Open this post in threaded view
|

Re: zoeken binnen file.

Johan Hendriks
In reply to this post by Albert Visser

op 25-04-14 18:36, albert visser schreef:

> Hoi Johan,
>
> On Fri, 25 Apr 2014 16:28:15 +0200, Johan Hendriks
> <[hidden email]> wrote:
>
>> Goedemiddag allemaal.
>>
>
> Je belangrijkste issues lijken me het samenstellen van de zoekstring
> en het aflopen van alle mogelijkheden bij het zoeken.
>
> Zoals eerder verteld kun je een zoekstring opbouwen als zoekstring =
> 'BoxID="{}".format(boxid)
> Bij het doorlezen van het boxid bestand kun je een in plaats van de
> boxid's te printen een list opbouwen met alle dingen die je zoekt.
> Bv.
> with open("/root/scripts/boxid","r") as f:
>     boxids = ['BoxID="{}".format(x.strip()) for x in f.readlines()]
>
> Tijdens de lus waarin je de bestanden doorloopt kun je dan alle
> zoekstrings stuk voor stuk uitproberen:
>
> for filename in all_files:
>     found = False
>     with open(filename) as f_in:
>         for search in boxids:
>             if search in f_in.read():
>                 found = True
>                 break
>     if found:
>         print(filename) # of wat je er dan ook mee wilt doen
>
> Als dit te snel gaat: ik heb hier wat statements in elkaar geschoven,
> als je wilt kun je de langere versie ook krijgen.
> Disclaimer: ik heb deze code niet getest dus of het werkt weet ik
> niet, het is meer bedoeld om je een idee te geven van hoe je dit kan
> aanpakken.
> NB ik gebruik hier print(x) in plaats van print x, dat is omdat ik me
> heb aangewend om met Python 3 te werken; ik zou je aanraden om als je
> net begint dat niet met Python 2 te doen tenzij je daar een absoluut
> goede reden voor hebt.
>
>>
>>
>> Mijn tweede vraag is zijn er in Nederland gebruikers groepen die
>> python programmeer lessen geven, of zijn er lokale groepen of mensen
>> die dit doen?
>>
>
> Geen idee maar mailing lijsten zoals deze zijn hier volgens mij bij
> uitstek geschikt voor. Als beginner zou je misschien ook Python-tutor
> kunnen proberen, maar dat is dan wel in het Engels.
> Hou er rekening mee dat veel mensen liever je eigen code willen zien
> en daar advies over geven dan je programma's voor je schrijven - ik
> zeg altijd maar dat je meer leert van een paar keer iets fout doen dan
> van een "first-time right".
>
>
>> Alvast bedankt voor uw tijd, en mijn excuses als de mailing list hier
>> niet voor bedoeld is.
>
> Zie boven
>>
>> gr
>> Johan
>> _______________________________________________
>> Python-nl mailing list
>> [hidden email]
>> https://mail.python.org/mailman/listinfo/python-nl
>
>
Dankzij jullie aanwijzingen is het mij dan toch gelukt, en ik zag het
eigenlijk al niet echt meer zitten :D

Het was even stoeien, maar de aanhouder wint..
De prints tussen door deed ik om te kijken of er ook daadwerkelijk iets
uit kwam.
bijvoorbeeld print content gaf mij op een gegeven moment
"123
"
Zo kwam ik er dus achter dat er een return mee kwam. na wat googlen kun
je die dus weghalen met rstrip()
Het is erg leuk om zo bezig te zijn, maar soms heb je net even het zetje
in de juiste richting nodig.


Uiteindelijk is het script als volgt geworden.

#!/usr/bin/env python
import os, string

# get boxid's

with open("/root/scripts/boxid","r") as f:
     content = f.read().rstrip("\n")
     boxid = content.split()

# read the XML files

path = "/usr/local/samba/data/XML"

for fname in os.listdir(path):
     document = os.path.join(path, fname)
     for line in open(document):
          for i in range(len(boxid)):
              searchstring = 'BoxID="{}"'.format(boxid[i])
              if searchstring in line:
                  print document, searchstring

Het bestand /root/scripts/boxid bevat het volgende :
49
46
149
123

Na het uitvoeren van het script ziet het er als volgt uit.

FreeBSD-thuis scripts # ./ggsecurity.py
/usr/local/samba/data/XML/RXL0061361833.xml', 'BoxID="123"
/usr/local/samba/data/XML/RXL0061361560.xml', 'BoxID="123"
/usr/local/samba/data/XML/RXL0061361243.xml', 'BoxID="123"
/usr/local/samba/data/XML/RXL0061360944.xml', 'BoxID="123"
/usr/local/samba/data/XML/RXL0061360652.xml', 'BoxID="123"
/usr/local/samba/data/XML/RXL0061346439.xml', 'BoxID="46"
/usr/local/samba/data/XML/RXL0061380738.xml', 'BoxID="123"
/usr/local/samba/data/XML/RXL0061380409.xml', 'BoxID="123"
/usr/local/samba/data/XML/RXL0061380106.xml', 'BoxID="123"
/usr/local/samba/data/XML/RXL1670876746.xml', 'BoxID="46"
/usr/local/samba/data/XML/1656754454544.xml', 'BoxID="49"
/usr/local/samba/data/XML/1556467754332.xml', 'BoxID="149"

Nu is het tijd om te gaan slapen....
Van de week weer verder om er wat meer acties aan vast te knopen zoals
het verplaatsen en hernoemen van de gevonden bestanden.

Ik wil jullie allemaal heel erg bedanken voor jullie tijd om mij op het
goede spoor te zetten.

gr
Johan
_______________________________________________
Python-nl mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/python-nl