1. 程式人生 > 其它 >檔案和異常

檔案和異常

從檔案中讀取資料

文字檔案可儲存的資料量多的難以置信:天氣資料、交通資料、社會經濟資料、文學作品等

每當需要分析或修改儲存在檔案中的資訊使,讀取檔案都很有用,對資料分析程式來說尤其如此。

要使用文字檔案中的資訊,首先需要將資訊讀取到記憶體中

讀取整個檔案

將下面這個資料存在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")