This is the file that i am trying to read (it is a longer list with more bodies):
Sun 332946.0 0.0 0.0 0.0 0.0 0.0 0.0
Mercury 0.055 0.3598570518147997 -0.06132511797541504 -0.03811110768962459 -0.000716045178241433 0.02901045859848441 0.002432467783842063
Venus 0.815 -0.3935053177409041 -0.6082860993904631 0.01457222641991683 0.01684066443595474 -0.01108032188877406 -0.001122023332246253
It is supposed to be read as a label,mass, array of position, array of velocity. This done by:
def new_particle(input_handle):
"""
Initialises a Particle3D instance given an input file handle. This
function reads in a line in the file and spilts it into list items
where each is labels and initialised using the '__init__' method.
The input file should contain one line per particle in the following format:
<label> <mass> <pos> <y> <z> <vx> <vy> <vz>
:param inputFile: Readable file handle in the above format
:return Particle3D instance
"""
lines = input_handle.readline()
tokens = lines.split(" ")
label = str(tokens[0])
mass = float(tokens[1])
pos = np.array(tokens[2:5],float)
vel = np.array(tokens[5:8],float)
return Particle3D(label, mass, pos, vel)
and to read this file I have used this loop:
particle_list = []
with open(input("Enter file name: ")) as f:
# Reading the opened file that contains initial conditions
n = len(f.readlines())
for i in range(n):
particle_list.append(p3d.new_particle(f))
but i keep getting the error that the mass is list index out of range
Advertisement
Answer
You are consuming the file at this step
n = len(f.readlines())
f.readlines()
will move the pointer to EOF, so the next calls to f.readlines()
will be empty.
So, when you call again lines = input_handle.readlines()
it will be empty, same goes for tokens = lines.split(" ")
and that’s why accessing it will give you index out of range.
Try to iterate over the lines with this
particle_list = []
with open(input("Enter file name: ")) as f:
lines = f.readlines()
for line in lines:
particle_list.append(p3d.new_particle(line))
and change the method to take a line as input like this
def new_particle(line):
"""
Initialises a Particle3D instance given an input file handle. This
function reads in a line in the file and spilts it into list items
where each is labels and initialised using the '__init__' method.
The input file should contain one line per particle in the following format:
<label> <mass> <pos> <y> <z> <vx> <vy> <vz>
:param inputFile: Readable file handle in the above format
:return Particle3D instance
"""
tokens = line.split(" ")
label = str(tokens[0])
mass = float(tokens[1])
pos = np.array(tokens[2:5],float)
vel = np.array(tokens[5:8],float)
return Particle3D(label, mass, pos, vel)
Now each line is passed to the method and then split by space and your tokens
array should have values in it.