檔案和異常
從檔案中讀取資料
文字檔案可儲存的資料量多的難以置信:天氣資料、交通資料、社會經濟資料、文學作品等
每當需要分析或修改儲存在檔案中的資訊使,讀取檔案都很有用,對資料分析程式來說尤其如此。
要使用文字檔案中的資訊,首先需要將資訊讀取到記憶體中
讀取整個檔案
將下面這個資料存在pi_digits.txt 的檔案中
3.1415926535
8979323846
2643383279
5028841971
6939937510
在pi_digists.txt檔案目錄下建立file_reading.py檔案,其內容如下
with open('pi_digits.txt') as file_object: contents = file_object.read() print(contents)
要以任何方式使用檔案,哪怕僅僅列印其內容,都得開啟這個檔案
函式open()接受一個引數,也就是要開啟檔案的名稱,返回一個表示檔案的物件
在本例中,python將返回的物件賦予給file_object供給以後使用
關鍵字在不需要訪問該檔案時將其關閉。
可以呼叫open() 和 close() 來開啟和關閉檔案。
但有時程式出現bug會導致close()未執行,檔案未關閉,可能導致檔案裡的資料丟失和受損
如果過早呼叫close(),提前關閉檔案,可能會出現更多的錯誤
方法read()讀取這個檔案的全部內容
呼叫後輸出有多餘的空行,可以在呼叫print()時使用rstrip()
print(contents.rstrip())
檔案路徑
上面的檔案是在py檔案的當前目錄中尋找的,如果當前目錄下沒有該檔案呢?
比如此時pi_digists.txt檔案在當前目錄的子資料夾txt_file中,僅僅使用open加檔名是遠遠不夠的
所以需要提供檔案路徑,可提供的檔案路徑有相對檔案路徑和絕對檔案路徑
相對檔案路徑
with open('txt_file/pi_digits.txt') as file_object:
這行程式碼讓python到當前資料夾的子資料夾txt_file中去查詢pi_digists.txt 檔案
絕對檔案路徑
還可以將檔案在計算機的準確位置告知python,比如該檔案位於D盤中的某某資料夾中,可以採用如下的格式
with open('D:/code/python/pythonProject/txt_file/pi_digits.txt') as file_object:
contents = file_object.read()
print(contents.rstrip())
如果一定要使用反斜槓的化,要避免出現\t等情況可以對每個反斜槓進行轉義
with open('D:\\code\\python\\pythonProject\\txt_file\\pi_digits.txt') as file_object:
contents = file_object.read()
print(contents.rstrip())
這種情況也是可以執行的
逐行讀取
可以將檔名稱賦予一個變數,這個變數只是一個讓python知道去哪裡尋找檔案的字串
filename = 'txt_file/pi_digits.txt'
with open(filename) as file_object:
# 逐行列印
for line in file_object:
print(line)
此時空行變多了,因為在這個檔案裡每行末尾都會有一個看不見的換行符
而print還會加上一個換行符,要消除這些多餘的空行可以用rstrip()
filename = 'txt_file/pi_digits.txt'
with open(filename) as file_object:
# 逐行列印
for line in file_object:
print(line.rstrip())
建立一個包含檔案各行內容的列表
filename = 'pi_digits.txt'
with open(filename) as file_object:
lines = file_object.readlines()
print(lines)
for line in lines:
print(line.rstrip())
使用檔案的內容
在讀取文字時,python將所有文字都解讀為字串,
同樣的要讀取數字並使用需要用到int()轉換為整數或float( )轉換為浮點數
filename = 'pi_digits.txt'
with open(filename) as file_object:
lines = file_object.readlines()
pi_string = ''
for line in lines:
pi_string += line.rstrip().strip()
print(pi_string)
print(len(pi_string))
包含一百萬位數字的大檔案(大檔案處理)
圓周率後一百萬位,使用切片等
filename = 'pi_million_digits.txt'
with open(filename) as file_object:
lines = file_object.readlines()
pi_string = ''
for line in lines:
pi_string += line.rstrip().strip()
print(f"{pi_string[:52]}")
print(len(pi_string))
比如可以使用下列語句查詢你的生日是不是在前一百萬位中
filename = 'pi_million_digits.txt'
with open(filename) as file_object:
lines = file_object.readlines()
pi_string = ''
for line in lines:
pi_string += line.rstrip().strip()
birthday = input("Enter your birthday, in form mmddyy: \n")
if birthday in pi_string:
print("appear")
else:
print("not appear")