嗯。最近在弄的東西也跟這個有關系,由於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追加操作既不會讓指針跑到尾部去,而且也不會重寫整個文件 是一個比較好的方法。