创建可以打开的文件包装器

时间:2014-09-22 11:33:10

标签: python file wrapper

我需要处理具有专门内容的ZIP文件,因此想要创建一个包装器,以便我可以使用类似

的内容
with open(MySpecialFile('/path/to/file.zip', 'rb')) as msf:
    <snip>

我已经知道如何实现__enter____exit__方法,但是我找不到任何关于如何使对象可以打开的文档。 我试图实现一个__open__函数,希望python以这种方式应用open()方法。不幸的是,情况似乎并非如此:

>>> class Foo():
...     def __open__(self):
...         print('Opened!')
... 
>>> with open(Foo()) as f:
...     print('yay')
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: invalid file: <__main__.Foo object at 0x7f93b630ab00>

创建可以使用open()打开的自定义对象的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

没有__open__方法。相反,您应该创建一些实现file API的东西。只要它实现了所有必要的方法,就会有一个简单的类。

然后你可以说:

with openMySpecialFile('/path/to/file.zip', 'rb') as msf:
    ...

其中openMySpecialFile()是一个工厂函数,它构建在&#34;&#34;的实例中。上面并返回它。

答案 1 :(得分:2)

或者只是换open

class Foo(object):
    def __init__(self, fpath, mode):
        self.f = fpath
        self.mode = mode
    def __enter__(self):
        print 'context begun'
        self.file = open(self.f, self.mode)
        return self.file
    def __exit__(self, exc_type, exc_val, exc_tb):
        print 'closing:', exc_type, exc_val, exc_tb
        self.file.close()
    def __str__(self):
        return self.f
with Foo('file.spc', 'rb') as f:
    print f.read()

>>> 
context begun
filecontentsfilecontentsfilecontentsfilecontents


closing: None None None
>>>