Francois Dion
Francois Dion

Reputation: 19

None column in csv (csv python module)

An instrument create a CVS with this on the file header :

XLabel,Wavenumber
YLabel,Response
FileType,Single Beam
DisplayDirection,20300
PeakDirection,20312
0.000000,-1.149420,-1.177183,-1.174535
0.964406,-1.053002,-1.083787,-1.069919
1.928811,-0.629619,-0.652436,-0.628358

I want to read this value with cvs python module.

import csv
expfile='test.csv'
with open(expfile) as csvfile:
    reader = csv.DictReader(csvfile)
    for row in reader:
        if (i<4):
            i += 1
        else:
            print(row)

The output is :

{None: ['-1.025449', '-1.049773'], 'XLabel': '0.000000', 'Wavenumber': '-1.012466'}
{None: ['-1.256103', '-1.297049'], 'XLabel': '0.964406', 'Wavenumber': '-1.254550'}
{None: ['-0.722499', '-0.754096'], 'XLabel': '1.928811', 'Wavenumber': '-0.735748'}

It is easy to get Xlabel or Wavenumber value :

print(row['XLabel'])

But how can I get the None value?

Upvotes: 0

Views: 1246

Answers (1)

Martijn Pieters
Martijn Pieters

Reputation: 1123520

Just use None as the key:

print(row[None])

None is simply the value for the restkey argument to DictReader(), and None is the default. You could set it to something else. It is the key into which any extra columns that don't have a fieldname are collected into, and in your case the fieldnames are taken from the first row in the file, which has only two fields.

A better option would be to explicitly pass in some fieldnames:

reader = csv.DictReader(csvfile, fieldnames=('Field1', 'Field2', 'Field3', 'Field4'))

because the first row of that format is not really suitable to act as labels for the columns past the first 5 rows. You can pick names that make sense for those 4 columns.

Note you'd have to skip 5 rows then, not 4. See Python CSV reader to skip 9 headers for an alternative technique where you don't have to keep a counter:

from itertools import islice
import csv

expfile='test.csv'

with open(expfile) as csvfile:
    reader = csv.DictReader(csvfile, fieldnames=('Field1', 'Field2', 'Field3', 'Field4'))
    next(islice(reader, 5, 5), None)
    for row in reader:
        print(row)

Upvotes: 2

Related Questions