论坛首页 编程语言技术论坛

这种代码不知道怎么写才顺眼。关于在try中读写文件。[已解决]

浏览 3199 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-03-31   最后修改:2009-03-31
以下两种写法是我想到的,都让我不是很满意,不知道各位怎么看?

        dest = open(store_path, 'wb+')
        failed = False
        try:
            for chunk in upload_file.chunks():
                dest.write(chunk)
            dest.close()
        except:
            dest.close() #感觉写两个close(),不简洁。
            try:
                os.remove(store_path)
            except:
                pass


        failed = False
        dest = open(store_path, 'wb+')
        failed = False
        try:
            for chunk in upload_file.chunks():
                dest.write(chunk)
        except:
            failed = True    #因为要先关闭文件再删除,所以这里只能做标记。
        finally:
            dest.close()
            if failed:
                try:
                    os.remove(store_path)
                except:
                    pass


新手,想从细节抓起。
谢谢。
   发表时间:2009-03-31  
可以用with 来简化文件的关闭

0 请登录后投票
   发表时间:2009-03-31  
class FileContext(object):
    def __init__(self,file):
        self.file=file
    def __enter__(self):
        pass
    def __exit__(self,exc_type,exc_value,traceback):
        try:
            self.file.close()
        finally:
            if exc_type is not None:
                os.remove(self.file.name)
import os
if __name__ == "__main__":
    f=open("path","wb+")
    with FileContext(f):
        raise IOError

参考官方文档。在py3.0下测试通过
http://docs.python.org/3.0/reference/compound_stmts.html#the-with-statement
0 请登录后投票
   发表时间:2009-03-31  
上面漏了一点,应该判断异常的类型是否为IOError或者其他的什么,不过这些你可以在__exit__里判断
0 请登录后投票
   发表时间:2009-03-31  
# dest = open(store_path, 'wb+') 

# try: 
#     for chunk in upload_file.chunks(): 
#         dest.write(chunk) 
# except: 
#       try: 
#             os.remove(store_path) 
#         except: 
#             pass 
# finally: 
#     dest.close() 

#      
0 请登录后投票
   发表时间:2009-04-02   最后修改:2009-04-02
phyeas 写道
class FileContext(object):
    def __init__(self,file):
        self.file=file
    def __enter__(self):
        pass
    def __exit__(self,exc_type,exc_value,traceback):
        try:
            self.file.close()
        finally:
            if exc_type is not None:
                os.remove(self.file.name)
import os
if __name__ == "__main__":
    f=open("path","wb+")
    with FileContext(f):
        raise IOError

参考官方文档。在py3.0下测试通过
http://docs.python.org/3.0/reference/compound_stmts.html#the-with-statement


引用
# dest = open(store_path, 'wb+')

# try:
#     for chunk in upload_file.chunks():
#         dest.write(chunk)
# except:
#       try:
#             os.remove(store_path)
#         except:
#             pass
# finally:
#     dest.close()

#      


用__exit__方法类似于c++中的析构函数
采用finally写法则类似于java中的写法

我觉得当时一个类来处理文件的话可以用_exit_
用一个方法的话则选用finally
0 请登录后投票
   发表时间:2009-04-14  
不同意dogstar 的写法,在文件没关闭之前是无法删除文件的
也不同意spyker 的说法,可以在任意上下文中使用with。不局限于类或方法
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics