關於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(\xef\xbb\xbf)'的話使用ab追加行不通,而且嘗試了讓文件指針回到頭部 似乎也不行。a追加方式會自動讓指針回到尾部造成操作失敗。這里我們使用r+b進行操作。r追加操作既不會讓指針跑到尾部去,而且也不會重寫整個文件 是一個比較好的方法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM