Read data from csv file

Hello,

I am working on a project where I would like to read data from a csv file using python mode. From what I can gather, I need to create a Reader, though I am uncertain how to do so (please note that I am a self taught coder). I am following the reference on the Processing site here (createReader() \ Language (API)), though it says that the example is broken. Also, I only want to access data from 3 columns of the csv file. Sample csv data is here:

 Thursday 2/4/2021 15:39:44	100	126	56
Thursday 2/4/2021 15:39:47	100	92	90
Thursday 2/4/2021 15:39:49	100	92	77
Thursday 2/4/2021 15:39:51	100	92	37
Thursday 2/4/2021 15:39:53	100	92	86
Thursday 2/4/2021 15:39:55	100	92	91

I only want to use data from the last three columns.

Here is what I have so far in my code:

import csv
filename = 'BiometricDataTest.csv'

def setup():
    size(1920, 1080)

    reader = csv.reader(open(filename),quoting=csv.QUOTE_NONNUMERIC)

def draw():
    background(255)
    #read data
    for row in reader:

And that is where I am stuck.

2 Likes

Although unmentioned on Python Mode’s own reference:

Processing’s API got some easier to use CSV methods like loadTable():

Using the Java Mode sketch from this link below as reference:

I did this simplified example which demos how to use loadTable() on Python Mode :

def setup():
    global t
    t = loadTable("data.csv", "header")

    for row in t.rows():
        x = row.getFloat("x")
        y = row.getFloat("y")
        d = row.getFloat("diameter")
        n = row.getString("name")

        print x, y, d, n

    exit()
3 Likes

I think that the @GoToLoop strategy is the way to go… but just for exploration I think the Python CSV strategy might have failed because of quoting=csv.QUOTE_NONNUMERIC

I made it work like this:

PS: I also added a global reader statement.

3 Likes

Hello, @fleshcircuit,

What would you like to do with the data? Since you created a large canvas, you probably wanted to display it in some fashion.

Here’s an example that simply displays it as text on a small canvas:

import csv
def setup():
    size(300, 240)
    textSize(24)
    fill(0)
    noLoop()
    background(255)
def draw():
    # get the data and store it in a list for later use
    t = csv.reader(open("BiometricDataTest.csv"), delimiter="\t")
    t_data = []
    for row in t:
        _day, _date, _time, x, y, z = row
        t_data.append([int(x), int(y), int(z)])
    # do something with the data
    for row, data in enumerate(t_data):
        text("{:03d} {:03d} {:03d}".format(data[0], data[1], data[2]), 20, (row + 1) * 32)

Biometric

Thanks for the tips everyone! I am using the data to manipulate shapes through an animation, such as altering acceleration and changing colour. I managed to get the upload using table and add it to list, though the code is clunky. I will try out these other suggestions to optimize it.

2 Likes

Since each specimen, or whatever kind of object each row represents, has several pieces of information associated with it, you may benefit from defining a class that can be instantiated to represent each object. This can help you organize your data.

The following assumes that each row represents data concerning a beetle specimen, but you can of course adapt the pattern to the true identity of your objects.

import csv
class Beetle(object):
    def __init__(self, specimen_number, weekday, date, time, abdomen_length, thorax_length, head_length):
        self.specimen_number = specimen_number
        self.weekday = weekday
        self.date = date
        self.time = time
        self.abdomen_length = abdomen_length
        self.thorax_length = thorax_length
        self.head_length = head_length

def setup():
    size(480, 240)
    noLoop()
    background(255)
def draw():
    # get and store the data
    t = csv.reader(open("BiometricDataTest.csv"), delimiter="\t")
    t_data = []
    for specimen_number, data in enumerate(t):
        weekday, date, time, abdomen_length, thorax_length, head_length = data
        beetle = Beetle(specimen_number, weekday, date, time, int(abdomen_length), int(thorax_length), int(head_length))
        t_data.append(beetle)
    # display the data
    fill(0)
    text("Eyed Elaters: Specimen Numbers and Head Lengths (cm)", 20, 20)
    for beetle in t_data:
        fill(255)
        bar_length = beetle.head_length * 4
        rect(20, (beetle.specimen_number + 1) * 32 + 10, bar_length, 20)
        fill(0)
        text("{:d}    {:d}".format(beetle.specimen_number, beetle.head_length), 8, (beetle.specimen_number + 1) * 32 + 25)

Eyed Elater Data

The head lengths are cited in the figure as being in centimeters. Eyed elaters aren’t really that large, though they are a large species among the click beetles.

EDIT (April 10, 2021):

For the record, actual eyed elaters (Alaus oculatus) are typically 25–45 millimeters (1.0–1.8 in) in length. See Wikipedia: Alaus oculatus.

eyed_elater_wildwood_june_25_2018_02_43_pm

Eyed Elater (Alaus oculatus)
Photo by Sandy Richard
Wildwood State Park, Wading River, NY, USA
June 25, 2018

2 Likes