@Dk: Thanks, I see what you mean. I corrected that, and as a diagnostic included a print statement in my first function so that I can see the list that is created for each of the 500 files (=500 lists on the screen). The list still comes back empty, and I'm not sure why? The scopes are fixed now and I know the code inside serializepipelinemodel works.
Hello Biostar community,
I have a small issue with a program that reads PDB files, extractes atomic coordinates, and then writes them to a list. I have structured my program with three functions, one for iteratively parsing ~500 PDB-like files from a directory and storing atomic coordinates in a list, one for iteratively appending the list created for each file to the existing one, and one for reading the list. The program looks as follows:
#!/usr/local/bin
import os,string
from sys import version
z_coords1 = [] # Global list variable that needs to be known to 3 function
def serialize_pipeline_model(f):
""" This function extracts the necessary atomic coords""""
....
.... BUNCH OF CODE
.... code to create z_coords1
return z_coords1
import pickle
def write_to_binary(z_coords1):
""" iteratively write successively generated z_coords1 to a binary file """
print '\nPickling z-coordinates list'
f = open("z_coords1.dat", "ab")
pickle.dump(z_coords1, f)
f.close()
return
def read_from_binary(z_coords1)
.... SAME AS write_to_binary except that I UNPICKLE the list
### LOOP OVER DIRECTORY
for f in os.listdir('/Users/spyros/Desktop/3NY8MODELSHUMAN/HomologyModels/'):
serialize_pipeline_model(f)
write_to_binary(z_coords1)
read_binary(z_coords1)
print '\n Z-VALUES FOR ALL CHARGED RESIDUES'
print z_coords1
When I run the program the unpickling returns an empty list. Strangely, when I check the binary file, z_coords1.dat it has been created in my directory, but it isn't being read correctly. Does anyone have any idea as to what is happening?
Many thanks for your time.
Best,
Spyros
1 answer
I think the problem is with zcoords1 arguments for your write/read binary functions. You don't need them since you are just using the global list you've declared. When you declared zcoords1 in those functions as arguments, it supercedes the global and essentially makes them a blank list in the scope of the function.
So just change the two functions so there are no arguments:
def write_to_binary():
def read_from_binary()
Log in to answer this question.
In the serializepipelinemodel function, are you modifying the zcoords1 list? Or is it returning new data. If it is returning new data, it doesn't look like you are placing it anywhere. If you are modifying the zcoords1 list and you are not clearing the list after every file, aren't you outputting incrementally larger files every iteration?
@Dk: I initialize the list at the top because it need to be global and build it at the end of the serializepiplinemodel() function. I don't modify it, just specify how its built (put together previously created lists - the code would be too verbose to post it!). Practically, I need to build 500 lists and merge them into one super-list (hence I write each list to a binary file after its created). Do I need to clear the list after each iteration for this? Sorry perhaps I didn't understand what you wrote, many thanks for your reply! Spyros