Major Differences:
- Low level access to files is unbuffered
- Low level access is not portable
- Low level allows more fine grained control, e.g. whether to block or not to block upon read
Use cases for low level io:
- The file is a block device
- The file is a socket
- The file is a tty
- ...
In all these cases you might wish to have that more fine grained control (over buffering and blocking behavior).
You probably never will need the low level functions for regular files. I think most of the time the use case will be some device driver stuff. However, this would better be done in C. But I can see the use case for python as well, e.g. for fast prototyping of device drivers.