從文件中讀取數(shù)據(jù)
文本文件可存儲的數(shù)據(jù)量多得難以置信:天氣數(shù)據(jù)、交通數(shù)據(jù)、社會經(jīng)濟數(shù)據(jù)、文學作品等。 每當需要分析或修改存儲在文件中的信息時,讀取文件都很有用,對數(shù)據(jù)分析應用程序來說尤其 如此。例如,你可以編寫一個這樣的程序:讀取一個文本文件的內(nèi)容,重新設(shè)置這些數(shù)據(jù)的格式 并將其寫入文件,讓瀏覽器能夠顯示這些內(nèi)容。
要使用文本文件中的信息,首先需要將信息讀取到內(nèi)存中。為此,你可以一次性讀取文件的 全部內(nèi)容,也可以以每次一行的方式逐步讀取。
讀取整個文件
需要注意文件的路徑,返回對象file_object
with open('file/a.txt') as file_object:
contents = file_object.read()
print(contents)
要刪 除多出來的空行,可在print語句中使用rstrip()
文件路徑
在 Windows系統(tǒng)中,在文件路徑中使用反斜杠()而不是斜杠(/)
with open('text_files\filename.txt') as file_object:
指定計算機內(nèi)絕對路徑 macos:
file_path = '/Users/yushui/Downloads/a.txt'
with open(file_path) as file_object:
a =file_object.read()
print(a)
windows:
file_path = 'C:\Users\ehmatthes\other_files\text_files\filename.txt'
逐行讀取
要以每次一行的方式檢查文件,可對文件對象使用for循環(huán):
file_path = '/Users/yushui/Downloads/a.txt'
with open(file_path) as file_object:
for line in file_object:
print(line)
#
3.1415926535
8979323846
2643383279
為何會出現(xiàn)這些空白行呢?因為在這個文件中,每行的末尾都有一個看不見的換行符,而 print語句也會加上一個換行符,因此每行末尾都有兩個換行符:一個來自文件,另一個來自print 語句。要消除這些多余的空白行,可在print語句中使用rstrip()
創(chuàng)建一個包含文件各行內(nèi)容的列表
file_path = '/Users/yushui/Downloads/a.txt'
with open(file_path) as file_object:
lines = file_object.readlines()
for line in lines:
print(line.rstrip())
readlines()從文件中讀取每一行,并將其存儲在一個列表中;接下來,該列表被 存儲到變量lines中;在with代碼塊外,我們依然可以使用這個變量。在?處,我們使用一個簡單 的for循環(huán)來打印lines中的各行。由于列表lines的每個元素都對應于文件中的一行,因此輸出 與文件內(nèi)容完全一致。
使用文件的內(nèi)容
下面以簡單的方式使用圓周率
的值。首先,我們將創(chuàng)建一個字符串,它包含文件中存儲的所有數(shù)字,且沒有任何空格
file_path = '/Users/yushui/Downloads/a.txt'
with open(file_path) as file_object:
lines = file_object.readlines()
a = ''
for line in lines:
a += line.rstrip()
print(a)
print(len(a))
包含一百萬位的大型文件
只需要xx位數(shù)字
print(a[:xx]) 即可
圓周率里是否包含你的生日
file_path = '/Users/yushui/Downloads/a.txt'
with open(file_path) as file_object:
lines = file_object.readlines()
yzl = ''
for line in lines:
yzl += line.rstrip()
shengri = input("shu ru ni de shengri :")
if shengri in yzl:
print("gong xi ni ")
else:
print("sorry")
練習:可使用方法 replace()將字符串中的特定單詞都替換為另一 個單詞。下面是一個簡單的示例,演示了如何將句子中的'dog'替換為'cat'
file_path = '/Users/yushui/Downloads/learning_python.txt'
with open(file_path) as file_object:
a = file_object.readlines()
for aa in a :
print(aa.rstrip().replace('Python','c'))
#
In c you can a
In c you can b
In c you can c
寫入文件 寫入空文件
要將文本寫入文件,你在調(diào)用open()時需要提供另一個實參,告訴Python你要寫入打開的文 件。為明白其中的工作原理,我們來將一條簡單的消息存儲到文件中,而不是將其打印到屏幕上
file_path = '/Users/yushui/Downloads/learning_python.txt'
with open(file_path,'w') as file_object:
file_object.write("I love programming")
在這個示例中,調(diào)用open()時提供了兩個實參(見?)。第一個實參也是要打開的文件的名稱; 第二個實參('w')告訴Python,我們要以寫入模式打開這個文件。打開文件時,可指定讀取模 式('r')、寫入模式('w')、附加模式('a')或讓你能夠讀取和寫入文件的模式('r+')。如果 你省略了模式實參,Python將以默認的只讀模式打開文件
異常
Python使用被稱為異常的特殊對象來管理程序執(zhí)行期間發(fā)生的錯誤。每當發(fā)生讓Python不知 所措的錯誤時,它都會創(chuàng)建一個異常對象。如果你編寫了處理該異常的代碼,程序?qū)⒗^續(xù)運行; 如果你未對異常進行處理,程序?qū)⑼V?,并顯示一個traceback,其中包含有關(guān)異常的報告。
異常是使用try-except代碼塊處理的。try-except代碼塊讓Python執(zhí)行指定的操作,同時告 訴Python發(fā)生異常時怎么辦。使用了try-except代碼塊時,即便出現(xiàn)異常,程序也將繼續(xù)運行: 顯示你編寫的友好的錯誤消息,而不是令用戶迷惑的traceback
使用try-except代碼塊
當你認為可能發(fā)生了錯誤時,可編寫一個try-except代碼塊來處理可能引發(fā)的異常。你讓 Python嘗試運行一些代碼,并告訴它如果這些代碼引發(fā)了指定的異常,該怎么辦。
處理ZeroDivisionError異常的try-except代碼塊類似于下面這樣
try:
print(5/0)
except ZeroDivisionError:
print("You can't divide by zero!")
try-except-else
print("shu ru 2 ge zi fu")
print("shu ru 'q' tui chu")
while True:
a = input("shu ru di yi ge shu zi:")
if a == 'q':
break
b = input("shu ru di er ge shu zi:")
if b == 'q':
break
try:
c = int(a)/int(b)
except ZeroDivisionError:
print("You can't divide by 0!")
else:
print(c)
處理FileNotFoundError異常
file_name = 'a.txt'
try:
with open(file_name) as filea:
b = filea.read()
print(b)
except FileNotFoundError:
print("can't find")
分析文本
file_name = 'TEST4/a.txt'
try:
with open(file_name) as filea:
b = filea.read()
print(b)
except FileNotFoundError:
print("can't find")
else:
w =b.split()
n_w =len(w)
print(n_w)
使用多個文件
單元測試和測試用例
Python標準庫中的模塊unittest提供了代碼測試工具。單元測試用于核實函數(shù)的某個方面沒 有問題;測試用例是一組單元測試,這些單元測試一起核實函數(shù)在各種情形下的行為都符合要求。 良好的測試用例考慮到了函數(shù)可能收到的各種輸入,包含針對所有這些情形的測試。全覆蓋式測 試用例包含一整套單元測試,涵蓋了各種可能的函數(shù)使用方式。對于大型項目,要實現(xiàn)全覆蓋可 能很難。通常,最初只要針對代碼的重要行為編寫測試即可,等項目被廣泛使用時再考慮全覆蓋