[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