[Python] Nieuwe regel na elke row in for loop

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Mijn vraag

Ik heb een tabel in een MySQL database met een aantal kolommen waar een INT waarde in staat. Om per lijn alleen de waarde > 0 naar boven te halen heb ik onderstaand python script geschreven:

Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import pymysql

connection = pymysql.connect(host='127.0.0.1',
                             user='test',
                             password='test',
                             db='test',
                             cursorclass=pymysql.cursors.DictCursor)

while True:
    with connection.cursor() as cursor:
        sql = ("SELECT packingplan_id, BAG, BB1, BB2, BG, BOP, C08, C23, C24, CAF, CAR, CHA, DS2, E01, E02, KAR, LOT, P06, P12, PAC, PAQ, PK, S01, S02, S03, S04, S21, S93, SAC, SCH, ST FROM packingplan WHERE packingplan_id < 5")
        cursor.execute(sql)
        for row in cursor:
            for pack,qty in row.items():
                if int(qty) > 0:
                    print(qty, end = ", ")
    cmd = input('Press any key to continue. Enter \'q\' to quit!')
    if cmd == 'q':
        connection.close()
        break


met dit resultaat:
1, 10, 30, 1, 2, 10, 30, 1, 3, 10, 30, 1, 4, 10, 30, 1, Press any key to continue. Enter 'q' to quit!
(De dikgedrukte waardes zijn de packingplan_id) In dit voorbeeld heeft elke 'row' toevallig hetzelfde resultaat, in de praktijk kunnen de waardes en de aantallen results wisselen afhankelijk van de data per row.

Kern van mijn probleem
Nu krijg ik dus alle results op 1 regel maar eigenlijk wil ik per row (packingplan_id) het resultaat op een nieuwe regel zien

Relevante software en hardware die ik gebruik
Python3
MySQL
pymsql

Wat ik al gevonden of geprobeerd heb
Ik vermoed dat het ergens in de for loop mis gaat, op de een of andere manier krijg ik het niet duidelijk dat Python na elke row een \n moet plaatsen

als ik dit op regel 16 weghaal krijg ik alle waardes op een nieuwe regel en dat wil dan ook weer niet.
Python:
1
, end = ", ")


In de testfase heb ik in de SQL query 'WHERE packingplan_id <5' gezet, in praktijk heeft de tabel 64000 rows.

[ Voor 10% gewijzigd door Verwijderd op 14-02-2018 15:05 ]

Beste antwoord (via Verwijderd op 16-02-2018 14:40)


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op woensdag 14 februari 2018 @ 14:59:
Python:
1
2
3
4
        for row in cursor:
            for pack,qty in row.items():
                if int(qty) > 0:
                    print(qty, end = ", ")


[...]

als ik dit op regel 16 weghaal krijg ik alle waardes op een nieuwe regel en dat wil dan ook weer niet.
Python:
1
, end = ", ")
Dan bedenk eens goed wat je nou wil? Misschien helpt dit (pseudocode):

code:
1
2
3
4
5
6
7
8
for row in data {
    for field in row {
        if (field == "id" || row[field] > 0)
            print row[field] + ","
        }
    }
    print NEWLINE;
}

:?
Verwijderd schreef op woensdag 14 februari 2018 @ 14:59:
In de testfase heb ik in de SQL query 'WHERE packingplan_id <5' gezet, in praktijk heeft de tabel 64000 rows.
Daar heb je ene heel ander probleem van een hele andere orde... Je wil toch niet over 64.000 rows met elk 31 velden ( = 1.984.000 waardes) heen gaan itereren? Of is dit een eenmalig iets ofzo? Als ik jou was zou ik eens kijken of je de DB niet (een deel van) het tilwerk kunt laten doen; daar zijn DB's voor ;) De kans is alleen dat je een andere / slimmere query moet schrijven.

[ Voor 15% gewijzigd door RobIII op 14-02-2018 15:17 ]

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

Alle reacties


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

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op woensdag 14 februari 2018 @ 14:59:
Python:
1
2
3
4
        for row in cursor:
            for pack,qty in row.items():
                if int(qty) > 0:
                    print(qty, end = ", ")


[...]

als ik dit op regel 16 weghaal krijg ik alle waardes op een nieuwe regel en dat wil dan ook weer niet.
Python:
1
, end = ", ")
Dan bedenk eens goed wat je nou wil? Misschien helpt dit (pseudocode):

code:
1
2
3
4
5
6
7
8
for row in data {
    for field in row {
        if (field == "id" || row[field] > 0)
            print row[field] + ","
        }
    }
    print NEWLINE;
}

:?
Verwijderd schreef op woensdag 14 februari 2018 @ 14:59:
In de testfase heb ik in de SQL query 'WHERE packingplan_id <5' gezet, in praktijk heeft de tabel 64000 rows.
Daar heb je ene heel ander probleem van een hele andere orde... Je wil toch niet over 64.000 rows met elk 31 velden ( = 1.984.000 waardes) heen gaan itereren? Of is dit een eenmalig iets ofzo? Als ik jou was zou ik eens kijken of je de DB niet (een deel van) het tilwerk kunt laten doen; daar zijn DB's voor ;) De kans is alleen dat je een andere / slimmere query moet schrijven.

[ Voor 15% gewijzigd door RobIII op 14-02-2018 15:17 ]

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!

Verwijderd

Topicstarter
RobIII schreef op woensdag 14 februari 2018 @ 15:08:
[...]


Dan bedenk eens goed wat je nou wil? Misschien helpt dit (pseudocode):

code:
1
2
3
4
5
6
7
for row in data {
    for field in row {
        if (row[field] > 0)
            print row[field] + ",";
        }
    print NEWLINE;
}

:?


[...]

Daar heb je ene heel ander probleem van een hele andere orde...
Dit is het result wat ik wil
1, 10, 30, 1,
2, 10, 30, 1,
3, 10, 30, 1,
4, 10, 30, 1,
Press any key to continue. Enter 'q' to quit!
Wat ik eerder aangaf, als ik die
Python:
1
, end = ", ")
weghaal dan krijg ik dit resultaat, wat ik dus niet wil.
1
10
30
1
2
10
30
1
3
10
30
1
4
10
30
1
Press any key to continue. Enter 'q' to quit!

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op woensdag 14 februari 2018 @ 15:15:
Dit is het result wat ik wil
[...]
Wat ik eerder aangaf, als ik die [...] weghaal dan krijg ik dit resultaat, wat ik dus niet wil.
...en hoe helpt mijn (pseudo)code voorbeeld niet dan? Je herhaalt nu de vraag die me wel al duidelijk was ;)

[ Voor 4% gewijzigd door RobIII op 14-02-2018 15:18 ]

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!

Verwijderd

Topicstarter
RobIII schreef op woensdag 14 februari 2018 @ 15:15:
[...]

...en hoe helpt mijn (pseudo)code voorbeeld niet dan? Je herhaalt nu de vraag die me wel al duidelijk was ;)
Excuses, ik heb je verkeerd begrepen :)

Met je pseudo code ga ik aan de slag, het zal wel op zoiets uit moeten komen denk ik.

Wat betreft je edit: het betreft hier een eenmalige excercitie op een standalone database, runtime of efficientie maakt dus niet veel uit.

Acties:
  • 0 Henk 'm!

  • CurlyMo
  • Registratie: Februari 2011
  • Nu online
RobIII schreef op woensdag 14 februari 2018 @ 15:08:
[...]
De kans is alleen dat je een andere / slimmere query datamodel moet schrijven.
FTFY ;)

Sinds de 2 dagen regel reageer ik hier niet meer


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bedankt voor je input, heel nuttig.
Aangezien dit iets eenmaligs is besteed ik verder niet teveel aandacht aan wat er allemaal achter zit. Het enige waar ik niet uit kom is een for loop die niet het gewenste resultaat geeft.

Acties:
  • +1 Henk 'm!

  • CurlyMo
  • Registratie: Februari 2011
  • Nu online
Verwijderd schreef op woensdag 14 februari 2018 @ 15:32:
[...]


Bedankt voor je input, heel nuttig.
Aangezien dit iets eenmaligs besteed ik verder niet teveel aandacht aan wat er allemaal achter zit. Het enige waar ik niet uit kom is een for loop die niet het gewenste resultaat geeft.
Als je je tabel zo zou opbouwen:
code:
1
2
3
4
5
6
7
8
9
10
11
id | type | waarde
1  | BAG  | 1
1  | BB1  | 0
1  | BB2  | 0
1  | BG   | 1
1  | .... | ....
2  | BAG  | 1
2  | BB1  | 1
2  | BB2  | 0
2  | BG   | 0
2  | .... | ....

Dan heb je in no-time alle waardes groter dan 0 te pakken. Enige wat je nog in python doet in ze samenvoegen op één rij op id.

Daarmee los je ook het probleem op dat @RobIII beschrijft dat je overbodig veel rijen ophaalt naar python, want je filtert al op db niveau.

Sinds de 2 dagen regel reageer ik hier niet meer


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
CurlyMo schreef op woensdag 14 februari 2018 @ 15:41:
[...]

Als je je tabel zo zou opbouwen:
code:
1
2
3
4
5
6
7
8
9
10
11
id | type | waarde
1  | BAG  | 1
1  | BB1  | 0
1  | BB2  | 0
1  | BG   | 1
1  | .... | ....
2  | BAG  | 1
2  | BB1  | 1
2  | BB2  | 0
2  | BG   | 0
2  | .... | ....

Dan heb je in no-time alle waardes groter dan 0 te pakken. Enige wat je nog in python doet in ze samenvoegen op één rij op id.

Daarmee los je ook het probleem op dat @RobIII beschrijft dat je overbodig veel rijen ophaalt naar python, want je filtert al op db niveau.
Ik zal inderdaad nog eens met de leverancier van de data gaan praten, ik kom er met mijn roestige Python skills zo snel niet uit. Had verwacht dat ik met 10 minuten klaar zou zijn (zolang duurde het ook om tot dit te komen, aleen het debuggen pakt wat anders uit dan verwacht ;) )

Acties:
  • 0 Henk 'm!

  • CurlyMo
  • Registratie: Februari 2011
  • Nu online
Je kan er nog steeds met 10 minuten uitkomen als je weet te implementeren van @RobIII zegt. Of het de handigste weg is is een tweede.

Sinds de 2 dagen regel reageer ik hier niet meer


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb het vanmorgen maar zo opgelost, het werkt maar is waarschijnlijk verre van best practice ;)
Mijn collega is in ieder geval blij met de data (de text file weer via Excel in MySQL gezet)
Het hele scriptje is trouwens binnen 2 minuten klaar

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
import pymysql

connection = pymysql.connect(host='127.0.0.1',
                             user='test',
                             password='test',
                             db='test',
                             cursorclass=pymysql.cursors.DictCursor)

pid = 1
f = open("packingorder.txt","w")

while pid < 68401:
    with connection.cursor() as cursor: 
        sql = ("SELECT packingplanv2_id, ST, PAC, CAR, PK, BB1, SAC, PAQ, BAG, S01, S02, S03, KAR, S04, S21, CHA, LOT FROM packingplanv2 WHERE packingplanv2_id = %i" % (pid))
        cursor.execute(sql)
        for row in cursor:
            for pack,qty in row.items():
                if int(qty) > 0:
                    p = (pack,qty)
                    f.write(str(p))
        f.write('\n')
        pid += 1

f.close
print("done!")

Acties:
  • 0 Henk 'm!

  • SavageNL
  • Registratie: November 2001
  • Laatst online: 09-09 08:54
Mijn Python kennis is niet geweldig goed, maar voer je hier niet tot maximaal 68401 queries uit?
1 query met een loop moet hier toch verschrikkelijk veel beter zijn?

[ Voor 3% gewijzigd door SavageNL op 16-02-2018 11:19 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
SavageNL schreef op vrijdag 16 februari 2018 @ 11:18:
Mijn Python kennis is niet geweldig goed, maar voer je hier niet tot maximaal 68401 queries uit?
1 query met een loop moet hier toch verschrikkelijk veel beter zijn?
Klopt, maar mijn Python is tevens niet geweldig goed ;)
Zoals ik al aangaf is het verre van ideaal maar voor nu doet het wat het moet doen.

Misschien dat ik nog een keer wat verder ga prutsen maar het is een eenmalig iets (voor nu dan...)

Acties:
  • +1 Henk 'm!

  • Coffee2Code
  • Registratie: Juli 2011
  • Laatst online: 09:05
Ik zal morgen (straks...) even een stukje code uitwerken dat doet wat jij wil.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Anthraxium-64 schreef op maandag 5 maart 2018 @ 03:20:
Ik zal morgen (straks...) even een stukje code uitwerken dat doet wat jij wil.
Volgens mij is @Nathuran er inmiddels wel uit en anders geldt hier nog altijd:
Give a man a fish and feed him for a day. Teach a man how to fish and feed him for a lifetime.
Dus, nee, liever niet als 't even niet hoeft ;) Het is goedbedoeld hoor, maar mensen leren er zo weinig van ;)

[ Voor 6% gewijzigd door RobIII op 05-03-2018 10:19 ]

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!

Verwijderd

Topicstarter
RobIII schreef op maandag 5 maart 2018 @ 10:18:
[...]

Volgens mij is @Nathuran er inmiddels wel uit en anders geldt hier nog altijd:

[...]

Dus, nee, liever niet als 't even niet hoeft ;) Het is goedbedoeld hoor, maar mensen leren er zo weinig van ;)
Ja en nee.

Ik ben er inderdaad uit en heb het gewenste resultaat bereikt. Maar zoals ik zelf aan aangeef, op een manier die m.i. verre van optimaal is.
Het zou leerzaam zijn om een oplossing te zien van iemand die kennelijk wel weet hoe het werkt. Ik ben natuurlijk niet helemaal passief geweest in het vinden van mijn 'oplossing'.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op maandag 5 maart 2018 @ 11:00:
Het zou leerzaam zijn om een oplossing te zien van iemand die kennelijk wel weet hoe het werkt.
With all due respect, maar die staat hier al zonder 't je letterlijk voor te kauwen. Helaas ben je hier niet meer op teruggekomen en zie ik nergens waar je probleem dan precies nog zit nadat je die tip(s) hebt gehad.

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!

Verwijderd

Topicstarter
nevermind then, de volgende keer laat ik me wel affakkelen op stackoverflow

Acties:
  • 0 Henk 'm!

  • Falcon
  • Registratie: Februari 2000
  • Laatst online: 19:26

Falcon

DevOps/Q.A. Engineer

Stackoverflow is dan ook niet een Nederlands forum. Nederlanders zijn simpelweg straight to the point, niet lullen maar poetsen.

Gewoon je trots inslikken, luisteren en ervan leren hoort daar dan bij. Niks met affakkelen te maken.

* Falcon moest dit ook leren. ;)

[ Voor 5% gewijzigd door Falcon op 05-03-2018 11:31 ]

"We never grow up. We just learn how to act in public" - "Dyslexie is a bitch"


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op maandag 5 maart 2018 @ 11:26:
nevermind then, de volgende keer laat ik me wel affakkelen op stackoverflow
Het is jammer dat je dit ziet als een poging je de pis lauw te maken (waarom :? what's in it for me?) i.p.v. een poging je iets te leren. Voor mij is 't veruit de minste moeite om de code kant-en-klaar neer te plempen i.p.v. met jou (of eender wie) de discussie aan te gaan. Thank about it ;)

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!

  • Coffee2Code
  • Registratie: Juli 2011
  • Laatst online: 09:05
RobIII schreef op maandag 5 maart 2018 @ 11:34:
[...]

Het is jammer dat je dit ziet als een poging je de pis lauw te maken (waarom :? what's in it for me?) i.p.v. een poging je iets te leren. Voor mij is 't veruit de minste moeite om de code kant-en-klaar neer te plempen i.p.v. met jou (of eender wie) de discussie aan te gaan. Thank about it ;)
De code die ik neer ga plempen is geannoteerd met uitleg waarom ik wat doe en hoe het werkt.

Ik ben zelf iemand die leert van voorbeelden dus ik hoop er mee te laten zien hoe je het probleem op kan lossen terwijl er ook van geleerd wordt.

Of is dit nog steeds de verkeerde insteek?

Acties:
  • +1 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Anthraxium-64 schreef op maandag 5 maart 2018 @ 13:28:
Of is dit nog steeds de verkeerde insteek?
Laat mij je vooral niet tegenhouden, doe vooral wat je goed dunkt. Ik denk dat mijn mening hierover duidelijk is ;) Ik reageer(de) hier dan ook niet zo zeer als mod maar als medeforumgebruiker ;)

Overigens verwacht ik, op wat "annotaties" na dan, dat er geen wezenlijk verschil in zal zitten met mijn voorbeeldcode dus of 't wat toevoegt...

[ Voor 17% gewijzigd door RobIII op 05-03-2018 15:52 ]

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

Pagina: 1