成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Python學(xué)習(xí)之路9-文件和異常

chenatu / 2202人閱讀

摘要:本章主要是學(xué)習(xí)的文件操作,主要是從文件中讀取數(shù)據(jù)以及將數(shù)據(jù)存儲(chǔ)到文件中,還有錯(cuò)誤處理,異常類,模塊等。函數(shù)返回一個(gè)文件對(duì)象,用于接收該對(duì)象。異常中使用被稱為異常的特殊對(duì)象來管理程序執(zhí)行期間發(fā)生的錯(cuò)誤。

《Python編程:從入門到實(shí)踐》筆記。
本章主要是學(xué)習(xí)Python的文件操作,主要是從文件中讀取數(shù)據(jù)以及將數(shù)據(jù)存儲(chǔ)到文件中,還有錯(cuò)誤處理,異常類,json模塊等。
1. 從文件中讀數(shù)據(jù) 1.1 讀取整個(gè)文件

以下文件pi_digits.txt包含了精確到小數(shù)點(diǎn)后30位的圓周率數(shù)據(jù)

# pi_digits.txt文件
3.1415926535
  8979323846
  2643383279

# 代碼:
with open("pi_digits.txt", "r") as file_object:
    contents = file_object.read()   # 一次性讀取整個(gè)文件
    print(contents)

# 結(jié)果:和上述文件內(nèi)容一樣

從上述代碼可以看出,我們打開文件使用open()函數(shù),該函數(shù)至少接收一個(gè)參數(shù),即文件路徑。讀取文件時(shí)需要向open()函數(shù)指明是用什么方式讀取文件,是只讀("r"),只寫("w"),末尾添加("a")還是讀寫均可("r+"),open()函數(shù)默認(rèn)以“只讀”方式讀取文件。這只是4中常用的文件讀取方式,此外還有至少8種讀寫方式。open()函數(shù)返回一個(gè)文件對(duì)象,file_object用于接收該對(duì)象。通過文件對(duì)象的read()方法讀取文件內(nèi)容,且該方法返回整個(gè)文件的內(nèi)容。

上述代碼中的文件和源代碼在同一目錄中。注意文件路徑的問題,絕對(duì)路徑(不提倡)和相對(duì)路徑(相對(duì)于源文件的路徑)以及Windows和Linux下路徑的寫法。

注意代碼中的with關(guān)鍵字。其實(shí)讀寫文件不需要該關(guān)鍵字,打開文件使用open()函數(shù),文件讀取完后關(guān)閉文件使用close()函數(shù),讀取內(nèi)容可以調(diào)用read()方法。而之所以使用with關(guān)鍵字,主要是因?yàn)棰倌阕詈笸涥P(guān)閉文件,就想忘了關(guān)燈一樣;②也可能是在關(guān)閉前程序出錯(cuò),導(dǎo)致close()語句未執(zhí)行。這些讓文件沒有關(guān)閉的情況都有可能導(dǎo)致數(shù)據(jù)丟失或損壞。with關(guān)鍵字則被用來應(yīng)對(duì)這些情況,它保證在結(jié)束with塊時(shí),文件一定會(huì)被關(guān)閉。

1.2 逐行讀取

上述代碼一次性讀取整個(gè)文件,這在文件較小或者內(nèi)存充裕的時(shí)候沒有問題,但如果文件特別大,內(nèi)存容量又很羞澀,則只能逐行讀?。?/p>

# 代碼:
file_name = "pi_digits.txt"

with open(file_name) as file_pi:
    for line in file_pi:  # 也可以通過while循環(huán)配合readline()方法逐行讀取文件
        print(line)

# 結(jié)果:
3.1415926535

  8979323846

  2643383279

這里需要注意一個(gè)問題,就是對(duì)行以及文件末尾空字符的讀取問題,read()readline()方法會(huì)讀取末尾的空字符(這里是換行符)。我們可以通過之前講的rstrip()方法去掉末尾的空字符。

1.3 將文件每一行放入列表中

readlines()方法將文件中每一行存入列表并返回,以下代碼進(jìn)一步處理文件中的內(nèi)容:

# 代碼:
file_name = "pi_digits.txt"

with open(file_name) as file_pi:
    lines = file_pi.readlines()

pi_string = ""
for line in lines:
    pi_string += line.strip()

print(pi_string)
print(len(pi_string))

# 結(jié)果:
3.141592653589793238462643383279
32

注意,Python從文件中讀取出的所有內(nèi)容都是字符串,如果你想要的是數(shù)字,請記得轉(zhuǎn)換。

2. 寫入文件

以下是一個(gè)簡單的文件寫入程序:

filename = "python.txt"
with open(filename, "w") as file_obj:
    file_obj.write("I love python!")

執(zhí)行改代碼后你會(huì)看到在同一目錄下會(huì)生成一個(gè)名為“python.txt"的文件。需要注意的是,以"w"方式打開文件,如果要寫入的文件不存在,則會(huì)自動(dòng)創(chuàng)建該文件;如果該文件存在,該文件的內(nèi)容會(huì)被清空,然后再寫入。如果不想文件被清空,請使用"a"(文件指針放在文件末尾)或"r+"(文件指針指向文件開頭)方式打開文件。還有一點(diǎn),write()函數(shù)不會(huì)在文件末尾添加換行符,如果需要換行符,請自行添加。

3. 異常

Python中使用被稱為異常的特殊對(duì)象來管理程序執(zhí)行期間發(fā)生的錯(cuò)誤。每當(dāng)代碼運(yùn)行時(shí)如果遇到了不能處理的錯(cuò)誤,Python都會(huì)創(chuàng)建一個(gè)異常對(duì)象,如果程序中沒有處理該對(duì)象的相關(guān)代碼,程序?qū)?huì)停止,并顯示一個(gè)traceback,其中包含異常的相關(guān)報(bào)告。如果不想程序因?yàn)槟承┊惓6K止運(yùn)行,則需要我們使用try-except代碼塊自行處理異常。以下是一個(gè)處理除零錯(cuò)誤ZeroDivisionError的例子:

# 代碼:
# 捕捉異常
try:
    resule = 5 / 0
except ZeroDivisionError:
    print("You can"t divide by zero!
")

# 不捕捉異常
print(5 / 0)

# 結(jié)果:
You can"t divide by zero!

Traceback (most recent call last):
  File "division.py", line 29, in 
    print(5 / 0)
ZeroDivisionError: division by zero

如果你打算編寫一個(gè)計(jì)算器應(yīng)用,那么這段代碼必不可少。第一個(gè)例子表明,即使發(fā)生了異常,只要異常被我們捕捉,那么程序便不會(huì)終止。如果只想捕捉異常,但暫時(shí)又不想處理,可以將上述的print("You can"t divide by zero! ")替換為pass語句。如果想捕獲所有的異常,則except后面不指定異常類型。

3.1 else代碼塊

try-except代碼塊還可以和else語句組合形成try-except-else代碼塊,該結(jié)構(gòu)表示,如果捕獲了異常,這執(zhí)行except中的程序,沒有發(fā)生異常則執(zhí)行else中的程序。以下程序是一個(gè)循環(huán)統(tǒng)計(jì)文件中單詞數(shù)的例子,文件讀取的部分被放到了函數(shù)中,該函數(shù)檢測有沒有發(fā)生FileNotFoundError

# 代碼:
def count_words(filename):
    """計(jì)算一個(gè)文件大致包含多少個(gè)單詞"""
    try:
        with open(filename) as f_obj:
            contents = f_obj.read()
    except FileNotFoundError:
        msg = "Sorry, the file" + filename + " does not exist."
        print(msg)
    else:
        # 計(jì)算文件大只包含多少個(gè)單詞
        words = contents.split()
        num_words = len(words)
        print("The file " + filename + " has about " + str(num_words) + "words.")

filenames = ["alice.txt", "siddhartha.txt", "moby_dick.txt", "little_women.txt"]
for filename in filenames:
    count_words(filename)

# 結(jié)果:
The file alice.txt has about 29461 words.
Sorry, the file siddhartha.txt does not exist.
The file moby_dick.txt has about 215136 words.
The file little_women.txt has about 189097 words.

對(duì)else的補(bǔ)充:其實(shí)else不光可以和iftry-except結(jié)合,還可以和for循環(huán)和while循環(huán)結(jié)合,比如:

for i in range(10):
    pass
else:
    pass

i = 0
while i < 10:
    i++
else:
    pass

這里的else表示當(dāng)循環(huán)結(jié)束后執(zhí)行一些語句,比如提示之類的。

3.2 決定報(bào)告哪些錯(cuò)誤

編寫得很好且經(jīng)過詳盡測試的代碼不容易出現(xiàn)內(nèi)部錯(cuò)誤,如語法或邏輯錯(cuò)誤,但只要程序依賴于外部因素,如用戶輸入、存在指定的文件、有網(wǎng)絡(luò)連接等,就有可能出現(xiàn)異常。憑經(jīng)驗(yàn)可判斷改在程序的什么地方包含異常處理塊,以及出現(xiàn)錯(cuò)誤時(shí)該向用戶提供多少相關(guān)的信息。

4. 存儲(chǔ)數(shù)據(jù)

很多程序要求用戶輸入某種信息,也有可能程序中某些變量的數(shù)據(jù)在程序結(jié)束后不能丟失(比如機(jī)器學(xué)習(xí)最后訓(xùn)練出來的模型參數(shù)),這是就需要將這些信息以文件的形式存下來。存儲(chǔ)數(shù)據(jù)的方式有很多,現(xiàn)在比較簡單且通用的是使用json來存儲(chǔ)信息。json(JavaScript Object Notation)格式最初是為JavaScript 開發(fā)的,但隨后成了一種常見格式,并被包括Python在內(nèi)的眾多語言采用。以下是一個(gè)經(jīng)過了重構(gòu)的存儲(chǔ)用戶信息的例子:

import json

def get_stored_username(filename):
    """如果存儲(chǔ)了用戶名,就獲取它"""
    try:
        with open(filename) as f_obj:
            username = json.load(f_obj)
    except FileNotFoundError:
        return None
    else:
        return username

def get_new_username(filename):
    """提示用戶輸入用戶名,并存入文件"""
    username = input("What"s your name?")
    with open(filename, "w") as f_obj:
        json.dump(username, f_obj)
    return username

def greet_user(filename):
    """向用戶打招呼"""
    username = get_stored_username(filename)
    if username:
        print("Welcome back, " + username + "!")
    else:
        username = get_new_username(filename)
        print("We"ll remember you when you come back, " + username + "!")

filename = "username.json"
greet_user(filename)

代碼就不運(yùn)行了,請各位自行推導(dǎo)程序的結(jié)果。最后在username.json文件中會(huì)存有用戶的信息。但要注意一點(diǎn),json根據(jù)數(shù)據(jù)類型來存儲(chǔ)數(shù)據(jù),雖然最后都是字符串,但這個(gè)過程不需要我們干預(yù),比如要存一個(gè)列表,并不需要我們先將其轉(zhuǎn)換為字符串,再存入json,讀取數(shù)據(jù)時(shí)也不需要我們先讀取為字符串,再轉(zhuǎn)換成列表,我們只需直接存取即可,轉(zhuǎn)換工作由json模塊自動(dòng)完成。


迎大家關(guān)注我的微信公眾號(hào)"代碼港" & 個(gè)人網(wǎng)站 www.vpointer.net ~

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/41792.html

相關(guān)文章

  • Python學(xué)習(xí)之路21-序列構(gòu)成的數(shù)組

    摘要:第行把具名元組以的形式返回。對(duì)序列使用和通常號(hào)兩側(cè)的序列由相同類型的數(shù)據(jù)所構(gòu)成當(dāng)然不同類型的也可以相加,返回一個(gè)新序列。從上面的結(jié)果可以看出,它雖拋出了異常,但仍完成了操作查看字節(jié)碼并不難,而且它對(duì)我們了解代碼背后的運(yùn)行機(jī)制很有幫助。 《流暢的Python》筆記。接下來的三篇都是關(guān)于Python的數(shù)據(jù)結(jié)構(gòu),本篇主要是Python中的各序列類型 1. 內(nèi)置序列類型概覽 Python標(biāo)準(zhǔn)庫...

    ralap 評(píng)論0 收藏0
  • scrapy 學(xué)習(xí)之路上的那些坑

    摘要:前言本文記錄自己在學(xué)習(xí)當(dāng)中遇到的各種大小問題,持續(xù)更新。錯(cuò)誤分析本身是一個(gè)網(wǎng)絡(luò)引擎框架,的運(yùn)行依賴于。在打開新建的項(xiàng)目后,報(bào)錯(cuò)顯示。錯(cuò)誤分析的默認(rèn)依賴項(xiàng)當(dāng)中沒有,或者說默認(rèn)查找的路徑中找不到。 前言 本文記錄自己在學(xué)習(xí)scrapy當(dāng)中遇到的各種大小問題,持續(xù)更新。 環(huán)境簡介: 語言版本 爬蟲框架 IDE 系統(tǒng) python3.5 scrapy1.4.0 pycharm win1...

    xiaodao 評(píng)論0 收藏0
  • Python學(xué)習(xí)之路29-序列的修改、散列切片

    摘要:具體方法和上一篇一樣,也是用各個(gè)分量的哈希值進(jìn)行異或運(yùn)算,由于的分量可能很多,這里我們使用函數(shù)來歸約異或值。每個(gè)分量被映射成了它們的哈希值,這些哈希值再歸約成一個(gè)值這里的傳入了第三個(gè)參數(shù),并且建議最好傳入第三個(gè)參數(shù)。 《流暢的Python》筆記。本篇是面向?qū)ο髴T用方法的第三篇。本篇將以上一篇中的Vector2d為基礎(chǔ),定義多維向量Vector。 1. 前言 自定義Vector類的行為...

    馬忠志 評(píng)論0 收藏0
  • Python學(xué)習(xí)之路30-接口:從協(xié)議到抽象基類

    摘要:本篇內(nèi)容將從鴨子類型的動(dòng)態(tài)協(xié)議,逐漸過渡到使接口更明確能驗(yàn)證實(shí)現(xiàn)是否符合規(guī)定的抽象基類。抽象基類介紹完動(dòng)態(tài)實(shí)現(xiàn)接口后,現(xiàn)在開始討論抽象基類,它屬于靜態(tài)顯示地實(shí)現(xiàn)接口。標(biāo)準(zhǔn)庫中的抽象基類從開始,標(biāo)準(zhǔn)庫提供了抽象基類。 《流暢的Python》筆記。本篇是面向?qū)ο髴T用方法的第四篇,主要討論接口。本篇內(nèi)容將從鴨子類型的動(dòng)態(tài)協(xié)議,逐漸過渡到使接口更明確、能驗(yàn)證實(shí)現(xiàn)是否符合規(guī)定的抽象基類(Abst...

    LucasTwilight 評(píng)論0 收藏0
  • Python學(xué)習(xí)之路15-下載數(shù)據(jù)

    摘要:本節(jié)中將繪制幅圖像收盤折線圖,收盤價(jià)對(duì)數(shù)變換,收盤價(jià)月日均值,收盤價(jià)周日均值,收盤價(jià)星期均值。對(duì)數(shù)變換是常用的處理方法之一。 《Python編程:從入門到實(shí)踐》筆記。本篇是Python數(shù)據(jù)處理的第二篇,本篇將使用網(wǎng)上下載的數(shù)據(jù),對(duì)這些數(shù)據(jù)進(jìn)行可視化。 1. 前言 本篇將訪問并可視化以兩種常見格式存儲(chǔ)的數(shù)據(jù):CSV和JSON: 使用Python的csv模塊來處理以CSV(逗號(hào)分隔的值)...

    張春雷 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<