FIX: Raise NotImplementedError if user passes an open file handle to write #442
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
As indicated in #430 and geopandas #3369, if a user passed an open file handle to write, we were failing with confusing error messages. While the docstrings in pyogrio specify the allowed inputs, we weren't strictly verifying those, and so any path that was not BytesIO was first getting cast to a string, and then failing badly from there.
These usages worked for users with the Fiona engine (previous default) in GeoPandas, so it is proving to be a point of confusion now that Pyogrio is the default engine and things are no longer working as expected.
In most cases, writing the dataset to BytesIO and then writing those bytes to the file handle (regular file handle via
open
, an fsspec opened file handle, or an open handle within aZipFile
), so the error message includes a brief instruction to do that instead. That also helps defer catching issues around supported drivers and lack of append support to the BytesIO handler.In the mid term, we may be able to detect that the user passed a writeable file handle, and wrap in BytesIO ourselves, but this is more involved than I had time to take on at the moment.