python-文件和異常-待繼續(xù)

從文件中讀取數(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)全覆蓋可 能很難。通常,最初只要針對代碼的重要行為編寫測試即可,等項目被廣泛使用時再考慮全覆蓋

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容