Python probleem

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • iantje31
  • Registratie: April 2013
  • Laatst online: 17-12-2023
Hallo,

Ik ben voor mijn opleiding met een kleine python opdracht bezig, alleen gebeurd er iets heel raars.
Ik moet een soort systeempje voor een zorginstelling waarbij ze vanaf een csv bestand klantgegevens op kunnen roepen. Het moet voor zowel patiënten als artsen beschikbaar zijn. De arts heeft toegang tot alle gegevens. Maar de patiënt alleen tot zijn eigen.
Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import csv
import sys
with open('patientgegevens.csv') as csvfile: 
    readCSV = csv.reader(csvfile, delimiter= ';')
    gegevens = []
    for row in readCSV:
        gegevens.insert(0,row)
with open('artsen.csv') as csvfile:
    readCSVarts = csv.reader(csvfile, delimiter= ';')
    gegevens_artsen = []

    for row in readCSVarts:
        gegevens_artsen.insert(0,row)


def dossier_systeem():
    global gegevens
    
    uitvoerprogramma = True
    uitvoerintro = True
    if uitvoerintro == True:
        print('Welkom bij eHealthSysT')
        print('Wilt u als patiënt inloggen, druk op 1')
        print('Wilt u als arts inloggen, druk op 2')
        global keuze_ap
        keuze_ap = int(input('Kies een optie: '))
        
    if keuze_ap == 1:
        intro = False
        print('Inloggen als patiënt: ')
        gebruikersnaam = input('Voer hier uw gebruikersnaam in: ')
        wachtwoord = input('Voer hier uw wachtwoord in: ')
        intro = False
        controle = True
        i = -1
        j = len(gegevens)
        while i != j - 1 and controle == True:
            i = i + 1
            if gebruikersnaam == gegevens[i][8] and wachtwoord == gegevens[i][9]:
                print("Gebruikersnaam en wachtwoord kloppen! U bent ingelogd!")
                controle = False
                doorgaan = True


            doorgaan = True
            while doorgaan:
                print("Hallo", gegevens[i][0], ", Welkom in het eHealthSysT")
                print("Wat wilt u doen?")
                print("Druk op 1 om uw bestaande dossier in te zien")
                print("Druk op 2 om gegevens aan uw dossier toe te voegen")
                print("Druk op 3 om gegevens in uw dossier aan te passen")
                print("Druk op 4 om te stoppen")
                keuze = int(input("Maak hier uw keuze: "))

Ik ben met deze code begonnen. Zodra een patiënt zijn inloggegevens invoert begint de waarde i zich op te tellen tot de juiste patiënt is gevonden. Daarna staat de waarde vast en kan ik deze gebruiken om de juiste rij te laten printen. Alleen heb ik een probleem.
De i waarde die ik toewijs blijft op een wonderbaarlijke wijze vast staan op 4. Bij alle inloggegevens die ik invoer wordt de 4e patiënt uit het bestand uitgeprint. Ik heb echt geen idee waardoor dit komt.
Zou iemand weten wat dit probleem veroorzaakt?

[ Voor 0% gewijzigd door MueR op 25-01-2016 15:12 . Reden: code tags ]

Steam: iantje31 | AMD Ryzen 7 5800X, 32 GB 3600MHz RAM, MSI GTX 1080 8G Gaming Edition

Beste antwoord (via iantje31 op 28-01-2016 15:52)


  • narotic
  • Registratie: Maart 2002
  • Laatst online: 02-11-2021
De code zoals je hem gepaste hebt klopt sowieso niet. Je while doorgaan: loop staat in je while i != j - 1 and controle == True loop, maar buiten de [i]if gebruikersnaam == gegevens[i][8] and wachtwoord == gegevens[9]: conditie. Ter voorbeeld: we beginnen met i op -1, in de eerste regel van de loop wordt i=0 door de increment. Vervolgens controleer je of gebruikersnaam en wachtwoord overeenkomen met de gegevens van patient 0. Als dit het geval is, print je een regel en daarna de gegevens. Als dit niet het geval is, dan print je alsnog de gegevens van patient 0 omdat doorgaan sowieso True is. Vervolgens zet je doorgaan niet meer op False, dus je blijft oneindig vast zitten in de while doorgaan: loop en komt er dus nooit meer aan toe om de gebruikersnaam en wachtwoord met de rest van de gebruikers in gegevens te controleren.

Bedoelde je letterlijk dat i=4? Of dat je de gegevens van de 4e gebruiker in je CSV krijgt? Dat laatste geval zou kunnen als er in totaal 4 gebruikers zijn, omdat je gegevens in omgekeerde volgorde opbouwt tov je CSV file, je voegt namelijk elke nieuwe regel in de file in het begin van de gegevens list (gegevens.insert(0,row). Je kunt daar beter gegevens.append(row) schrijven, zodat de volgorde in je CSV file ook in gegevens bewaard blijft.

De suggesties ter verbetering van Coyota zijn al goed, maar ik zou willen toevoegen dat een for-loop hier waarschijnlijk wat netter is dan een while, zodat je niet zelf i hoeft op te hogen. Daarnaast is heeft het geen voordeel om j = len(gegevens) op te slaan, helemaal omdat je het maar 1 keer gebruikt.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    if keuze_ap == 1:
        print('Inloggen als patiënt: ')
        gebruikersnaam = input('Voer hier uw gebruikersnaam in: ')
        wachtwoord = input('Voer hier uw wachtwoord in: ')
        gevonden = False
        for i in range(len(gegevens)):
            if gebruikersnaam == gegevens[i][8] and wachtwoord == gegevens[i][9]:
                gevonden = True
                break

        if gevonden:
            print("Gebruikersnaam en wachtwoord kloppen! U bent ingelogd!")
            print("Hallo", gegevens[i][0], ", Welkom in het eHealthSysT")
            print("Wat wilt u doen?")
            print("Druk op 1 om uw bestaande dossier in te zien")
            print("Druk op 2 om gegevens aan uw dossier toe te voegen")
            print("Druk op 3 om gegevens in uw dossier aan te passen")
            print("Druk op 4 om te stoppen")
            keuze = int(input("Maak hier uw keuze: "))

        else:
            raise StandardError('Gebruikersnaam en wachtwoord niet gevonden')


Ik heb ook even alle overige variabelen weggehaald die iig in dit stukje code verder geen zin hadden.

Voor de fun, twee code-golf benadering:
code:
1
2
3
4
try:
    i = [(row[8], row[9]) for row in gegevens].index((gebruikersnaam, wachtwoord))
except ValueError:
    raise StandardError('Gebruikersnaam en wachtwoord niet gevonden')


of als de id niet uitmaakt:
code:
1
2
3
4
try:
    dossier = [row for row in gegevens if row[8] == gebruikersnaam and row[9] == wachtwoord][0]
except IndexError:
    raise StandardError('Gebruikersnaam en wachtwoord niet gevonden')


Ter verduidelijking, deze laatste oplossingen zijn puur om het zo compact mogelijk (en cryptisch) op te lossen. Het kan leerzaam zijn om ze proberen te begrijpen, maar je moet het niet als de "juiste" oplossing zien. Bij goede code is in 1 oogopslag duidelijk wat het doet, wat hier natuurlijk niet het geval is.

[ Voor 3% gewijzigd door narotic op 26-01-2016 00:15 ]

- = Step Into The Pit | Industrial Strength = -

Alle reacties


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Ik ben voor mijn opleiding met een kleine python opdracht bezig, alleen gebeurd er iets heel raars.
Je verliest ineens de kunde om foutloos werkwoorden te vervoegen? Dat is wel heel raar ja.
Het moet voor zowel patiënten als artsen beschikbaar zijn. De arts heeft toegang tot alle gegevens. Maar de patiënt alleen tot zijn eigen.
Volgens mij zijn de csv-files voor iedereen beschikbaar.

Ipv "controle" kun je break gebruiken, zie https://docs.python.org/3/tutorial/controlflow.html Daarmee wordt je code inzichtelijker.

Waarom twee keer "doorgaan = True"?

Acties:
  • 0 Henk 'm!

  • iantje31
  • Registratie: April 2013
  • Laatst online: 17-12-2023
GlowMouse schreef op maandag 25 januari 2016 @ 14:34:
[...]

Je verliest ineens de kunde om foutloos werkwoorden te vervoegen? Dat is wel heel raar ja.

[...]

Volgens mij zijn de csv-files voor iedereen beschikbaar.

Ipv "controle" kun je break gebruiken, zie https://docs.python.org/3/tutorial/controlflow.html Daarmee wordt je code inzichtelijker.

Waarom twee keer "doorgaan = True"?
Ik zit pas in het eerste jaar van mijn opleiding, dus ben nog erg slecht met coderen, ik ben nog wat aan het rondkloten met mijn code maar dit is het enige probleem dat ik heb

Steam: iantje31 | AMD Ryzen 7 5800X, 32 GB 3600MHz RAM, MSI GTX 1080 8G Gaming Edition


Acties:
  • +1 Henk 'm!

  • Coyota
  • Registratie: Februari 2012
  • Laatst online: 07-07 22:48
Uw 2de while functie is overbodig tot zover dit stuk van de code gaat natuurlijk.
Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
i = 0
while i < len(gegevens):
    if gebruikersnaam == gegevens[i][8] and wachtwoord == gegevens[i][9]:
        print("Gebruikersnaam en wachtwoord kloppen! U bent ingelogd!")
        print("Hallo", gegevens[i][0], ", Welkom in het eHealthSysT")
        print("Wat wilt u doen?")
        print("Druk op 1 om uw bestaande dossier in te zien")
        print("Druk op 2 om gegevens aan uw dossier toe te voegen")
        print("Druk op 3 om gegevens in uw dossier aan te passen")
        print("Druk op 4 om te stoppen")
        keuze = int(input("Maak hier uw keuze: "))
        break

    i = i + 1


Je begint bij index 0 en leest de gegevens uit. Hierna tel je er 1 bij op.
Dit is een stuk duidelijker vind ik persoonlijker.
De break op het einde van de if zorgt ervoor dat de while niet meer wordt uitgevoerd, waardoor hij dus niet meer controleert op de login gegevens.

Wat beter zou zijn dat de print na de While gebeurt, zo is dit wat overzichtelijker + beter gescheiden van de rest.
Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
i = 0
while i < len(gegevens):
    if gebruikersnaam == gegevens[i][8] and wachtwoord == gegevens[i][9]:
        break

    i = i + 1

print("Gebruikersnaam en wachtwoord kloppen! U bent ingelogd!")
print("Hallo", gegevens[i][0], ", Welkom in het eHealthSysT")
print("Wat wilt u doen?")
print("Druk op 1 om uw bestaande dossier in te zien")
print("Druk op 2 om gegevens aan uw dossier toe te voegen")
print("Druk op 3 om gegevens in uw dossier aan te passen")
print("Druk op 4 om te stoppen")
keuze = int(input("Maak hier uw keuze: "))

Acties:
  • Beste antwoord
  • +1 Henk 'm!

  • narotic
  • Registratie: Maart 2002
  • Laatst online: 02-11-2021
De code zoals je hem gepaste hebt klopt sowieso niet. Je while doorgaan: loop staat in je while i != j - 1 and controle == True loop, maar buiten de [i]if gebruikersnaam == gegevens[i][8] and wachtwoord == gegevens[9]: conditie. Ter voorbeeld: we beginnen met i op -1, in de eerste regel van de loop wordt i=0 door de increment. Vervolgens controleer je of gebruikersnaam en wachtwoord overeenkomen met de gegevens van patient 0. Als dit het geval is, print je een regel en daarna de gegevens. Als dit niet het geval is, dan print je alsnog de gegevens van patient 0 omdat doorgaan sowieso True is. Vervolgens zet je doorgaan niet meer op False, dus je blijft oneindig vast zitten in de while doorgaan: loop en komt er dus nooit meer aan toe om de gebruikersnaam en wachtwoord met de rest van de gebruikers in gegevens te controleren.

Bedoelde je letterlijk dat i=4? Of dat je de gegevens van de 4e gebruiker in je CSV krijgt? Dat laatste geval zou kunnen als er in totaal 4 gebruikers zijn, omdat je gegevens in omgekeerde volgorde opbouwt tov je CSV file, je voegt namelijk elke nieuwe regel in de file in het begin van de gegevens list (gegevens.insert(0,row). Je kunt daar beter gegevens.append(row) schrijven, zodat de volgorde in je CSV file ook in gegevens bewaard blijft.

De suggesties ter verbetering van Coyota zijn al goed, maar ik zou willen toevoegen dat een for-loop hier waarschijnlijk wat netter is dan een while, zodat je niet zelf i hoeft op te hogen. Daarnaast is heeft het geen voordeel om j = len(gegevens) op te slaan, helemaal omdat je het maar 1 keer gebruikt.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    if keuze_ap == 1:
        print('Inloggen als patiënt: ')
        gebruikersnaam = input('Voer hier uw gebruikersnaam in: ')
        wachtwoord = input('Voer hier uw wachtwoord in: ')
        gevonden = False
        for i in range(len(gegevens)):
            if gebruikersnaam == gegevens[i][8] and wachtwoord == gegevens[i][9]:
                gevonden = True
                break

        if gevonden:
            print("Gebruikersnaam en wachtwoord kloppen! U bent ingelogd!")
            print("Hallo", gegevens[i][0], ", Welkom in het eHealthSysT")
            print("Wat wilt u doen?")
            print("Druk op 1 om uw bestaande dossier in te zien")
            print("Druk op 2 om gegevens aan uw dossier toe te voegen")
            print("Druk op 3 om gegevens in uw dossier aan te passen")
            print("Druk op 4 om te stoppen")
            keuze = int(input("Maak hier uw keuze: "))

        else:
            raise StandardError('Gebruikersnaam en wachtwoord niet gevonden')


Ik heb ook even alle overige variabelen weggehaald die iig in dit stukje code verder geen zin hadden.

Voor de fun, twee code-golf benadering:
code:
1
2
3
4
try:
    i = [(row[8], row[9]) for row in gegevens].index((gebruikersnaam, wachtwoord))
except ValueError:
    raise StandardError('Gebruikersnaam en wachtwoord niet gevonden')


of als de id niet uitmaakt:
code:
1
2
3
4
try:
    dossier = [row for row in gegevens if row[8] == gebruikersnaam and row[9] == wachtwoord][0]
except IndexError:
    raise StandardError('Gebruikersnaam en wachtwoord niet gevonden')


Ter verduidelijking, deze laatste oplossingen zijn puur om het zo compact mogelijk (en cryptisch) op te lossen. Het kan leerzaam zijn om ze proberen te begrijpen, maar je moet het niet als de "juiste" oplossing zien. Bij goede code is in 1 oogopslag duidelijk wat het doet, wat hier natuurlijk niet het geval is.

[ Voor 3% gewijzigd door narotic op 26-01-2016 00:15 ]

- = Step Into The Pit | Industrial Strength = -


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
iantje31 schreef op maandag 25 januari 2016 @ 14:10:
De i waarde die ik toewijs blijft op een wonderbaarlijke wijze vast staan op 4. Bij alle inloggegevens die ik invoer wordt de 4e patiënt uit het bestand uitgeprint. Ik heb echt geen idee waardoor dit komt.
Zou iemand weten wat dit probleem veroorzaakt?
Zo wonderbaarlijk is dat niet. Als je gewoon met een debugger door de code heen zou stappen zou je al zien waarom dat zo is. Ik zou je dus vooral aanraden om eens wat uitgebreider te debuggen. Juist als je nog niet zo bedreven bent in programmeren levert dat een hoop inzicht op over hoe het programma werkt.

Lees ook eens onze Debugging FAQ door.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Amanush
  • Registratie: Mei 2012
  • Laatst online: 18-06 09:30

Amanush

Saai persoon.

GlowMouse schreef op maandag 25 januari 2016 @ 14:34:
[...]

Je verliest ineens de kunde om foutloos werkwoorden te vervoegen? Dat is wel heel raar ja.
*snip*
Lees jij dan even onze Policy m.b.t. replies in 'slechte' topics door? Doe voortaan gewoon even een Topic Report (klik op 'Afbeeldingslocatie: http://tweakimg.net/g/forum/images/icons/icon_hand.gif rapporteer' bovenaan een topic). Dank u :Y) ;)

[ Voor 41% gewijzigd door RobIII op 26-01-2016 20:20 ]

Ga tot de luiaard, gij mier! Zie haar wegen en wordt wijs.


Acties:
  • 0 Henk 'm!

  • u_nix_we_all
  • Registratie: Augustus 2002
  • Niet online
Ik zou bijna roepen, lees je eerst eens in in wat de eisen zijn voor een systeem waarin patiëntgegevens opgeslagen worden. Want een csv bestandje, met plaintext wachtwoorden, dat kan IMHO echt niet. Zeker niet bij medische gegevens. Misschien is de opdracht wel een test om te kijken hoe je met deze problematiek omgaat. Ergens hoop ik daar een beetje op, anders is die opleiding raar bezig, die zouden je dat namelijk eerst moeten leren IMHO.

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


Acties:
  • 0 Henk 'm!

  • roughtodacore
  • Registratie: Februari 2012
  • Laatst online: 08:48
Misschien gebruiken ze eerst een .CSV bestand ter vervanging van een database oid, om zodoende eerst programmeer logica aan te leren? Hij is immers eerste jaars student

Alles kan, zolang het maar mogelijk is...

Pagina: 1