This will require internal changes to the library, and perhaps some API changes.
Relevant issues and pull requests:
I suspect the best solution to handle all of these cases is to break most of the code into functions that can be composed into different APIs. For example, there could be a function that reads the headers from a file object, an d a generator that reads records from a file object and we could write a new backwards compatible DBF class or another leaner API on top of these.
These smaller function would also be useful when writing debugging tools.