zoukankan      html  css  js  c++  java
  • 关于python 文件操作os.fdopen(), os.close(), tempfile.mkstemp()

    嗯。最近在弄的东西也跟这个有关系,由于c基础渣渣。现在基本上都忘记得差不多的情况下,是需要花点功夫才能弄明白。

    每个语言都有相关的文件操作。

    今天在flask 的例子里看到这样一句话。拉开了文件操作折腾的序幕

        db_fd, flaskr.app.config['DATABASE'] = tempfile.mkstemp()

    稍微查询一下就能了解到 tempfile是一个临时文件模块。 包含了一些临时文件的操作

    tempfile.mkstemp()

    在很老很老的python版本的时候,第一个参数是返回的是安全等级,第二个参数是文件名称的绝对路径。这个很奇怪,应该是后面python版本对这个库有所改动。因为在查询的时候,发现很多地方都是这么写的返回。然而我调用了这个函数去看了函数内部实现的时候发现,其实并不是这样。

    也就是说在我使用的python2.7版本tempfile.mkstemp()返回的第一个参数是一个fd(file_description)文件描述符,和一个包含绝对路径的文件名称。tempfile里面的有些方法创建的文件是在关闭之后会自动删除的,但是mkstemp()这个方法创建的临时文件并不会被删除,只是不会被其他应用程序找到和使用。你可以在使用之后通过os.close(fd)这个方法关闭这个文件。

    顺便介绍一个tempfile.TemporaryFile()方法,他在创造了临时文件之后会在文件关闭之后销毁 可以尝试使用以下方法测试一下。

    file_obj = tempfile.TemporaryFile(dir=os.path.dirname(__file__))
    with file_obj as f:
        f.write('123j12oi3joijw')
        f.seek(0)
        print f.read()

    会发现和tempfile.mkstemp()方法的行为不一样,文件看似并没有被创建,其实是创建了然后在关闭之后被销毁了。

    这里不得不强调一个问题,也是最开始我也没有弄明白的问题。

    我尝试使用这样的语句去操作一个fd

    fd, name = tempfile.mkstemp(dir=os.path.dirname(__file__))
    with fd as f:
        pass
    Traceback (most recent call last):
      File "/Users/piperck/Desktop/py_pra/laplace_pra/2016_01/2016_01_pra.py", line 11, in <module>
        with fd as f:
    AttributeError: __exit__

    奇怪了,难道以前我用open生成的文件对象都不是fd? 这跟剧本不对啊。 于是我又去看了一下源码。。。还真不是一个东西

    fd文件描述符和python的文件对象并不是一个东西。 只有python的文件对象才可以用相关方法进行操作。 

    我们平时使用的open方法是创建了一个可以被python语言操作的python file object。 并不是 fd对象。

    python也提供了一个方法可以将fd对象转换成python文件对象 使用

    python_file_obj = os.fdopen(fd,)
    fdopen(fd, mode='r', bufsize=None)

    对应的系统提供的os.fdopen的方法如上

    可以这样说 fd对象是系统层面的东西,c语言里面也有。os.fdopen os.close(fd)等方法来操作fd对象。 而python文件对象就可以使用python文件操作的相关方法。嘿嘿 这下应该不会搞混了吧。

    顺便推荐一篇文章:http://blog.csdn.net/dreamthen/article/details/17263259 介绍相关python文件操作的 分析得还蛮细的 我看了一下有些收益

    -----------------------分割线-----------------------2016-02-01补充

    今天研究一下对csv的读写问题,补充一张图

    注意注意,

    这里文件操作,如果要在头部增加'BOM(xefxbbxbf)'的话使用ab追加行不通,而且尝试了让文件指针回到头部 似乎也不行。a追加方式会自动让指针回到尾部造成操作失败。这里我们使用r+b进行操作。r追加操作既不会让指针跑到尾部去,而且也不会重写整个文件 是一个比较好的方法。

  • 相关阅读:
    URAL 2046 A
    URAL 2056 Scholarship 水题
    Codeforces Gym 100286I iSharp 水题
    Codeforces Gym H. Hell on the Markets 贪心
    Codeforces Gym 100286G Giant Screen 水题
    Codeforces Gym 100286B Blind Walk DFS
    Codeforces Gym 100286F Problem F. Fibonacci System 数位DP
    Codeforces Gym 100286A. Aerodynamics 计算几何 求二维凸包面积
    Codeforces Gym 100418K Cards 暴力打表
    Codeforces Gym 100418J Lucky tickets 数位DP
  • 原文地址:https://www.cnblogs.com/piperck/p/5117609.html
Copyright © 2011-2022 走看看