2011-02-16 36 views
4

我正在使用明确命名的文件作为临时文件。为了确保我正确删除文件,我必须为open()创建一个包装类。Python使用'with'在使用后删除文件

这似乎工作,但

A]是否安全?

B]有没有更好的方法?

import os 

string1 = """1. text line 
2. text line 
3. text line 
4. text line 
5. text line 
""" 
class tempOpen(): 
    def __init__(self, _stringArg1, _stringArg2): 
     self.arg1=_stringArg1 
     self.arg2=_stringArg2 

    def __enter__(self): 
     self.f= open(self.arg1, self.arg2) 
     return self.f 

    def __exit__(self, exc_type=None, exc_val=None, exc_tb=None): 
     self.f.close() 
     os.remove(self.arg1) 

if __name__ == '__main__': 

    with tempOpen('tempfile.txt', 'w+') as fileHandel: 
     fileHandel.write(string1) 
     fileHandel.seek(0) 
     c = fileHandel.readlines() 
     print c 

FYI:我不能使用tempfile.NamedTemporaryFile了很多的原因

+1

您可能希望在`__exit__`中检查`self.f是None`。 – 2011-02-16 16:37:47

回答

7

我想你可以做一个简单一点与contextlib.contextmanager

from contextlib import contextmanager 

@contextmanager 
def tempOpen(path, mode): 
    # if this fails there is nothing left to do anyways 
    file = open(path, mode) 

    try: 
     yield file 
    finally: 
     file.close() 
     os.remove(path) 

有两种你想要的错误以不同的方式处理:创建文件和写入错误的错误。