<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ### 6.4.2 文件操作 常用計算機的人都知道,許多應用軟件(如 Word、媒體播放器等)都需要處理文件, 并且都需要經過打開文件、讀寫文件、關閉文件的步驟,這其實是程序設計中文件處理的一 般過程的反映。 打開文件 在讀寫文件之前首先需要“打開”文件,這個步驟可以簡單地理解為對磁盤文件進行必 要的初始化,至于其底層細節則無需了解。 Python 提供了函數 open 用于文件打開,用法如下: ``` f = open(<文件名>,<打開方式>) ``` 其含義是按指定的&lt;打開方式&gt;打開由&lt;文件名&gt;標識的磁盤文件,創建一個文件對象作為函 數的返回值,并使變量 f 引用這個文件對象。常用的打開方式包括"r"和"w",它們分別表示 “讀”方式和“寫”方式。 順便強調一下,Python 中的文件處理是面向對象風格的,即文件是一個對象,通過文 件對象的方法來實現文件操作。我們在第 5 章中初步介紹了對象概念,并且將在第 7 章詳細 討論面向對象。 為了讀取一個文件的內容,需要以讀方式打開文件。例如: ``` f = open("oldfile.dat","r") ``` 成功執行后,就可以通過文件對象 f 來讀取文件 oldfile.dat 的內容了。若指定的文件不存在, 則 Python 將報錯(IOError)。 為了向一個文件中寫入內容,需要以寫方式打開文件。例如: ``` f = open("newfile.txt","w") ``` 成功執行后,就可以通過文件對象 f 來向文件 oldfile.dat 中寫入內容了。注意,以寫方式打 開文件時,如果指定的文件不存在,則創建該文件;如果指定的文件已經存在,則會清除該 文件原來的內容,即相當于創建新文件。所以,以寫方式打開文件時一定要小心,不要把現 有文件破壞了。 讀文件 在介紹文件讀寫之前,先要理解文件“當前讀寫位置”的概念。讀者應該了解老式的錄 放機的錄放過程吧:錄放機有一個磁頭,用于讀取或錄入磁帶信息,隨著磁帶的轉動,磁頭 也就不斷改變著錄放位置。Python 中的文件采用類似的順序讀寫過程:打開文件后,當前 讀寫位置就是文件開始處;隨著讀寫命令的執行,當前讀寫位置不斷改變,直至到達文件末 尾。 Python 中的文件對象提供了 read()、readline()和 readlines()方法用于讀取文件內容。 read()的用法如下: ``` <變量> = <文件對象>.read() ``` 含義是讀取從當前位置直到文件末尾的內容,并作為字符串返回。如果是剛打開的文件對象, 則返回的字符串包含文件的所有內容。 read()方法也可以帶有參數: ``` <變量> = <文件對象>.read(n) ``` 含義是讀取從當前位置開始的 n 個字符,并以此字符串作為返回值。如果指定的 n 大于文件中從當前位置到末尾的字符數,則僅返回這些字符。如果當前位置已到達文件末尾,則 read 返回空串。 假設有一個文件 rhyme.txt,其文本內容是: ``` Good, better, best, Never let it rest, Till good is better, And better, best. ``` 下面的語句序列對此文件進行讀取 ``` >>> f = open("rhyme.txt","r") >>> s = f.read(8) >>> s 'Good, be' >>> f.read(20) 'tter, best,\nNever le' >>> print f.read() t it rest, Till good is better, And better, best. >>> f.close() ``` readline()的用法如下: ``` <變量> = <文件對象>.readline() ``` 含義是讀取從當前位置到行末(即下一個換行字符)的所有字符,并以此字符串作為返回值, 賦值給變量。通常用此方法來讀取文件的當前行。如果當前處于文件末尾,則 readline 返回 空串。例如: ``` >>> f = open("rhyme.txt","r") >>> s = f.readline() >>> s 'Good, better, best,\n' >>> f.readline() 'Never let it rest,\n' >>> print f.readline() Till good is better, >>> f.close() ``` readlines()的用法如下: ``` <變量> = <文件對象>.readlines() ``` 其含義是讀取從當前位置直到文件末尾的所有行,并將這些行構成一個字符串列表作為返回 值,列表中的每個元素都是文件的一行。如果當前處于文件末尾,則 readlines 返回空列表。 例如: ``` >>> f = open("rhyme.txt","r") >>> f.readline() 'Good, better, best,\n' >>> f.readline() 'Never let it rest,\n' >>> f.readlines() ['Till good is better,\n', 'And better, best.\n'] >>> f.readlines() [] ``` 寫文件 當文件以寫方式打開時,可以向文件中寫入文本內容。與讀文件一樣,寫入位置也是由 “當前讀寫位置”決定的。Python 文件對象提供兩種寫文件的方法: ``` <文件對象>.write(<字符串>) <文件對象>.writelines(<字符串列表>) ``` 其中,write 的含義是在文件當前位置處寫入字符串,writelines 的含義是在文件當前位置處依次寫入列表中的所有字符串。 下面的語句序列創建了一個新文件,并向其中寫入了李白的名詩: ``` >>> f = open("d:/libai.txt","w") >>> f.write("窗前明月光") >>> f.write("疑是地上霜\n") >>> f.write("舉頭望明月\n 低頭思故鄉") >>> f.close() ``` 注意每一次 f.write()都是緊接著上次寫入的內容繼續的,并不會因為是另一條 f.write()就另 起一行。為了寫多行文本,必須人工添加換行字符“\n”。那么,上述語句序列所創建的文 件 libai.txt 有幾行文本呢?沒錯,只有 3 行,因為第一次調用 f.write 時并沒有寫入換行符, 這導致詩的前兩句被寫在同一行上了。如圖 6.2 所示。 ![](https://box.kancloud.cn/2016-02-22_56cafce274d38.png) 圖 6.2 寫入多行文本 再次強調,寫方式打開文件會導致要么創建一個新文件,要么清除一個舊文件,總之文件的內容是全新的。那么有沒有辦法在現有文件內容基礎上再寫入一些新內容呢?答案是肯 定的。Python 還提供一種文件打開方式"a",表示“追加”。以追加方式打開文件后,當前位 置被定位在文件末尾,可以繼續寫入文本而不改變原有的文件內容。例如: ``` >>> f = open("d:/libai.txt","a") >>> f.write("\n---- 李白《靜夜思》") >>> f.close() ``` 結果如圖 6.3 所示。 ![](https://box.kancloud.cn/2016-02-22_56cafce28978b.png) 圖 6.3 向文件追加寫入內容 關閉文件 文件處理結束后需要關閉文件,這個步驟大體上涉及釋放分配給文件的系統資源,以便 分配給其他文件使用。通過調用文件對象的 close 方法來關閉文件: ``` <文件對象>.close() ``` 注意,即使程序中沒有關閉文件,Python 程序結束時也會自動關閉所有打開的文件。 然而好的做法是由程序自己關閉文件,否則有可能因程序意外終止而導致文件數據丟失。例 如,以寫方式打開文件時,如果向文件中寫入了文本但還沒有關閉文件,那么所寫內容是不 會存盤的。這時再以讀方式打開同一文件,read()命令返回的是空串。下面的語句序列演示 了這種情況。 ``` >>> f = open("d:/test","w") >>> f.write("some words") >>> g = open("d:/test","r") >>> g.read() '' >>> f.close() >>> g.seek(0) >>> g.read() 'some words' ``` 所以,強烈建議讀者在程序中一旦結束對文件的讀寫,就立即關閉文件。 文件處理程序的常見結構 許多應用程序的算法結構都屬于直接了當的 IPO(輸入-處理-輸出)模式,當輸入輸 出都是文件時,程序的結構大體如下: ``` infile = open("input.dat","r") outfile = open("output.dat","w") while True: text = infile.readline() if text == "": break do something with text ... outfile.write(data) infile.close() outfile.close() ``` 此代碼的核心是一個 while 循環,循環的每一步利用 readline()讀取輸入文件的一行,然后對該行進行處理,并將處理結果寫入輸出文件。當某次循環讀到空行(視為文件尾),則利用 break 跳出循環體,從而結束對文件的處理。 除了“while 循環+readline()”的結構,還可以利用“for 循環+readlines()”的結構。readlines() 一次性讀出所有行,形成一個列表,然后針對這個列表進行循環。 ``` for line in infile.readlines(): do something with line ... ``` 實際上,Python 語言甚至允許直接將打開的文件與 for 循環結合使用,達到和“for 循 環+readlines()”同樣的效果。代碼如下: ``` infile = open("input.dat","r") for line in infile: do something with line ... ``` 這種用法有個好處是無需考慮內存大小,而 readlines()要求內存足夠大,以便容納它返回的 列表。 向文件追加數據 前述讀方式打開的文件只能讀取不能寫入,寫方式打開的文件是新建文件(寫打開現存文件的話將清除內容),只能寫入不能讀取。有沒有辦法保留現存文件的內容并加入新內容 呢? 一種做法是先將文件的現有數據利用 readlines()讀出來存入一個列表,然后向該列表添 加數據,最后再把新列表寫入文件。這種做法對小文件沒有問題,但當文件大小為數百 MB 或若干 GB 時,為了保存所有行的列表需要消耗大量內存。 其實 Python 還提供了一種打開方式"a",稱為“追加”方式,可以用于在現存文件的尾 部追加新數據。當然,如果請求打開的文件不存在,"a"方式就和"w"方式一樣,創建一個新 文件。下面的語句演示了追加方式的用法: ``` >>> f = open("oldfile.txt","a") >>> f.write("something new\n") >>> f.close() ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看