【python3的學習之路十四】IO編程
File(文件) 方法
file 對象使用 open 函數來創建
file.close() 關閉文件。關閉後文件不能再進行讀寫操作。 file.flush() 刷新文件內部緩沖,直接把內部緩沖區的數據立刻寫入文件, 而不是被動的等待輸出緩沖區寫入。 file.fileno() 返回一個整型的文件描述符(file descriptor FD 整型), 可以用在如os模塊的read方法等一些底層操作上。 file.isatty() 如果文件連接到一個終端設備返回 True,否則返回 False。 file.next() 返回文件下一行。 file.read([size]) 從文件讀取指定的字節數,如果未給定或為負則讀取所有。 file.readline([size]) 讀取整行,包括"\n" 字符。 file.readlines([sizeint]) 讀取所有行並返回列表,若給定sizeint>0,返回總和大約為sizeint字節的行, 實際讀取值可能比 sizeint 較大, 因為需要填充緩沖區。 file.seek(offset[, whence]) 設置文件當前位置 file.tell() 返回文件當前位置。 file.truncate([size]) 從文件的首行首字符開始截斷,截斷文件為 size 個字符,無 size 表示從當前位置截斷;截斷之後後面的所有字符被刪除,其中 Widnows 系統下的換行代表2個字符大小。 file.write(str) 將字符串寫入文件,返回的是寫入的字符長度。 file.writelines(sequence) 向文件寫入一個序列字符串列表,如果需要換行則要自己加入每行的換行符。
讀文件
要以讀文件的模式打開一個文件對象,需要使用python內置的open()函數。
f = open(‘xxx/test.txt‘, ‘r‘) # 標識符‘r‘表示讀 f.read() # 文件打開成功,調用read()方法可以一次讀取文件的全部內容,Python把內容讀到內存,用一個str對象表示 f.close() # 調用close()方法關閉文件
由於文件讀寫時都有可能產生IOError,一旦出錯,後面的f.close()就不會調用
with open(‘xxx/test.txt‘, ‘r‘) as f: print(f.read())
用readline()可以每次讀取一行內容,調用readline()一次讀取所有內容並按行返回list
for line in f.readlines(): print(line.strip()) # 把末尾的‘\n‘刪掉
字符編碼
要讀取非UTF-8編碼的文本文件,需要給open()函數傳入encoding參數
f.open(‘xxx/test.txt‘, ‘r‘, encoding = ‘GBK‘ errors = ‘ignore‘) f.read() # 遇到有些編碼不規範的文件,可能會遇到UnicodeDecodeError,遇到這種情況,open()函數還接收一個errors參數,表示如果遇到編碼錯誤後如何處理。最簡單的方式是直接忽略
寫文件
調用open()函數時,傳入標識符’w’或者’wb’表示寫文本文件或者二進制文件
f = open(‘xxx/test.txt‘, ‘w‘) f.write(‘Hello, world!‘) f.close()
當我們寫文件時,操作系統往往不會立刻把數據寫入磁盤,而實放入內存緩存起來,空閑的時候再慢慢寫入。只有調用close()方法時,操作系統才保證把沒有寫入的數據全部寫入磁盤,忘記調用close()的後果時數據可能只寫了一部分到磁盤,剩下的丟失。
with open(‘xxx/test.txt‘, ‘w‘) as f: f.write(‘Hello, world!‘)
以’w’模式寫入文件時,如果文件已存在,會直接覆蓋(相當於刪掉後新寫入一個文件)。如果我們希望追加到文件末尾怎麽辦?可以傳入’a’以追加(append)模式寫入。
StringIO
很多時候,數據讀寫不一定時文件,也可以在內存中讀寫。StringIO就是在內存中讀寫str。getvalue()方法用於獲得寫入後的str。
from io import StringIO f = StringIO() f.write(‘hello‘) f.wirte(‘ ‘) f.write(‘world!‘) print(f.getvalue()) # hello world!
要讀取StringIO,可以用一個str初始化StringIO,然後像文件一樣讀取
from io import StringIO f = StringIO(‘Hello!\nHi!\nGoodbye!‘) while True: s = f.readline() if s == ‘‘: break print(s.strip()) # Hello! # Hi! # Goodbye!
bytesIO
StringIO操作的只能是str,如果要操作二進制數據,就需要使用bytesIO。
BytesIO實現了在內存中讀寫bytes,我們創建一個BytesIO,然後寫入一些bytes。
from io import BytesIO f = BytesIO() f.write(‘中文‘, encode(‘UTF-8‘)) print(f.getvalue()) # b‘\xe4\xb8\xad\xe6\x96\x87‘
此時寫入的不是str,而是經過UTF-8編碼的bytes。
和StringIO類似,可以用一個bytes初始化BytesIO,然後像文件一樣讀取
from io import BytesIO f = BytesIO(b‘\xe4\xb8\xad\xe6\x96\x87‘) print(f.read()) b‘\xe4\xb8\xad\xe6\x96\x87‘
OS文件/目錄方法
環境變量
在操作系統中定義的環境變量,全部保存在os.environ這個變量中,可以直接查看
import os os.name # 操作系統類型如果是posix,說明系統是Linux、Unix或Mac OS X,如果是nt,就是Windows系統 os.uname() # 獲取詳細的系統信息,uname()函數在windows上不提供 os.environ # 獲取操作系統中定義的環境變量 os.environ.get(‘PATH‘) # 獲取某個環境變量的值
操作文件和目錄
操作文件和目錄的函數一部分放在os模塊中,一部分放在os.path模塊中。
# 查看當前目錄的絕對路徑: >>> os.path.abspath(‘.‘) ‘/Users/michael‘ # 在某個目錄下創建一個新目錄,首先把新目錄的完整路徑表示出來: >>> os.path.join(‘/Users/michael‘, ‘testdir‘) ‘/Users/michael/testdir‘ # 拆分文件路徑 >>> os.path.split(‘/Users/michael/testdir/file.txt‘) (‘/Users/michael/testdir‘, ‘file.txt‘) # 獲取文件擴展名 >>> os.path.splitext(‘/Users/michael/testdir/file.txt‘) (‘/Users/michael/testdir/file.txt‘, ‘txt‘) # 然後創建一個目錄: >>> os.mkdir(‘/Users/michael/testdir‘) # 刪掉一個目錄: >>> os.rmdir(‘/Users/michael/testdir‘) # 對文件重命名: >>> os.rename(‘test.txt‘, ‘test.py‘) # 刪掉文件: >>> os.remove(‘test.py‘)
【python3的學習之路十四】IO編程