[Python] Doorzoek bestand1 op basis van bestand2

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Remius
  • Registratie: April 2006
  • Laatst online: 18-03-2023
Mijn vraag
Wie kan mij helpen met het volgende Python script?
Ik wil een txt bestand doorzoeken op basis van woorden die in een ander txt bestand staan.
Ik heb twee bestanden:
- In bestandA staan personen, telefoonnummers en adressen.
- In bestandB staan enkel telefoonnummers (elke regel één).

Het is de bedoeling dat bestandA doorzocht wordt op basis van de telefoonnummers in bestandB, als een telefoonnummer uit bestandB gevonden wordt in bestandA, dan wil ik de gehele regel als output.

Als beginner kom ik niet veel verder dan onderstaande handmatige methode :|

Python:
1
2
3
4
5
f = open(bestandA,r)
search_words = [31612345678, 31609876543]
for line in f:
    if any(word in line for word in search_words):
        print(line)



...Relevante software en hardware die ik gebruik
...

Wat ik al gevonden of geprobeerd heb
Google! Ik zit al een uur te Googlen, maar ik kom er niet uit. :F

[ Voor 0% gewijzigd door RobIII op 28-03-2019 00:55 . Reden: Quote -> code tags ]

Alle reacties


Acties:
  • 0 Henk 'm!

  • DHH
  • Registratie: Augustus 2014
  • Laatst online: 07-09-2024

DHH

Je bent al heel aardig op weg, al moet je wel even op de indentation letten, want je code werkt op deze manier niet. Als dat gefixt is, werkt deze wel.

Eigenlijk heb je dus alleen nog een lijst nodig om de lijst 'search_words' te vullen met telefoonnummers uit bestandB.

Ik zou adviseren om eerst een (lege) lijst te maken met bijv. de naam 'telnrs' (telnrs= []). Vervolgens open je bestandB en lees je op vergelijkbare manier zoals je al doet met bestandA alle telefoonnummers uit en voegt deze toe (telnrs.append(line)) aan je nieuwe lijst 'telnrs'.

Vervolgens lees je bestandA en in plaats van de handmatig ingevulde 'search_words' zoek je nu naar je nieuwe lijst 'telnrs'.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
DHH schreef op donderdag 28 maart 2019 @ 00:33:
Je bent al heel aardig op weg, al moet je wel even op de indentation letten, want je code werkt op deze manier niet. Als dat gefixt is, werkt deze wel.
De indentation klopt wel, maar omdat TS de [quote] tag gebruikt i.p.v. code tags gaat de indentation verloren ;)

[ Voor 3% gewijzigd door RobIII op 28-03-2019 00:56 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Remius
  • Registratie: April 2006
  • Laatst online: 18-03-2023
DHH schreef op donderdag 28 maart 2019 @ 00:33:
Je bent al heel aardig op weg, al moet je wel even op de indentation letten, want je code werkt op deze manier niet. Als dat gefixt is, werkt deze wel.

Eigenlijk heb je dus alleen nog een lijst nodig om de lijst 'search_words' te vullen met telefoonnummers uit bestandB.

Ik zou adviseren om eerst een (lege) lijst te maken met bijv. de naam 'telnrs' (telnrs= []). Vervolgens open je bestandB en lees je op vergelijkbare manier zoals je al doet met bestandA alle telefoonnummers uit en voegt deze toe (telnrs.append(line)) aan je nieuwe lijst 'telnrs'.

Vervolgens lees je bestandA en in plaats van de handmatig ingevulde 'search_words' zoek je nu naar je nieuwe lijst 'telnrs'.
Thnx! Ik kom dan uit op onderstaande script. (@RobIII nu de juiste code gebruikt hopelijk ;) )
Python:
1
2
3
4
5
6
7
8
telnrs = []
bestandB = open("bestandB.txt","r")
for line in bestandB:
    telnrs.append(line)
f = open("bestandA.txt","r")
for line in f:
    if any(word in line for word in telnrs):
        print(line, file=open ("Output.txt","a"))

Ik heb een regel toegevoegd zodat de output naar een apart bestand wordt geschreven. Ik krijg een errors, maar ook geen resultaat, wat doe ik fout? :X

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Doel je op regel 8?
Nu ben ik geen Python kenner (dus ik zit er mogelijk compleet naast), maar... die regel ziet er uit alsof je maar wat steekwoorden achter elkaar hebt geplakt ofzo? Heb je een voorbeeld waar je die code vandaan hebt?

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Room42
  • Registratie: September 2001
  • Niet online
@Remius Dat snijdt niet heel veel hout, nee :P Check deze even voor wat praktische voorbeelden: https://www.guru99.com/re...ting-files-in-python.html

Wat jij nu doet is het printen van het resultaat van het openen van het bestand... niet heel spannend, denk ik ;)
Maar... je zit niet helemaal met lege handen. Je hebt wel een lege "Output.txt" in je werkdirectory :P

[ Voor 17% gewijzigd door Room42 op 28-03-2019 21:47 ]

"Technological advancements don't feel fun anymore because of the motivations behind so many of them." Bron


Acties:
  • 0 Henk 'm!

  • Remius
  • Registratie: April 2006
  • Laatst online: 18-03-2023
Haha ik heb 'regel 8' ergens online gevonden, maar regel 8 werkt prima in onderstaand script, dus ik denk 'die voeg ik gewoon toe' O-)
Python:
1
2
3
4
5
f = open("bestandA","r")
search_words = ['31612345678', '31609876543']
for line in f:
    if any(word in line for word in search_words):
        print(line, file=open ("output.txt","a"))

Acties:
  • +1 Henk 'm!

  • Room42
  • Registratie: September 2001
  • Niet online
Remius schreef op donderdag 28 maart 2019 @ 21:54:
Haha ik heb 'regel 8' ergens online gevonden, maar regel 8 werkt prima in onderstaand script, dus ik denk 'die voeg ik gewoon toe' O-)
Python:
1
2
3
4
5
f = open("bestandA","r")
search_words = ['31612345678', '31609876543']
for line in f:
    if any(word in line for word in search_words):
        print(line, file=open ("output.txt","a"))
Verklaar deze code nou eens? Wat doet elke regel, volgens jou? :?
edit:
Krijg nou de hik! Die print doet het nog ook! Dit is nieuw voor me :o 8)7
Hij lijkt me echter niet de meest optimale, performance wise...

[ Voor 12% gewijzigd door Room42 op 28-03-2019 22:06 ]

"Technological advancements don't feel fun anymore because of the motivations behind so many of them." Bron


Acties:
  • +1 Henk 'm!

  • Remius
  • Registratie: April 2006
  • Laatst online: 18-03-2023
Room42 schreef op donderdag 28 maart 2019 @ 22:00:
[...]

Verklaar deze code nou eens? Wat doet elke regel, volgens jou? :?
edit:
Krijg nou de hik! Die print doet het nog ook! Dit is nieuw voor me :o 8)7
Hij lijkt me echter niet de meest optimale, performance wise...
Haha toch mooi dat je van een leek als ik nog wat 'kan leren' ;). Ik zal je voorbeelden eens uitpluizen!

Edit: de laatste regel heb ik volgens mij hier vandaan

[ Voor 16% gewijzigd door Remius op 28-03-2019 23:02 ]


Acties:
  • 0 Henk 'm!

  • Sharkware
  • Registratie: November 2003
  • Laatst online: 00:29
Om niet het hele antwoord weg te geven:
Met onderstaande code kun je een nieuw bestand aanmaken voor schrijfacties, een string wegschrijven naar de file en de file uiteindelijk sluiten.

code:
1
2
3
4
5
filename = 'resultaat.txt'
resultfile = open(filename, 'w')
resultfile.write('Hello\n')
resultfile.write('World\n')
resultfile.close()


Voor de rest was je al goed op weg dus denk dat je er hiermee wel uit gaat komen.

[ Voor 10% gewijzigd door Sharkware op 29-03-2019 15:56 ]


Acties:
  • 0 Henk 'm!

  • u_nix_we_all
  • Registratie: Augustus 2002
  • Niet online
Maar waarom wil je dit met python doen, het kan ook in 1 regel vanaf de commandline
code:
1
for nr in $(cat bestandA); do grep $nr bestandB; done

Het kan wellicht nog simpeler met grep icm een input file

You don't need a parachute to go skydiving. You need a parachute to go skydiving twice.


Acties:
  • 0 Henk 'm!

  • ValHallASW
  • Registratie: Februari 2003
  • Niet online
Remius schreef op donderdag 28 maart 2019 @ 21:37:
Python:
1
2
3
telnrs = []
for line in bestandB:
    telnrs.append(line)
Print de inhoud van telnrs na deze for-loop eens uit, i.a.w.

Python:
1
print(telnrs)


Dan zie je denk ik snel genoeg waarom het niet werkt.

spoiler:
Het laatste teken van elk element is als het goed is een \n -- de newline die aan het eind van elke regel in het bestand staat. Newlines strippen kan met rstrip.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
u_nix_we_all schreef op vrijdag 29 maart 2019 @ 16:40:
Maar waarom wil je dit met python doen
Maar waarom wil je 't "met de commandline" doen? ;)
Sommige mensen zijn wat minder behandig daar in, anderen hebben liever een echte programmeertaal, weer anderen doen 't misschien wel in Excel. Smaken verschillen. Als iets nou su-per omslachtig is om te doen in X en je dan met een alternatief komt; a-la. Maar dat is hier niet echt aan de orde. Je zou het gros van de topics in de Devschuur kunnnen beantwoorden me "waarom niet in X?" ;)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • u_nix_we_all
  • Registratie: Augustus 2002
  • Niet online
RobIII schreef op vrijdag 29 maart 2019 @ 19:23:
[...]

Maar waarom wil je 't "met de commandline" doen? ;)
Sommige mensen zijn wat minder behandig daar in, anderen hebben liever een echte programmeertaal, weer anderen doen 't misschien wel in Excel. Smaken verschillen. Als iets nou su-per omslachtig is om te doen in X en je dan met een alternatief komt; a-la. Maar dat is hier niet echt aan de orde. Je zou het gros van de topics in de Devschuur kunnnen beantwoorden me "waarom niet in X?" ;)
Ja daar heb je wel een punt, er zijn vaak tig verschillende manieren om iets op te lossen.
Ik heb zelf bijvoorbeeld vaak de neiging om heel ingewikkelde dingen in shell-scripts te gaan doen terwijl dat in python met een paar regels code is op te lossen :P
Soms heb je gewoon een blinde vlek omdat je gewend ben om dingen op een bepaalde manier aan te pakken, en dan vind ik het wel fijn als iemand me een hint geeft om eens out of the box te denken.

Daarmee zeg ik niet dat dat hier aan de orde is, maar was dus wel benieuwd naar de context, waarom TS dit graag in python wil doen.

[ Voor 6% gewijzigd door u_nix_we_all op 29-03-2019 21:02 ]

You don't need a parachute to go skydiving. You need a parachute to go skydiving twice.


Acties:
  • +1 Henk 'm!

  • Remius
  • Registratie: April 2006
  • Laatst online: 18-03-2023
Bedankt allemaal voor de reacties! Ik ga binnenkort nog eens verder pielen.
Waarom Python vragen enkele zich af, naja simpel: ter lering en vermaak. Ik kan deze zoekslag ook maken via verticaal zoeken in Excel, maar het leek mij wel eens leuk en leerzaam deze te 'programmeren'. Ik heb vernomen dat Python relatief eenvoudig is, dus vandaar O-) .
Zojuist deze zoekslag gemaakt via 'grep' (Bash?) in de Terminal en dat ging wel verbazingwekkend simpel. Misschien moet ik me daar maar eens op focussen... >:)

Acties:
  • 0 Henk 'm!

  • Zeehond
  • Registratie: Juni 2015
  • Niet online

Zeehond

FP Admin & Powermod/ Mod W&M

Seal with it!

Remius schreef op donderdag 28 maart 2019 @ 21:54:
Haha ik heb 'regel 8' ergens online gevonden, maar regel 8 werkt prima in onderstaand script, dus ik denk 'die voeg ik gewoon toe' O-)
Python:
1
2
3
4
5
f = open("bestandA","r")
search_words = ['31612345678', '31609876543']
for line in f:
    if any(word in line for word in search_words):
        print(line, file=open ("output.txt","a"))
Nu open je voor elke keer dat je in de for loop komt "output.txt". Handiger is om dat bestand al voor de loop direct te openen. In de loop hoef je dan nog maar enkel de informatie naar het bestand te schrijven.

Python:
1
2
3
4
5
6
7
f = open("bestandA","r")
search_words = ['31612345678', '31609876543']
outputFile = open("output.txt", "a")
for line in f:
    if any(word in line for word in search_words)::
        outputFile.write(line)
outputFile.close()

[ Voor 4% gewijzigd door Zeehond op 02-04-2019 22:09 ]

Select * from fish

Pagina: 1