如何将os.stat_result转换为JSON对象?

hlswsv35  于 5个月前  发布在  其他
关注(0)|答案(4)|浏览(66)

我知道json.dumps可以用来将变量转换为JSON表示。遗憾的是,python3的类os.stat_result的转换是一个由表示类示例值的数组组成的字符串。

>>> import json
>>> import os
>>> json.dumps(os.stat('/'))
'[16877, 256, 24, 1, 0, 0, 268, 1554977084, 1554976849, 1554976849]'

字符串
不过,我更喜欢让它将os.stat_result转换为JSON对象。我如何才能实现这一点?
似乎麻烦的是,os.stat_result没有一个.__dict__的东西。
看到这样的结果:

>>> import os
 >>> str(os.stat('/'))
 'os.stat_result(st_mode=16877, st_ino=256, st_dev=24, st_nlink=1, st_uid=0, st_gid=0, st_size=268, st_atime=1554977084, st_mtime=1554976849, st_ctime=1554976849)'


这让我希望有一种快速的方法可以将python类示例(例如“os.stat_result”)转换为JSON表示,即对象。
虽然是JSON,但结果是

bqucvtff

bqucvtff1#

如GST所述,手动将是:

def stat_to_json(fp: str) -> dict:
    s_obj = os.stat(fp)
    return {k: getattr(s_obj, k) for k in dir(s_obj) if k.startswith('st_')}

字符串

6tr1vspr

6tr1vspr2#

然而,我更喜欢让它将os.stat_result转换为JSON对象。我如何才能实现这一点?
如果JSON的意思是有一个带有st_modest_ino等键的字典,那么答案是..手动。

c0vxltue

c0vxltue3#

使用“prevaled”键列表:

# http://thepythoncorner.com/dev/writing-a-fuse-filesystem-in-python/

def dict_of_lstat(lstat_res):
  lstat_keys = ['st_atime', 'st_ctime', 'st_gid', 'st_mode', 'st_mtime', 'st_nlink', 'st_size', 'st_uid', 'st_blocks']
  return dict((k, getattr(lstat_res, k)) for k in lstat_keys)

lstat_dict = dict_of_lstat(os.lstat(path))

def dict_of_statvfs(statvfs_res):
  statvfs_keys = ['f_bavail', 'f_bfree', 'f_blocks', 'f_bsize', 'f_favail', 'f_ffree', 'f_files', 'f_flag', 'f_frsize', 'f_namemax']
  return dict((k, getattr(statvfs_res, k)) for k in statvfs_keys)

statvfs_dict = dict_of_statvfs(os.statvfs(path))

字符串
k.startswith('st_')过滤器更长但更快

jrcvhitl

jrcvhitl4#

我知道这篇文章很老了,但我不喜欢任何答案,所以这里是我的函数,可以将stat结果转换为字典(可以通过json.dumps加载):

import os

def stat_to_dict(filestat):
    if type(filestat) == os.stat_result:
        returnval = {}
        for stat in dir(filestat):
            if stat[:3] == 'st_':
                returnval[stat] = getattr(filestat, stat)
        return returnval
    else:
        raise ValueError(f'argument must be os.stat_result not {type(filestat)}')

def statdict(filepath):
    return stat_to_dict(os.stat(filepath))

字符串

相关问题