Thanks for the help everyone. For now I'm going to stick with the read()/split() combination as the performance turns out to be acceptable (eg. 360KB read, split, and parsed into tuples, in less than 0.07 seconds), but I now have some good ideas if this ever becomes a problem. -- Ben Sizer http://pages.eidosnet.co.uk/kylotan