- Python數據分析基礎
- (美)克林頓·布朗利
- 1720字
- 2020-05-06 16:34:59
1.5 讀取文本文件
數據幾乎無一例外地是被保存在文件中的。這些文件可能是文本文件、CSV文件、Excel文件或其他類型的文件。知道如何訪問此類文件以及從中讀取數據是在Python中進行數據處理、加工與分析的前提。當完成了一個每秒鐘可以處理很多文件的程序時,與手動一個個地處理文件相比,你會真正體會到寫程序的好處。
你需要告訴Python,腳本要處理何種類型的文件。你可以在程序中寫死文件名稱,但是如果這樣的話,就不能使用這個程序處理多個不同的文件了。能讀取多個不同文件的方法是,在命令行窗口或終端窗口的命令行中,在Python腳本的名字后面加上完整的文件路徑名。要使用這種方法,需要在腳本開始時導入內置的sys模塊。在腳本上方加上import sys語句之后,就可以在腳本中使用sys模塊提供的所有功能了:
#!/usr/bin/env python3 from math import exp, log, sqrt import re from datetime import date, time, datetime, timedelta from operator import itemgetter import sys
導入了sys模塊之后,你就可以使用argv這個列表變量了。這個變量捕獲了傳遞給Python腳本的命令行參數列表,即你在命令行中的所有輸入,包括你的腳本名稱。和任何其他列表一樣,argv也有索引。argv[0]就是腳本名稱,argv[1]是命令行中傳遞給腳本的第一個附加參數,在這個例子中,就是first_script.py將要讀取的文件路徑名。
1.5.1 創建文本文件
要讀取一個文本文件,首先要創建它。要創建文本文件,需執行以下步驟。
(1)打開Spyder IDE或一個文本編輯器(例如:Windows系統下的Notepad、Notepad++、Sublime Text;macOS系統下的TextMate、TextWrangler、Sublime Text)。
(2)在文本文件中寫入下面6行(參見圖1-10):
I'm already much better at Python.

圖1-10:Notepad++中的文本文件file_to_read.txt(Windows)
(3)將文件保存在桌面上,文件名為file_to_read.txt。
(4)將下面幾行代碼添加到first_script.py的下方:
# 讀取文件 # 讀取單個文本文件 input_file = sys.argv[1] print "Output #143: " filereader = open(input_file, 'r') for row in filereader: print row.strip() filereader.close()
示例中的第一行代碼使用sys.argv列表捕獲了要讀取的文件的路徑名,并將路徑名賦給變量input_file。第二行代碼創建了一個文件對象filereader,其中包含了以r模式(只讀模式)打開的input_file文件中的各個行。下一行中的for循環每次讀取filereader對象中的一行。for循環內部的print語句打印出每一行,并且在打印之前用strip函數去掉每一行兩端的空格、制表符和換行符。最后一行代碼在輸入文件中的所有行都被讀取并打印到屏幕后,關閉filereader對象。
(5)重新保存first_script.py。
(6)要讀取剛才創建的文本文件,輸入下面的命令,如圖1-11所示,然后按回車鍵:
python first_script.py file_to_read.txt

圖1-11:Python腳本和它要在命令行窗口中處理的文本文件
這樣,你就在Python中讀取了一個文本文件。你會看到下面的內容被打印到屏幕上,在以前的輸出之后(圖1-12):
I'm already much better at Python.

圖1-12:first_script.py的輸出,在命令行窗口中處理文本文件
1.5.2 腳本和輸入文件在同一位置
因為first_script.py和file_to_read.txt在同一位置,即都在桌面上,所以簡單地輸入python first_script.py file_to_read.txt是可以的。如果文本文件和腳本不在同一位置,就需要輸入文本文件的完整路徑名,這樣腳本才能知道去哪里尋找這個文件。
例如,如果文本文件在你的Documents文件夾中,而不是在桌面上,那么你可以在命令行中使用下面的路徑名來從其所處位置讀取文本文件:
python first_script.py "C:\Users\[Your Name]\Documents\file_to_read.txt"
1.5.3 讀取文件的新型語法
前面講的用來創建filereader對象的那行代碼是創建文件對象的傳統方法。這種方法沒有什么問題,但是它使文件對象一直處于打開狀態,直到使用close函數明確地關閉或直到腳本結束。盡管這種做法一般沒有問題,但不夠清晰,還被證明在更復雜的腳本中會導致錯誤。從Python 2.5開始,你可以使用with語句來創建文件對象。這種語法在with語句結束時會自動關閉文件:
input_file = sys.argv[1] print("Output #144:") with open(input_file, 'r', newline='') as filereader: for row in filereader: print("{}".format(row.strip()))
你可以看到,使用with語句的版本與前一個版本非常相似,但是它不需調用close函數來關閉filereader對象。
這個示例演示了如何使用sys.argv來訪問并打印一個文本文件中的內容。這是一個簡單的示例,但在后面的示例中,要以此為基礎訪問其他類型的文件,或一次訪問多個文件,并向輸出文件中寫入內容。
下一節介紹glob模塊,它讓你能夠通過幾行代碼讀取和處理多個輸入文件。glob模塊之所以功能強大,是因為它處理的是文件夾(也就是說,它處理目錄,不是單個的文件),所以將前面讀取文件的代碼刪除或注釋掉,這樣就可以使argv[1]指向一個文件夾,而不是一個文件了。將代碼注釋掉就是在你希望計算機忽略掉的代碼前面加上一個井號,所以當你結束注釋時,first_script.py文件就應該像下面這樣:
## 讀取一個文本文件(舊方法) ## #input_file = sys.argv[1] #print("Output #143:") #filereader = open(input_file, 'r', newline='') #for row in filereader: # print("{}".format(row.strip())) #filereader.close() ## 讀取一個文本文件(新方法) ## #input_file = sys.argv[1] #print("Output #144:") #with open(input_file, 'r', newline='') as filereader: # for row in filereader: # print("{}".format(row.strip()))
做完這些修改之后,你就可以添加下一節要討論的glob代碼來處理多個文件了。