摘要:在系統中,一切都是文件。第二個參數也是一個字符串,表示文件使用方式。是文本模式下讀寫文件。在使用創建文件對象時,最好使用關鍵字。其好處是,當字句體結束后文件會正確關閉,即使在某個時刻引發了異常。
在Linux系統中,一切都是文件。但我們通常說的文件是保存在磁盤上的圖片、文檔、數據、程序等等。而在程序的IO操作中,很多時候就是從磁盤讀寫文件。本節我們講解Python中的文件對象如何操作文件。
創建文件對象通過Python內置函數open()可以很容易的創建一個文件對象。open函數有很多參數,最常用的有兩個,使用open函數最常用的方法是:open(filename, mode)。
f = open("myfile", "w")
第一個參數filename是文件名的字符串,比如myfile。第二個參數也是一個字符串,表示文件使用方式。mode的可選項如下:
mode | 含義 |
---|---|
‘r’ | 以只讀模式打開(默認) |
‘w’ | 以可寫模式打開,并清楚文件內容(如果文件存在的話) |
‘x’ | 創建一個新文件并以可寫模式打開 |
‘a’ | 以可寫模式打開,從文件末尾開始寫入(如果文件存在的話) |
‘b’ | 二進制模式 |
‘t’ | 文本模式(默認) |
’+’ | 打開一個已存在文件以便進行更新(讀和寫) |
其中的"b"和"t"是指定文件內容是文本還是二進制,其它都說是關于讀寫方式的。
"b"是二進制模式打開文件,讀寫的數據都是字節對象(bytes),這個模式可以讀寫一切文件,包括文本文件,但讀寫文本文件時要注意編碼的問題。
"t"是文本模式下讀寫文件。讀取時,默認會把平臺特定的行結束符 (Unix 上的
, Windows 上的?
)轉換為
。寫入是,默認會把出現的
?轉換回平臺特定的結束符。這種默認的“幕后修改”對文本文件來說沒有問題,但會破壞二進制數據(比如,JPEG或exe)文件中的數據。
在使用open創建文件對象時,最好使用?with?關鍵字。其好處是,當字句體結束后文件會正確關閉,即使在某個時刻引發了異常。并且with比等效的try-finally代碼塊更簡短:
In [102]: with open("myfile") as f: ...: data = f.read() ...: In [103]: f.closed Out[103]: True
如果沒使用with關鍵字,就要調用f.close()來關閉文件并立即釋放它使用的系統資源。如果沒有顯示的關閉文件,Python的垃圾回收器最終將銷毀該對象并為你關閉打開的文件,但這個文件可能會保持打開狀態一段時間。另外一個風險是不同的Python實現會在不同的時間進行清理。
通過 with 語句或者調用 f.close() 關閉文件對象后,嘗試使用該文件對象將自動失敗。
文件對象的方法通過上面的方法創建文件對象f后,,我們就可以通過其對應的方法讀寫數據了。
(1)寫內容到文件:f.write(string)
把內容寫入文件的方法是write()方法,傳遞的對象必須是字符串(文本模式下)或字節對象(二進制模式下)。如果要寫入其它類型的對象(比如,字典、列表等等),就要先把它們轉換成字符串(文本模式下)或字節對象(二進制模式下)。
In [109]: f = open("myfile", "w") In [110]: f.write("認真學Python,就是文件的全部內容。 ") Out[110]: 21 In [111]: f.close()
(2)讀取文件內容:f.read(size)
它會讀取文件里面的數據并將其返回為字符串(在文本模式下),或者字節對象(二進制模式)。參數size是一個可選的整數參數,當size被省略或為負的時候,讀取文件的全部內容;如果文件的大小是機器內存的兩倍或更大,那么可能出現錯誤。讀取并返回的size大小的內容。如果已經讀完全部內容(到達文件末尾),將返回一個空字符串。
In [112]: f = open("myfile") In [113]: f.read() Out[113]: "認真學Python,就是文件的全部內容。 " In [114]: f.read() Out[114]: ""
f.readline()?從文件讀取一行,換行符
留住字符串末尾;
f.readlines()?讀取文件所有行,返回一個字符串的列表;
In [118]: f.readline() Out[118]: "認真學Python,就是文件的全部內容。 " In [119]: f.seek(0) Out[119]: 0 In [120]: f.readlines() Out[120]: ["認真學Python,就是文件的全部內容。 "]
遍歷文件的所有行,也可以用遍歷文件對象的方式,這是內存高效、快速并簡單的方式:
In [122]: for line in f: ...: print(line) ...: 認真學Python,就是文件的全部內容。
(3)文件對象的位置
前面的例子中,我們已經讀到文件的末尾,如果要再從頭讀的話就要調用f.seek(0)來設置文件對象的位置到文件開頭。這個方法有兩個參數:f.seek(cookie, whence=0)
cookie 是位置偏移量
whence 是相對位置,它有三種相對位置:
0 文件開頭,偏移量是0或整數;
1 當前位置,偏移量可以是負數;
2 文件末尾,偏移量通常是負數;
如何查看當前位置呢?調用f.tell()方法。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/43811.html
摘要:創建第一個協程推薦使用語法來聲明協程,來編寫異步應用程序。協程兩個緊密相關的概念是協程函數通過定義的函數協程對象調用協程函數返回的對象。它是一個低層級的可等待對象,表示一個異步操作的最終結果。 我們講以Python 3.7 上的asyncio為例講解如何使用Python的異步IO。 showImg(https://segmentfault.com/img/remote/14600000...
摘要:并發的方式有多種,多線程,多進程,異步等。多線程和多進程之間的場景切換和通訊代價很高,不適合密集型的場景關于多線程和多進程的特點已經超出本文討論的范疇,有興趣的同學可以自行搜索深入理解。 編程中,我們經常會遇到并發這個概念,目的是讓軟件能充分利用硬件資源,提高性能。并發的方式有多種,多線程,多進程,異步IO等。多線程和多進程更多應用于CPU密集型的場景,比如科學計算的時間都耗費在CPU...
摘要:比如,模塊名表示包中名為的子模塊。例如,文件可以包含以下代碼定義了之后,就會把,,導入到當前命名空間。這種導入使用前導點來指示相對導入中涉及的當前包和父包。也就是說被執行的主程序里面不能包含相對導入。 包,Package,是一種Python模塊的集合,從文件組織形式上看,包就是一個文件夾,里面放著各種模塊(.py文件),也可以有子文件夾(子包)。包名構建了一個Python模塊的命名空間...
摘要:默認情況下,它也是不安全的,如果數據是由黑客精心設計的,則反序列化的數據可能被植入惡意代碼??偨Y為我們提供了數據序列化的工具。如果是自己內部使用,可以作為一個選擇進行復雜對象的序列化。 上一節我們學習了文件的讀寫,把一個字符串(或字節對象)保存到磁盤是一件很容易的事情。但是在實際編程中,我們經常需要保存結構化數據,比如復雜的字典、嵌套的列表等等,這時候就需要我們想辦法把這些結構化數據先...
閱讀 2630·2021-09-28 09:36
閱讀 2247·2021-09-07 09:58
閱讀 1504·2019-08-26 13:53
閱讀 1287·2019-08-23 17:53
閱讀 3035·2019-08-23 15:34
閱讀 1859·2019-08-23 15:34
閱讀 2876·2019-08-23 12:04
閱讀 3727·2019-08-23 10:56