with open('11.txt') as file_object: #函數open()打開文件
contents = file_object.read() #讀取文件的內容
print(contents)
關鍵字 with: 在不再需要訪問文件後將其關閉。通過with可讓Python去確定:你只管打開文件,並在需要時使用它,Python自會在合適的時候自動將其關閉。
函數 open(): 要以任何方式使用文件,都得先打開文件,這樣才能訪問它。
read(): 讀取這個文件的全部內容
相對文件路徑: 該位置是相對於當前運行的程序所在目錄的。
絕對文件路徑: 該文件與當前程序不在同一文件夾下,則需要提供完整的文件路徑。
file_path='D:\python\other_files\text_files\11.txt'
with open(file_path) as file_object:
注意:在 Windows 系統中,在文件路徑中使用反斜槓(\),而在 Linux 和 OS X 中用斜槓(/)。
要以每次一行的方式檢查文件,可對文件對象使用 for 循環。
filename = '11.txt'
with open(filename) as file_object:
for line in file_object:
print(line.rstrip()) #rstrip()消除多余的空白行
使用關鍵字 with 時,open() 返回的文件對象只在 with 代碼塊內可用。 如果要在 with 代碼塊外訪問文件的內容,可在 with 代碼塊內將文件的各行存儲在一個列表中,並在 with 代碼塊外使用該列表。
filename = '11.txt'
with open(filename) as file_object:
lines = file_object.readlines() #readlines()從文件中讀取每一行,並將其存儲在一個列表中
#在with代碼塊外打印內容
for line in lines:
print(line.rstrip()) #rstrip()消除多余的空白行
filename = '11.txt'
with open(filename) as file_object:
lines = file_object.readlines()
pi = '' #變量pi用於存儲圓周率的值
for line in lines:
pi += line.strip() #strip()消除左右的空格
print(pi) #輸出3.141592653589793238462643383279
print(len(pi)) #輸出32
注意:讀取文本文件時,Python 將其中的所有文本都解讀為字符串。如果你讀取的是數字,並要將其作為數值使用,就必須使用函數 int() 將其轉換為整數,或使用函數 float() 將其轉換為浮點數。
保存數據的最簡單的方式之一是將其寫入到文件中。通過將輸出寫入文件,即便關閉包含程序輸出的終端窗口,這些輸出也依然存在。
filename = 'program.txt'
#open()提供兩個參數:要打開的文件的名稱、'w'寫入模式
with open(filename, 'w') as file_object:
file_object.write("Hello, Aiolei!") #write()將一個字符串寫入文件
打開文件時,可指定讀取模式:讀取模式 (‘r’)、寫入模式 (‘w’)、附加模式(‘a’)或讓你能夠讀取和寫入文件的模式(‘r+’)。如果你省略了模式實參,Python 將以默認的只讀模式打開文件。
如果你要寫入的文件不存在,函數 open() 將自動創建它。然而,以寫入模式打開文件時千萬要小心,因為如果指定的文件已經存在,Python 將在返回文件對象前清空該文件。
注意:Python 只能將字符串寫入文本文件。要將數值數據存儲到文本文件中,必須先使用函數 str() 將其轉換為字符串格式。
函數 write() 不會在你寫入的文本末尾添加換行符,如果寫入多行需要自己加 ’\n’
filename = 'program.txt'
with open(filename, 'w') as file_object:
file_object.write("Hello, Aiolei!\n")
file_object.write("2020")
如果你要給文件添加內容,而不是覆蓋原有的內容,可以附加模式打開文件。以附加模式打開文件時,Python 不會在返回文件對象前清空文件,而你寫入到文件的行都將添加到文件末尾。
filename = 'program.txt'
with open(filename, 'a') as file_object: #'a'附加模式
file_object.write("Today is a good day!\n")
file_object.write("Happy\n")
我們會發現:文件原來的內容還在,後兩排是剛添加的內容,沒有覆蓋文件原來的內容。
每當發生讓 Python 不知所措的錯誤時,它都會創建一個異常對象。如果你編寫了處理該異常的代碼,程序將繼續運行;如果你未對異常進行處理,程序將停止,並顯示一個 traceback,其中包含有關異常的報告。
異常是使用 try-except 代碼塊處理的。try-except 代碼塊讓 Python 執行指定的操作,同時告訴 Python 發生異常時怎麼辦。使用了 try-except 代碼塊時,即便出現異常,程序也將繼續運行:顯示你編寫的友好的錯誤消息,而不是令用戶迷惑的 traceback。
如果 try 代碼塊中的代碼運行起來沒有問題,Python 將跳過 except 代碼塊;如果 try 代碼塊中的代碼導致了錯誤,Python 將查找這樣的 except 代碼塊,並運行其中的代碼。
try:
print(6/0)
except ZeroDivisionError:
print("You can't divide by 0!")
如果 try-except 代碼塊後面還有其他代碼,程序將接著運行。
try-except-else 代碼塊的工作原理大致如下:Python 嘗試執行 try 代碼塊中的代碼;只有可能引發異常的代碼才需要放在 try 語句中。有時候,有一些僅在 try 代碼塊成功執行時才需要運行的代碼;這些代碼應放在 else 代碼塊中。
print("Give me two numbers, and I'll divide them.")
print("Enter 'q' to quit.")
while True:
first_number = input("\nFirst number: ")
if first_number == 'q':
break
second_number = input("Second number: ")
if second_number == 'q':
break
try:
answer = int(first_number) / int(second_number)
except ZeroDivisionError:
print("You can't divide by 0!")
else: #依賴於try 代碼塊成功執行的代碼都應放到else代碼塊中
print(answer)
filename = 'program.txt'
try:
with open(filename) as file_object:
contents = file_object.read()
except FileNotFoundError:
msg = "Sorry, the file " + filename + " does not exist."
print(msg)
else:
#split() 以空格為分隔符將字符串分拆成多個部分,並將這些部分都存儲到一個列表中
words = contents.split()
num_words = len(words) #計算文件大致包含多少個單詞
print("The file " + filename + " has about " + str(num_words) + " words.")
def count_words(filename): #計算單詞個數函數
try:
with open(filename) as file_object:
contents = file_object.read()
except FileNotFoundError:
msg = "Sorry, the file " + filename + " does not exist."
print(msg)
else:
#split() 以空格為分隔符將字符串分拆成多個部分,並將這些部分都存儲到一個列表中
words = contents.split()
num_words = len(words) #計算文件大致包含多少個單詞
print("The file " + filename + " has about " + str(num_words) + " words.")
filenames = ['program.txt', '11.txt', 'result.txt', 'data.txt']
for filename in filenames:
count_words(filename)
有時候你希望程序在發生異常時一聲不吭,就像什麼都沒有發生一樣繼續運行。 要讓程序在失敗時一聲不吭,在 except 代碼塊中明確地告訴 Python 什麼都不要做,用 pass 語句。
try:
......
except FileNotFoundError:
pass #什麼也不做
else:
......
模塊 json 能夠將簡單的 Python 數據結構轉儲到文件中,並在程序再次運行時加載該文件中的數據。還可以使用 json 在 Python 程序之間分享數據。更重要的是,JSON 數據格式並非 Python 專用的,這能夠將以 JSON 格式存儲的數據與使用其他編程語言的人分享。
json.dump():存儲數字
函數 json.dump() 接受兩個實參:要存儲的數據以及可用於存儲數據的文件對象。
import json #導入模塊json
numbers = [2,3,4,5,7,8]
filename = 'numbers.json' #使用文件擴展名.json來指出文件存儲的數據為JSON格式
with open(filename, 'w') as f_obj:
json.dump(numbers, f_obj)
json.load():將列表讀取到內存中
import json #導入模塊json
filename = 'numbers.json'
with open(filename) as f_obj:
numbers = json.load(f_obj)
print(numbers)
import json
#若以前存儲了用戶名,就加載它;否則就提示用戶輸入用戶名並存儲它
filename = 'username.json'
try:
with open(filename) as f_obj:
username = json.load(f_obj) #加載
except FileNotFoundError:
username = input("What is your name?") #輸入用戶名
with open(filename, 'w') as f_obj:
json.dump(username, f_obj) #存儲用戶名
else:
print("Welcome back, " + username + "!")
將代碼劃分為一系列完成具體工作的函數,這樣的過程被稱為重構。重構讓代碼更清晰、更易於理解、更容易擴展。
import json
def get_username(): #如果存儲了用戶名就獲取它
filename = 'username.json'
try:
with open(filename) as f_obj:
username = json.load(f_obj) #加載
except FileNotFoundError:
return None
else:
return username
def greet(): #問候用戶
username = get_username()
if username:
print("Welcome back, " + username + "!")
else:
username = input("What is your name?") #輸入用戶名
filename = 'username.json'
with open(filename, 'w') as f_obj:
json.dump(username, f_obj) #存儲用戶名
greet()