python代码写入方式_【Python 1-17】Python手把手教程之——文件的读写以及I/O操作...
作者 | 弗拉德
來源 | 弗拉德(公眾號(hào):fulade_me)
從文件中讀取數(shù)據(jù)
文本文件可存儲(chǔ)的數(shù)據(jù)量很多,每當(dāng)需要分析或修改存儲(chǔ)在文件中的信息時(shí),讀取文件都很有用,對(duì)數(shù)據(jù)分析應(yīng)用程序來說尤其 如此。例如,你可以編寫一個(gè)這樣的程序:讀取一個(gè)文本文件的內(nèi)容,重新設(shè)置這些數(shù)據(jù)的格式 并將其寫入文件,讓瀏覽器能夠顯示這些內(nèi)容。
要使用文本文件中的信息,首先需要將信息讀取到內(nèi)存中。為此,你可以一次性讀取文件的全部?jī)?nèi)容,也可以以每次一行的方式逐步讀取。
讀取整個(gè)文件
要讀取文件,需要一個(gè)包含幾行文本的文件。下面首先來創(chuàng)建一個(gè)文件,它包含精確到小數(shù)點(diǎn)后30位的圓周率值,且在小數(shù)點(diǎn)后每10位處都換行:
3.1415926535
8979323846
2643383279
我們把它保存為pi_digits.txt文件
with open('pi_digits.txt') as file_object:
contents = file_object.read()
print(contents)
我們先來看看函數(shù)open()。要以任何方式使用文件——哪怕僅僅是打印其內(nèi)容,都得先打開文件,這樣才能訪問它。函數(shù)open()接受一個(gè)參數(shù): 要打開的文件的名稱。Python在當(dāng)前執(zhí)行的文件所在的目錄中查找指定的文件。在這個(gè)示例中,假如我們把文件保存為file_reader.py,因此Python在file_reader.py所在的目錄中查找pi_digits.txt。函數(shù)open()返回一個(gè)表示文件的對(duì)象。在這里,open('pi_digits.txt')返回一個(gè)表示文件pi_digits.txt的對(duì)象,Python將這個(gè)對(duì)象存儲(chǔ)在我們將在后面使用的變量中。
關(guān)鍵字with在不再需要訪問文件后將其關(guān)閉。在這個(gè)程序中,注意到我們調(diào)用了open(),但沒有調(diào)用close(),你也可以調(diào)用open()和close()來打開和關(guān)閉文件,但這樣做時(shí),如果程序存在bug,導(dǎo)致close()語句未執(zhí)行,文件將不會(huì)關(guān)閉。這看似微不足道,但未妥善地關(guān)閉文件可能會(huì)導(dǎo)致數(shù)據(jù)丟失或受損。如果在程序中過早地調(diào)用close(),你會(huì)發(fā)現(xiàn)需要使用文件時(shí)它已關(guān)閉,這會(huì)導(dǎo)致更多的錯(cuò)誤。并非在任何情況下都能輕松確定關(guān)閉文件的恰當(dāng)時(shí)機(jī),但通過使用前面所示的結(jié)構(gòu),可讓Python去確定:你只管打開文件,并在需要時(shí)使用它,Python自會(huì)在合適的時(shí)候自動(dòng)將其關(guān)閉。
通過打印contents的值,就可將這個(gè)文本文件的全部?jī)?nèi)容顯示出來:
3.1415926535
8979323846
2643383279
文件路徑
當(dāng)你將類似pi_digits.txt這樣的簡(jiǎn)單文件名傳遞給函數(shù)open()時(shí),Python將在當(dāng)前執(zhí)行的文件所在的目錄中查找文件。
根據(jù)你組織文件的方式,有時(shí)可能要打開不在程序文件所屬目錄中的文件。例如,你可能將 程序文件存儲(chǔ)在了文件夾python_work中,而在文件夾python_work中,有一個(gè)名為text_files的文件夾,用于存儲(chǔ)程序文件操作的文本文件。雖然文件夾text_files包含在文件夾python_work中,但僅向open()傳遞位于該文件夾中的文件的名稱也不可行,因?yàn)镻ython只在文件夾python_work中查找,而不會(huì)在其子文件夾text_files中查找。要讓Python打開不與程序文件位于同一個(gè)目錄中的文件,需要提供文件路徑,它讓Python到系統(tǒng)的特定位置去查找。
由于文件夾text_files位于文件夾python_work中,因此可使用相對(duì)文件路徑來打開該文件夾中的文件。相對(duì)文件路徑讓Python到指定的位置去查找,而該位置是相對(duì)于當(dāng)前運(yùn)行的程序所在目錄的。在Linux和OS X中,你可以這樣編寫代碼:
with open('text_files/filename.txt') as file_object:
這行代碼讓Python到文件夾python_work下的文件夾text_files中去查找指定的.txt文件。在Windows系統(tǒng)中,在文件路徑中使用反斜杠\而不是斜杠/:
with open('text_files\filename.txt') as file_object:
你還可以將文件在計(jì)算機(jī)中的準(zhǔn)確位置告訴Python,這樣就不用關(guān)心當(dāng)前運(yùn)行的程序存儲(chǔ)在什么地方了。這稱為絕對(duì)文件路徑。在相對(duì)路徑行不通時(shí),可使用絕對(duì)路徑。例如,如果text_files并不在文件夾python_work中,而在文件夾other_files中,則向open()傳遞路徑'text_files/ filename.txt'行不通,因?yàn)镻ython只在文件夾python_work中查找該位置。為明確地指出你希望Python到哪里去查找,你需要提供完整的路徑。
絕對(duì)路徑通常比相對(duì)路徑更長(zhǎng),因此將其存儲(chǔ)在一個(gè)變量中,再將該變量傳遞給open()會(huì)有所幫助。在Linux和OS X中,絕對(duì)路徑類似于下面這樣:
file_path = '/home/ehmatthes/other_files/text_files/filename.txt'
with open(file_path) as file_object:
而在Windows系統(tǒng)中,它們類似于下面這樣:
file_path = 'C:\Users\ehmatthes\other_files\text_files\filename.txt'
with open(file_path) as file_object:
通過使用絕對(duì)路徑,可讀取系統(tǒng)任何地方的文件。就目前而言,最簡(jiǎn)單的做法是,要么將 據(jù)文件存儲(chǔ)在程序文件所在的目錄,要么將其存儲(chǔ)在程序文件所在目錄下的一個(gè)文件夾(如text_files)中。
逐行讀取
讀取文件時(shí),常常需要檢查其中的每一行:你可能要在文件中查找特定的信息,或者要以某種方式修改文件中的文本。例如,你可能要遍歷一個(gè)包含天氣數(shù)據(jù)的文件,并使用天氣描述中包含字樣sunny的行。在新聞報(bào)道中,你可能會(huì)查找包含標(biāo)簽的行,并按特定的格式設(shè)置它。
要以每次一行的方式檢查文件,可對(duì)文件對(duì)象使用for循環(huán):
filename = 'pi_digits.txt'
with open(filename) as file_object:
for line in file_object:
print(line)
我們將要讀取的文件的名稱存儲(chǔ)在變量filename中,這是使用文件時(shí)一種常見的做法。由于變量filename表示的并非實(shí)際文件——它只是一個(gè)讓Python知道到哪里去查找文件的字符串,因此可輕松地將'pi_digits.txt'替換為你要使用的另一個(gè)文件的名稱。
調(diào)用open()后,將一個(gè)表示文件及其內(nèi)容的對(duì)象存儲(chǔ)到了變量file_object中。這里也使用了關(guān)鍵字with,讓Python負(fù)責(zé)妥善地打開和關(guān)閉文件。為查看文件的內(nèi)容,我們通過對(duì)文件對(duì)象執(zhí)行循環(huán)來遍歷文件中的每一行,我們打印每一行時(shí),發(fā)現(xiàn)空白行更多了:
3.1415926535
8979323846
2643383279
為何會(huì)出現(xiàn)這些空白行呢?因?yàn)樵谶@個(gè)文件中,每行的末尾都有一個(gè)看不見的換行符,而print語句也會(huì)加上一個(gè)換行符,因此每行末尾都有兩個(gè)換行符:一個(gè)來自文件,另一個(gè)來自print語句。
創(chuàng)建一個(gè)包含文件各行內(nèi)容的列表
使用關(guān)鍵字with時(shí),open()返回的文件對(duì)象只在with代碼塊內(nèi)可用。如果要在with代碼塊外訪問文件的內(nèi)容,可在with代碼塊內(nèi)將文件的各行存儲(chǔ)在一個(gè)列表中,并在with代碼塊外使用該列表:你可以立即處理文件的各個(gè)部分,也可推遲到程序后面再處理。
下面的示例在with代碼塊中將文件pi_digits.txt的各行存儲(chǔ)在一個(gè)列表中,再在with代碼塊外打印它們:
filename = 'pi_digits.txt'
with open(filename) as file_object:
lines = file_object.readlines()
for line in lines:
print(line.rstrip())
我們先使用方法readlines()從文件中讀取每一行,并將其存儲(chǔ)在一個(gè)列表中接下來,該列表被存儲(chǔ)到變量lines中;在with代碼塊外,我們依然可以使用這個(gè)變量。我們使用一個(gè)簡(jiǎn)單的for循環(huán)來打印lines中的各行。由于列表lines的每個(gè)元素都對(duì)應(yīng)于文件中的一行,因此輸出 與文件內(nèi)容完全一致。
使用文件的內(nèi)容
將文件讀取到內(nèi)存中后,就可以以任何方式使用這些數(shù)據(jù)了。下面以簡(jiǎn)單的方式使用圓周率 的值。首先,我們將創(chuàng)建一個(gè)字符串,它包含文件中存儲(chǔ)的所有數(shù)字,且沒有任何空格:
filename = 'pi_digits.txt'
with open(filename) as file_object:
lines = file_object.readlines()
pi_string = ''
for line in lines:
pi_string += line.rstrip()
print(pi_string)
print(len(pi_string))
就像前一個(gè)示例一樣,我們首先打開文件,并將其中的所有行都存儲(chǔ)在一個(gè)列表中。我們創(chuàng)建了一個(gè)變量——pi_string,用于存儲(chǔ)圓周率的值。接下來,我們使用一個(gè)循環(huán)將各行都加入pi_string,并刪除每行末尾的換行符。接著,我們打印這個(gè)字符串及其長(zhǎng)度:
3.1415926535 8979323846 2643383279
36
在變量pi_string存儲(chǔ)的字符串中,包含原來位于每行左邊的空格,為刪除這些空格,可使用strip()而不是rstrip():
filename = 'pi_30_digits.txt'
with open(filename) as file_object:
lines = file_object.readlines()
pi_string = ''
for line in lines:
pi_string += line.strip()
print(pi_string)
print(len(pi_string))
這樣,我們就獲得了一個(gè)這樣的字符串:它包含精確到30位小數(shù)的圓周率值。這個(gè)字符串長(zhǎng)32字符,因?yàn)樗€包含整數(shù)部分的3和小數(shù)點(diǎn):
3.141592653589793238462643383279
36
寫入文件
保存數(shù)據(jù)的最簡(jiǎn)單的方式之一是將其寫入到文件中。通過將輸出寫入文件,即便關(guān)閉包含程 序輸出的終端窗口,這些輸出也依然存在:你可以在程序結(jié)束運(yùn)行后查看這些輸出,可與別人分享輸出文件,還可編寫程序來將這些輸出讀取到內(nèi)存中并進(jìn)行處理。
寫入空文件
要將文本寫入文件,你在調(diào)用open()時(shí)需要提供另一個(gè)實(shí)參,告訴Python你要寫入打開的文 件。為明白其中的工作原理,我們來將一條簡(jiǎn)單的消息存儲(chǔ)到文件中,而不是將其打印到屏幕上:
filename = 'programming.txt'
with open(filename, 'w') as file_object:
file_object.write("I love programming.")
在這個(gè)示例中,調(diào)用open()時(shí)提供了兩個(gè)實(shí)參。第一個(gè)實(shí)參也是要打開的文件的名稱; 第二個(gè)實(shí)參w告訴Python,我們要以寫入模式打開這個(gè)文件。打開文件時(shí),可指定讀取模式r、寫入模式w、附加模式a或讓你能夠讀取和寫入文件的模式r+。如果 你省略了模式實(shí)參,Python將以默認(rèn)的只讀模式打開文件。
如果你要寫入的文件不存在,函數(shù)open()將自動(dòng)創(chuàng)建它。然而,以寫入w模式打開文件時(shí)千萬要小心,因?yàn)槿绻付ǖ奈募呀?jīng)存在,Python將在返回文件對(duì)象前清空該文件。
我們使用文件對(duì)象的方法write()將一個(gè)字符串寫入文件。這個(gè)程序沒有終端輸出,但如果你打開文件programming.txt,將看到其中包含如下一行內(nèi)容:
I love programming.
相比于你的計(jì)算機(jī)中的其他文件,這個(gè)文件沒有什么不同。你可以打開它、在其中輸入新文本、復(fù)制其內(nèi)容、將內(nèi)容粘貼到其中等。
寫入多行
函數(shù)write()不會(huì)在你寫入的文本末尾添加換行符,因此如果你寫入多行時(shí)沒有指定換行符,
文件看起來可能不是你希望的那樣:
filename = 'programming.txt'
with open(filename, 'w') as file_object:
file_object.write("I love programming.")
file_object.write("I love creating new games.")
如果你打開programming.txt,將發(fā)現(xiàn)兩行內(nèi)容擠在一起:
I love programming.I love creating new games.
要讓每個(gè)字符串都單獨(dú)占一行,需要在write()語句中包含換行符:
filename = 'programming.txt'
with open(filename, 'w') as file_object:
file_object.write("I love programming.\n")
file_object.write("I love creating new games\n")
現(xiàn)在,輸出出現(xiàn)在不同行中:
I love programming.
I love creating new games.
追加寫入文件
如果你要給文件添加內(nèi)容,而不是覆蓋原有的內(nèi)容,可以附加模式打開文件。你以附加模式打開文件時(shí),Python不會(huì)在返回文件對(duì)象前清空文件,而你寫入到文件的行都將添加到文件末尾。如果指定的文件不存在,Python將為你創(chuàng)建一個(gè)空文件。
filename = 'programming.txt'
with open(filename, 'a') as file_object:
file_object.write("I also love finding meaning in large datasets.\n")
file_object.write("I love creating apps that can run in a browser.\n")
我們打開文件時(shí)指定了實(shí)參a,以便將內(nèi)容附加到文件末尾,而不是覆蓋文件原來的內(nèi)容。然后,我們又寫入了兩行,它們被添加到文件programming.txt末尾:
I love programming.
I love creating new games.
I also love finding meaning in large datasets.
I love creating apps that can run in a browser.
最終的結(jié)果是,文件原來的內(nèi)容還在,它們后面是我們剛添加的內(nèi)容。 19
小作業(yè)
17-1 在文本編輯器中新建一個(gè)文件,寫幾句話來總結(jié)一下你至
此學(xué)到的Python知識(shí)。將這個(gè)文件命名為 learning_python.txt,并將其存儲(chǔ)到為完成本章練習(xí)而編寫的程序所在的目錄中。編寫一個(gè)程序,讀取整個(gè)文件,并打印。
17-2 訪客:編寫一個(gè)程序,提示用戶輸入其名字;用戶作出響應(yīng)后,將其名字寫入到文件 guest.txt中。
想查看作業(yè)答案可以去我的Githu倉庫在文件夾17-1_17-2下
總結(jié)
以上是生活随笔為你收集整理的python代码写入方式_【Python 1-17】Python手把手教程之——文件的读写以及I/O操作...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python调用摄像头转向_教你如何利用
- 下一篇: .bat脚本自动yes_第四章: Pyt