I've inherited a bit of python code that saves its output to a pickle with the following code:
def save_picklefile_and_close(self):
    pickle.dump({'p_index': self.p_index, 'p_val': self.p_val,
                 'z': self.z, 'w': self.w, 'nd': self.nd, 'nfg': self.nfg,
                 'lamb_scalar': self.lamb_scalar, 'PEAKSIZE': self.PEAKSIZE,
                 'N': self.N, 'S': self.S, 'F': self.F,
                 'FG': self.FG, 'q': self.q,
                 'pi': self.pi, 'phi': self.phi,
                 'p_scores': self.p_scores, 'w_scores': self.w_scores, 'z_scores': self.z_scores,
                 'likelihood': self.likelihood,
                 'p_true_val': self.p_true_val,
                 'p_true_index': self.p_true_index,
                 'w_true': self.w_true,
                 'phi_true': self.phi_true,
                 'pi_true': self.pi_true,
                 'z_true': self.z_true,
                 'z_true_per_data': self.z_true_per_data,
                 'data_for_debugging': self.data_for_debugging,
                 }, self.picklefile)
    self.picklefile.close()
This looks to me like a pickled dict, which there are plenty of examples of online. All of the keys are in the pickle file, e.g. grep 'w_true' file.p returns a match. But when I try to read the pickle with this code:
f = open('file.p')
p = pickle.load(f)
print "type=", type(p)
print "shape=", p.shape
print "w_true=", p.w_true
all I get is a single numpy.ndarray:
type= <type 'numpy.ndarray'>
shape= (56, 147)
w_true=
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-39-83ddd085f0fd> in <module>()
      3 print "type=", type(p)
      4 print "shape=", p.shape
----> 5 print "w_true=", p.w_true
AttributeError: 'numpy.ndarray' object has no attribute 'w_true'
How do I access the other information in the pickle?
UPDATE: Yes, I'm definitely working with the same file. This modified code:
f = open('/path/to/file.p', mode='rt')
p = pickle.load(f)
print "type=", type(p)
print "shape=", p.shape
i = 0
for line in f:
    if 'w_true' in line:
        print "line no.", i, ":", line
    i += 1
Results in:
type= <type 'numpy.ndarray'>
shape= (56, 147)
line no. 7499 : sS'w_true'
But there's no reason the string w_true (and all of the other keys from the dict) should be in the file if it was only an ndarray, right? My only other thought is that maybe there's something in the pickle file header that's misleading the unpickler? I.e. maybe the output code is bugged? Here's the head of file.p:
$ head -n25 file.p 
cnumpy.core.multiarray
_reconstruct
p1
(cnumpy
ndarray
p2
(I0
tS'b'
tRp3
(I1
(I56
I147
tcnumpy
dtype
p4
(S'i4'
I0
I1
tRp5
(I3
S'<'
NNNI-1
I-1
I0
tbI00
