打開:有兩種方式
with open(r"data.txt", "r", encoding="utf-8") as f:
f = open(r"data.txt", "r", encoding="utf-8") f.close()
1.使用with管理文件,可以在不需要使用時自動關閉文件。
2.第一個參數是需要打開文件的位置,可以用相對路徑或者絕對路徑表示,如果文件與當前文件在同一級目錄中,直接寫文件名可以
3.文件路徑前的r表示禁用轉義,即如果文件名中出現 \ 符號,會被識別成普通字符而非轉義符
4.第二個參數"r"代表打開模式,打開模式有以下幾種
- "r": 只讀,該文件必須已存在。
- "r+": 可讀可寫。該文件必須已存在,寫為追加在文件內容末尾
- "rb": 表示以二進制方式讀取文件。該文件必須已存在。
- "w": 只寫。打開即默認創建一個新文件,如果文件已存在,則覆蓋寫(即文件內原始數據會被新寫入的數據清空覆蓋)。
- "w+": 寫讀。打開創建新文件並寫入數據,如果文件已存在,則覆蓋寫。
- "wb": 表示以二進制寫方式打開,只能寫文件, 如果文件不存在,創建該文件;如果文件已存在,則覆蓋寫。
- "a": 追加寫。若打開的是已有文件則直接對已有文件操作,若打開文件不存在則創建新文件,只能執行寫(追加在后面),不能讀。
- "a+": 追加讀寫。打開文件方式與寫入方式和'a'一樣,但是可以讀。需注意的是你若剛用‘a+’打開一個文件,一般不能直接讀取,因為此時光標已經是文件末尾,除非你把光標移動到初始位置或任意非末尾的位置。(可以用seek()方法解決這個問題)
5.關鍵字參數encoding是可選參數,當文檔中沒有中文字符時可以不用寫這個參數,當有中文字符時才需要寫(這是因為Windows的默認編碼格式是GBK,而python的默認編碼格式是Unicode.utf-8)
操作:主要有讀和寫兩部分
讀取數據有兩種常見情況,第一種是逐行讀取,第二行是逐個數據讀取
逐行讀取數據,以以下數據為例
zhangsan 1535198308152190 F 69 lisi 1535198106072191 F 91 wangwu 1535198903072192 M 87 xiaoming 1535198811022193 M 76 xiaohong 1535198301262194 F 55
處理方法如下:
with open(r"data.txt", "r", encoding="utf-8") as f: for line in f: data = line.strip("\n").split() print(data) ''' 輸出: ['zhangsan', '1535198308152190', 'F', '69'] ['lisi', '1535198106072191', 'F', '91'] ['wangwu', '1535198903072192', 'M', '87'] ['xiaoming', '1535198811022193', 'M', '76'] ['xiaohong', '1535198301262194', 'F', '55'] '''
注意:1.逐行讀取文件會把每一行最后的換行符也讀取進字符串中,比如上文中for循環讀取或者用f.getline()讀取都會有這個問題,因此需要使用strip函數把頭尾的換行符都去掉(實際上只有尾部有)
2.對於以空格分隔數據的字符串,默認無參的split()函數可以做到以任意多個空格為分界分割字符串,並把空格全部刪除。如果split()中傳入一個字符串作為參數,則split函數會以這個字符串作為標准分割,但是並不會過濾掉分割符。舉例如下:
如果把第三行改成 data = line.strip("\n").split(“ ”)
輸出結果的第一行將會是 ['zhangsan', '', '', '1535198308152190', '', '', 'F', '', '', '69'] ,這時需要自己手動刪除元素 “ ”
最后,讀取出來的全部都是字符串,需要手動轉換成其他類型的值
逐個數據讀取
with open(r"data.txt", "r", encoding="utf-8") as f: data = f.read().split()
read可以把整個文件的內容都讀取出來,read()中可以加一個參數int n,表示讀取文件中的前n個字符,適用於文本中沒有換行符的情況