writelines puzzle

Peter Otten __peter__ at web.de
Wed Aug 22 13:44:02 EDT 2012


William R. Wing (Bill Wing) wrote:

> In the middle of a longer program that reads and plots data from a log
> file, I have added the following five lines (rtt_data is fully qualified
> file name):
> 
> wd = open(rtt_data, 'w')
> stat = wd.write(str(i))
> stat = wd.writelines(str(x_dates[:i]))
> stat = wd.writelines(str(y_rtt[:i]))
> wd.close()
> 
> The value of i is unknown before I have read through the input log file,
> but is typically in the neighborhood of 2500.  x_dates is a list of time
> stamps from the date2num method, that is values of the form
> 734716.72445602, day number plus decimal fraction of a day.  y_rtt is a
> list of three- or four-digit floating point numbers.  The x_dates and
> y_rtt lists are complete and plot correctly using matplotlib.  Reading and
> parsing the input log file and extracting the data I need is time
> consuming, so I decided to save the data for further analysis without the
> overhead of reading and parsing it every time.
> 
> Much to my surprise, when I looked at the output file, it only contained
> 160 characters.  Catting produces:
> 
> StraylightPro:Logs wrw$ cat RTT_monitor.dat
> 2354[ 734716.72185185  734716.72233796  734716.72445602 ..., 
> 734737.4440162
>   734737.45097222  734737.45766204][ 240.    28.5   73.3 ...,   28.4  
>   27.4   26.4]
> 
> Clearly I'm missing something fundamental about using the writelines
> method, and I'm sure it will be a DUH moment for me, but I'd sure
> appreciate someone telling me how to get that data all written out.  I
> certainly don't insist on writelines, but I would like the file to be
> human-readable.

When you apply str() to a numpy array big arrays are helpfully truncated, 
probably because the functionality is meant to be used in the interactive 
interpreter rather than to write to a file.
The default value is 1000 entries. One way to get the desired output is to 
increase the threshold:

>>> numpy.set_printoptions(threshold=4)
>>> print numpy.arange(10)
[0 1 2 ..., 7 8 9]
>>> numpy.set_printoptions(threshold=10)
>>> print numpy.arange(10)
[0 1 2 3 4 5 6 7 8 9]

Also, in

file.writelines(some_str)

writelines iterates over the characters of the some_string, so you should 
instead write the above as

file.write(some_str)

Your code will become 

assert numpy.get_printoptions()["threshold"] >= i
wd.write(str(x_dates[:i]))

If you intended to write one array entry at a time with writelines() here's 
how to do that:

wd.write("[")
wd.writelines("%s " % x for x in x_dates[:i])
wd.write("]\n")

numpy.savetxt() may also suit your needs.




More information about the Python-list mailing list