如何序列化scandir.目录在Python中用于通过网络套接字发送?

2024-04-29 11:42:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我有服务器和客户机程序,它们通过网络套接字相互通信。在

我想要的是通过套接字发送从scandir.scandir()获取的目录项(scandir.DirEntry)。在

目前,我正在使用picklecPickle模块,并提出了以下内容(仅摘录):

import scandir, pickle

s = scandir.scandir("D:\\PYTHON")
entry = s.next()
data = pickle.dumps(entry)

但是,我得到了以下错误堆栈:

^{pr2}$

我怎样才能消除这个错误?在

我听说过使用marshall或{}。 UPDATEJSON没有转储对象中的所有数据。在

有没有完全不同的方法通过套接字发送对象?在

提前谢谢你的帮助。在


Tags: 模块对象import程序网络服务器目录客户机
2条回答

是的,os.DirEntry对象是短期的,不是真正的保留或序列化的。如果您需要序列化其中的数据,那么看起来您已经在自己的答案中解决了序列化(pickle)所需属性的dict版本。在

要反序列化为一个像os.DirEntry实例那样行走和嘎嘎叫的对象,请创建一个模仿您需要的东西的PseudoDirEntry类。在

请注意,您已经可以直接序列化stat对象,这样就省去了从中挑选字段的麻烦。在

综合起来,应该是这样的:

class PseudoDirEntry:
    def __init__(self, name, path, is_dir, stat):
        self.name = name
        self.path = path
        self._is_dir = is_dir
        self._stat = stat

    def is_dir(self):
        return self._is_dir

    def stat(self):
        return self._stat

然后:

^{pr2}$

我自己已经发现,对于像这样的非标准类的实例,scandir.DirEntry,最好的方法是将类成员数据转换成标准对象的组合(可能是嵌套的),比如(listdict,等等)。在

例如,在scandir.DirEntry的特定情况下,可以按如下方式进行。在

import scandir, pickle

s = scandir.scandir("D:\\PYTHON")
entry = s.next()

# first convert the stat object to st_
st = entry.stat()
st_ = {'st_mode':st.st_mode, 'st_size':st.st_size,\
   'st_atime':st.st_atime, 'st_mtime':st.st_mtime,\
   'st_ctime':st.st_ctime}

# now convert the entry object to entry_
entry_ = {'name':entry.name, 'is_dir':entry.is_dir(), \
 'path':entry.path, 'stat':st_}

# one may need some other class member data also as necessary

# now pickle the converted entry_
data = pickle.dumps(entry_)

尽管出于我的目的,我只需要数据,但在另一端取消拾取之后,可能需要将未拾取的entry_重构为未拾取的scandir.DirEntry对象“entry”。但是,我还没有弄清楚如何重构类实例,以及如何为诸如is_dir()stat()等方法的行为设置数据。在

相关问题 更多 >