Hoe data toevoegen aan CSV bestand volgens kolom oriëntatie?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Jokiehints
  • Registratie: Februari 2019
  • Laatst online: 02-04-2024
Met de code hieronder:
Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import csv
import os

kolom = 'geb_dag'
waarde = 19

file = 'data.csv'
header = not os.path.exists(file)

with open('data.csv', 'a', newline='') as csvfile:
    fieldnames = ['kolom', 'waarde']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)

    if header:
        writer.writeheader()
    writer.writerow({'kolom': kolom, 'waarde': waarde})
Voeg ik gegevens toe aan bestand: 'data.csv'.
Dit bestand ziet er daarna als volgt uit:

=================================================
kolom,waarde
geb_dag,19
=================================================

I gebruik deze code een aantal keer in mijn programma. Na een aantal maal ziet het bestand er als volgt uit:

================================================
kolom,waarde
geb_dag,19
geb_mnd, 10
geb_jr, 1981
vnaam, 2
anaam, 5
=================================================

Ik wil de gegevens in het csv bestand graag 'horizontaal' opnemen,
zoals hieronder staat aangegeven:

==================================================================
geb_dag, geb_mnd, geb_jr, vnaam, anaam,
19, 10, 1981, 2, 5
==================================================================

Ik vraag mij af Is dit mogelijk is met csv? Ik heb gegoogled en fora nageplozen, maar ik ben dit item niet tegengekomen. Als het kan, hoe moet dit dan in python gecodeerd moet worden?
Graag uw reacties.

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 12-09 10:03

Creepy

Tactical Espionage Splatterer

(jarig!)
Ja dat kan. Als je kijkt naar de writer.writeheader en de writer.writerow functies, hoe zou je het dan zelf aanpakken? Met even logisch nadenken denk ik dat je zelf zo de oplossing kan maken ;)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • vso
  • Registratie: Augustus 2001
  • Niet online

vso

tja...

Je kan het op 2 manieren doen,

De huidige CVS per regel inlezen en als "string" behandelen, en dan een 2de string eraan toevoegen
Of je kan elke waarde apart inlezen en een extra waarde toevoegen.

Klopt ook dat je het niet direct zal vinden, maar als je "add colum to csv file" of iets dergelijks zoekt zal je wellicht meer hits vinden. het is meer het truckje dat je zoekt ;)

Tja vanalles


Acties:
  • 0 Henk 'm!

  • incaz
  • Registratie: Augustus 2012
  • Laatst online: 15-11-2022
@Jokiehints, ik denk dat vooral de variabele-namen ('kolom' en 'waarde') je op het verkeerde been zetten. Je krijgt precies wat je vraagt, alleen is het niet wat je wilt. Als je probeert het te zien als een regel (row) die je weg wilt schrijven in je csv wordt het misschien duidelijker?

Probeer het ook eens met de hand: wat verwacht je dat 'writeRow()' doet en wat wil je wegschrijven?

@vso, dat slaat helemaal nergens op, lijkt een reactie die alleen op de titel is en niet op de startpost, en het idee om een string te lezen en dan iets eraan toevoegen is zelfs een ontzettend slecht idee.

Never explain with stupidity where malice is a better explanation


Acties:
  • 0 Henk 'm!

  • vso
  • Registratie: Augustus 2001
  • Niet online

vso

tja...

incaz schreef op woensdag 27 februari 2019 @ 21:16:
@Jokiehints, ik denk dat vooral de variabele-namen ('kolom' en 'waarde') je op het verkeerde been zetten. Je krijgt precies wat je vraagt, alleen is het niet wat je wilt. Als je probeert het te zien als een regel (row) die je weg wilt schrijven in je csv wordt het misschien duidelijker?

Probeer het ook eens met de hand: wat verwacht je dat 'writeRow()' doet en wat wil je wegschrijven?

@vso, dat slaat helemaal nergens op, lijkt een reactie die alleen op de titel is en niet op de startpost, en het idee om een string te lezen en dan iets eraan toevoegen is zelfs een ontzettend slecht idee.
Je reactie is ook niet super handig, Als je iemand verbeterd doe het dan niet half.
Overgens hoe je het bestand maakt is niet belangrijk zeker niet in het begin, als je maar beetje snapt hoe je het progammeert en dat op zichzelf uitvinden kan best een uitdaging zijn.

https://realpython.com/python-csv/ heeft hij meer aan.Waarin uitgelegd word hoe een csv tot stand komt en hoe je het behandeld.

Maar dan is het nog complexe materie, @Jokiehints is nu een plat tekst bestand aan het maken,
Toch is het handig(er) om met variabelen en string(s) te beginnen dan gelijk in array's te duiken.

ik zou eerst zelf een test bestand maken(zoals hij nu doet maar dan beter), vervolgens met een CSV import uitlezen op specifieke waardes en daarna pas een export maken met een csv export.

of ergens een betere handleiding zoeken ;)

Tja vanalles


Acties:
  • 0 Henk 'm!

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

DHH

Persoonlijk vind ik dataframes (pandas) een prettige manier van werken met tabellen (die dan ook weer makkelijk te exporteren zijn naar csv). Mocht je er niet uitkomen, dan is dat misschien nog een zijweg die beter bij je past (ook gezien je andere topics).

Acties:
  • +1 Henk 'm!

  • Jokiehints
  • Registratie: Februari 2019
  • Laatst online: 02-04-2024
@DHH Vreemd genoeg kostte mij relatief weinig moeite om dit probleem voor elkaar te krijgen met Pandas. Ik heb dus een werkende code hiervoor, maar dat vraagt nogal wat (verwerkings)tijd.
Ik heb uit eerdere topics begrepen dat het gebruik van pandas hetzelfde is als schieten met een kanon op een mug. Zeker als het in wezen om weinig data gaat. Daarom zocht ik een sneller alternatief met csv, maar dat lukt mij dus niet :?

  • incaz
  • Registratie: Augustus 2012
  • Laatst online: 15-11-2022
Je bent in principe bezig met een 2-dimensionale tabel die je wil vullen, en dat vullen doe je per regel, niet per kolom. Je bepaalt dus voor het hele bestand de kolommen, en daarna geef je iedere kolom per regel een waarde.

Dus, stel je hebt 2 kolommen, naam en gebdatum, dan krijg je de fieldnames gevuld met een array ["naam", "gebdatum"] en daarna ga je dat per regel invullen:
Python:
1
2
row = ['naam': "Jokiehints", 'gebdatum': "2019-02-18"]
writer.writerow( row )

De kolomnamen ('naam' en 'gebdatum') zijn hier vooral handig om je code begrijpelijk en leesbaar te houden, en komen daarom overeen met de fieldnames die je zet.

Heb je meer records, dan zijn die elk hun eigen regel / row, die je als geheel als wegschrijft.
Dan krijg je bv
Python:
1
2
3
for student in students:
   row = ['naam': student.naam, 'gebdatum': student.gebdatum]
   writer.writerow( row )


(Dit kan wellicht sneller als je student-object ook precies hetzelfde is als de regel. Dat hoeft niet altijd zo te zijn, soms is je object uitgebreider, of wil je dingen uitsplitsen of anders weergeven.)

Never explain with stupidity where malice is a better explanation


  • Jokiehints
  • Registratie: Februari 2019
  • Laatst online: 02-04-2024
@incaz Ik snap wat je zegt. Mijn probleem is nu dat ik niet voor het hele bestand de kolommen kan uitzetten, maar dat deze kolommen, naarmate het programma wordt doorlopen stapsgewijs toegevoegd worden.

Na 5 stappen ziet mijn mijn data.csv bestand er als volgt uit.
===================================================
kolom,waarde
geb_dag,19
geb_mnd, 10
geb_jr, 1981
vnaam, 2
anaam, 5
====================================================

Dus 5 x wordt dit bestand geopend en wordt er data naar geschreven. Dit wordt gedaan met 'a' = append
Python:
1
with open('data.csv', 'a', newline='') as csvfile:
Dit wil ik graag horizontaal krijgen, zoals ik hierboven aangeef. De reden voor de horizontale versie is omdat ik de data van meerdere personen in data.csv wil plaatsen, zodanig dat de data van een persoon op één regel komt te staan. Deze kan ik dan ook per regel uitlezen. Maar misschien is het toch handiger dit m.b.v. pandas te realiseren.

  • incaz
  • Registratie: Augustus 2012
  • Laatst online: 15-11-2022
Dan moet je je programma maken dat in plaats van schrijven naar het bestand, het een element toevoegt aan je regel/row-array, en die pas schrijven als je je array compleet hebt.

Never explain with stupidity where malice is a better explanation

Pagina: 1