Reading a tab delimited text file.

S

Stephen

Hi,

I would like to read a text file of numbers produced by a data
acquisition system into three vectors of doubles. The contents of the
file are:

+0.0000000e+0 +2.7645134e+1 +2.7745625e+1

+0.4100041e-1 +2.7637787e+1 +2.7731047e+1

+0.0820008e+0 +2.7645134e+1 +2.7750483e+1
....

or

+0.0000000e+0\t+2.7645134e+1\t+2.7745625e+1\r\n
....

I would like to read the first column into time_vec, second into
ch1_vec and so on.

(I have never programmed in python and am having trouble finding a way
to do this).

Thanks
 
T

Tim Chase

I would like to read a text file of numbers produced by a data
acquisition system into three vectors of doubles. The contents of the
file are:

+0.0000000e+0 +2.7645134e+1 +2.7745625e+1
+0.4100041e-1 +2.7637787e+1 +2.7731047e+1
+0.0820008e+0 +2.7645134e+1 +2.7750483e+1
...

or

+0.0000000e+0\t+2.7645134e+1\t+2.7745625e+1\r\n
...

I would like to read the first column into time_vec, second into
ch1_vec and so on.

(I have never programmed in python and am having trouble finding a way
to do this).

Well, a very terse way of doing it would be something like:

time_vec, ch1_vec, and_so_on = zip(*(
map(float, line.split())
for line in file('in.txt')))

If my junior developer authored that, I'm not sure whether I'd
laud her or fire her. :)

If this isn't homework, there are some less terse versions which
are a bit easier on the eyes and less like some love-child
between Perl and Python.

-tkc
 
S

Stephen

Well, a very terse way of doing it would be something like:

   time_vec, ch1_vec, and_so_on = zip(*(
     map(float, line.split())
     for line in file('in.txt')))

If my junior developer authored that, I'm not sure whether I'd
laud her or fire her. :)

If this isn't homework, there are some less terse versions which
are a bit easier on the eyes and less like some love-child
between Perl and Python.

-tkc

haha, no this isn't homework. I'm a mechanical engineering student
working on a research project and this program is for my personal use
to analyze the data.
 
M

Mel

Stephen said:
Hi,

I would like to read a text file of numbers produced by a data
acquisition system into three vectors of doubles. The contents of the
file are:

+0.0000000e+0 +2.7645134e+1 +2.7745625e+1

+0.4100041e-1 +2.7637787e+1 +2.7731047e+1

+0.0820008e+0 +2.7645134e+1 +2.7750483e+1
...

or

+0.0000000e+0\t+2.7645134e+1\t+2.7745625e+1\r\n
...

I would like to read the first column into time_vec, second into
ch1_vec and so on.

(I have never programmed in python and am having trouble finding a way
to do this).

A simple starting point, without error handling, etc., could be:

a_list = []
b_list = []
c_list = []
for line in open ('my_numbers.txt', 'rt'):
a, b, c = [float (x) for x in line.split()]
a_list.append (a)
b_list.append (b)
c_list.append (c)

Assuming every line has three tab-separated numbers, the text versions of
the numbers are all convertable to float, the text file that's opened will
eventually be closed (whether by garbage collection or program
termination.)

This code does illustrate the string's split method, list comprehension,
sequence unpacking, and the fact that each of a_list, b_list, c_list *MUST*
be initialized with a distinct empty list object.

Mel.
 
T

Tim Chase

time_vec, ch1_vec, and_so_on = zip(*(
haha, no this isn't homework. I'm a mechanical engineering student
working on a research project and this program is for my personal use
to analyze the data.

The "zip-star map-float" variant is a pretty unreadable way to go.

The more readable versions look something like

data = [map(float, line.split()) for line in file('in.txt')]
time_vec = [bit[0] for bit in data]
ch1_vec = [bit[1] for bit in data]
and_so_on = [bit[2] for bit in data]

or even

time_vec = []
ch1_vec = []
and_so_on = []
for line in file('in.txt'):
a,b,c = map(float, line.split())
time_vec.append(a)
ch1_vec.append(b)
and_so_on.append(c)

which could also be written as

for line in file('in.txt'):
line = line.split()
time_vec.append(float(line[0]))
ch1_vec.append(float(line[1]))
and_so_on.append(float(line[2]))

-tkc
 
H

harijay

You could also use the csv module

import csv
myfileobj = open("myfiletab.txt","read")
csv_read = csv.reader(myfileobj,dialect=csv.excel_tab)
myval1 = []
myval2 = []
myval3 = []
for line in csv_read:
# filter header and stuff using some criterion
if len(line) = 3:
myval1.append(line[0])
myval2.append(line[1])
myval3.append(line[2])


etc etc . The csv module defines a dialect excel_tab. Each line is
then parsed into an array . You can insert that array into another
array and have an array line mydata = [ [line1],[line2] ...]

Hopw this helps
harijay

haha, no this isn't homework. I'm a mechanical engineering student
working on a research project and this program is for my personal use
to analyze the data.

The "zip-star map-float" variant is a pretty unreadable way to go.

The more readable versions look something like

   data = [map(float, line.split()) for line in file('in.txt')]
   time_vec = [bit[0] for bit in data]
   ch1_vec = [bit[1] for bit in data]
   and_so_on = [bit[2] for bit in data]

or even

   time_vec = []
   ch1_vec = []
   and_so_on = []
   for line in file('in.txt'):
     a,b,c = map(float, line.split())
     time_vec.append(a)
     ch1_vec.append(b)
     and_so_on.append(c)

which could also be written as

   for line in file('in.txt'):
     line = line.split()
     time_vec.append(float(line[0]))
     ch1_vec.append(float(line[1]))
     and_so_on.append(float(line[2]))

-tkc

Another way would be to use the csv module .

import csv
f = file.open("mytabfile.txt"
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,768
Messages
2,569,574
Members
45,050
Latest member
AngelS122

Latest Threads

Top