[Python-ideas] Add pathlib.Path.write_json and pathlib.Path.read_json
Wes Turner
wes.turner at gmail.com
Mon Mar 27 17:27:33 EDT 2017
On Mon, Mar 27, 2017 at 10:34 AM, Chris Barker <chris.barker at noaa.gov>
wrote:
> On Mon, Mar 27, 2017 at 7:59 AM, Paul Moore <p.f.moore at gmail.com> wrote:
>
>> On 27 March 2017 at 15:40, Ram Rachum <ram at rachum.com> wrote:
>> > Another idea: Maybe make json.load and json.dump support Path objects?
>>
>> If they currently supported filenames, I'd say that's a reasonable
>> extension. Given that they don't, it still seems like more effort than
>> it's worth to save a few characters
>>
>
> Sure, but they probably should -- it's a REALLY common (most common)
> use-case to read and write JSON from a file. And many APIs support
> "filename or open file-like object".
>
> I'd love to see that added, and, or course, support for Path objects as
> well.
>
https://docs.python.org/2/library/json.html#encoders-and-decoders
# https://docs.python.org/2/library/json.html#json.JSONEncoder
class PathJSONEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, pathlib.Path):
return unicode(obj) # ? (what about bytes)
return OrderedDict((
('@type', 'pydatatypes:pathlib.Path'), # JSON-LD
('path', unicode(obj)), )
return json.JSONEncoder.default(self, obj)
# https://docs.python.org/2/library/json.html#json.JSONDecoder
def as_pathlib_Path(obj):
if obj.get('@type') == 'pydatatypes:pathlib.Path':
return pathlib.Path(obj.get('path'))
return obj
def read_json(self, **kwargs):
object_pairs_hook = kwargs.pop('object_pairs_hook',
collections.OrderedDict) # OrderedDefaultDict
object_hook = kwargs.pop('object_hook', as_pathlib_Path)
encoding = kwargs.pop('encoding', 'utf8')
with codecs.open(self, 'r ', encoding=encoding) as _file:
return json.load(_file,
object_pairs_hook=object_pairs_hook,
object_hook=object_hook,
**kwargs)
def write_json(self, obj, **kwargs):
kwargs['cls'] = kwargs.pop('cls', PathJSONEncoder)
encoding = kwargs.pop('encoding', 'utf8')
with codecs.open(self, 'w', encoding=encoding) as _file:
return json.dump(obj, _file, **kwargs)
def test_pathlib_json_encoder_decoder():
p = pathlib.Path('./test.json')
obj = dict(path=p, _path=str(unicode(p)))
p.write_json(obj)
obj2 = p.read_json()
assert obj['path'] == obj2['path']
assert isinstance(obj['path'], pathlib.Path)
https://github.com/jaraco/path.py/blob/master/path.py#L735
open()
bytes()
chunks()
write_bytes()
text()
def write_text(self, text, encoding=None, errors='strict',
linesep=os.linesep, append=False):
lines()
write_lines()
read_hash()
read_md5()
read_hexhash()
>
> -CHB
>
>
>
>
> --
>
> Christopher Barker, Ph.D.
> Oceanographer
>
> Emergency Response Division
> NOAA/NOS/OR&R (206) 526-6959 voice
> 7600 Sand Point Way NE (206) 526-6329 fax
> Seattle, WA 98115 (206) 526-6317 main reception
>
> Chris.Barker at noaa.gov
>
> _______________________________________________
> Python-ideas mailing list
> Python-ideas at python.org
> https://mail.python.org/mailman/listinfo/python-ideas
> Code of Conduct: http://python.org/psf/codeofconduct/
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20170327/3687e9bd/attachment.html>
More information about the Python-ideas
mailing list