一、方法介紹
Python open() 方法用于打開一個文件,并返回文件對象,在對文件進行處理過程都需要使用到這個函數,如果該文件無法被打開,會拋出 OSError。
注意: 使用 open() 方法一定要保證關閉文件對象,即調用 close() 方法。
1 # open函數的語法格式 2 3 open(file, mode= ' r ' , buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener= None) 4 file: 必需,文件路徑(相對或者絕對路徑)。 5 mode: 可選,文件打開模式 6 buffering: 設置緩沖 7 errors: 報錯級別 8 newline: 區分換行符 9 closefd: 傳入的file參數類型
mode的參數有:
模式
|
描述
|
r
|
以只讀方式打開文件。文件的指針將會放在文件的開頭。這是默認模式。
|
w
|
打開一個文件只用于寫入。如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件。
|
a
|
打開一個文件用于追加。如果該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容之后。如果該文件不存在,創建新文件進行寫入。
|
rb
|
以二進制格式打開一個文件用于只讀。文件指針將會放在文件的開頭。這是默認模式。
|
r+
|
打開一個文件用于讀寫。文件指針將會放在文件的開頭。先讀后寫才是安全的
|
rb+
|
以二進制格式打開一個文件用于讀寫。文件指針將會放在文件的開頭。
|
w+
|
打開一個文件用于讀寫。如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件
|
wb+
|
以二進制格式打開一個文件用于讀寫。如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件。
|
wb
|
以二進制格式打開一個文件只用于寫入。如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件。
|
ab
|
以二進制格式打開一個文件用于追加。如果該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容之后。如果該文件不存在,創建新文件進行寫入。
|
a+
|
打開一個文件用于讀寫。如果該文件已存在,文件指針將會放在文件的結尾。文件打開時會是追加模式。如果該文件不存在,創建新文件用于讀寫。
|
ab+
|
以二進制格式打開一個文件用于追加。如果該文件已存在,文件指針將會放在文件的結尾。如果該文件不存在,創建新文件用于讀寫。
|
file中的常用方法:
方法
|
描述
|
file.close()
|
關閉文件。關閉后文件不能再進行讀寫操作。
|
file.flush()
|
刷新文件內部緩沖,直接把內部緩沖區的數據立刻寫入文件, 而不是被動的等待輸出緩沖區寫入。
|
file.next()
|
返回文件下一行
|
file.read([size])
|
從文件讀取指定的字節數,如果未給定或為負則讀取所有
|
file.readline([size])
|
讀取整行,包括 "\n" 字符。
|
file.readlines([sizehint])
|
讀取所有行并返回列表,若給定sizeint>0,返回總和大約為sizeint
字節的行, 實際讀取值可能比sizhint較大, 因為需要填充緩沖區。
|
file.seek(offset[, whence])
|
設置文件當前位置
|
file.tell()
|
返回文件當前位置。
|
file.truncate([size])
|
截取文件,截取的字節通過size指定,默認為當前文件位置。
|
file.write(str)
|
將字符串寫入文件,沒有返回值
|
file.writelines(sequence)
|
向文件寫入一個序列字符串列表,如果需要換行則要自己加入每行的換行符。
|
二、文件的操作
2.1?讀取文件
2.1.1?read
1 # 路徑有兩種: 2 # 1.相對路徑,相對于當前程序所在的文件夾 3 # ../ 返回上一層目錄 4 # 相對的是當前程序所在的文件夾 5 # 2.絕對路徑 6 # * 從磁盤根目錄尋找 7 # * 互聯網上的絕對路徑 8 9 f = open( " a.txt " , mode= " r " , encoding= " utf-8 " ) 10 11 # read函數的參數是讀取多少個字節,如果不加參數,默認是一次性讀取文件的所有內容 12 data = f.read() 13 # 打印讀取的文件內容 14 print (data) 15 16 # 關閉文件 17 f.close()
2.1.2?readlines
就像read沒有參數時一樣,readlines可以按照行的方式把整個文件中的內容進行一次性讀取,并且返回的是一個列表,其中每一行的數據為一個元素。
f = open( " a.txt " , mode= " r " , encoding= " utf-8 " ) data = f.readlines() # 打印讀取的文件內容 print (type(data)) ## 關閉文件 f.close()
2.1.3 readline?
讀取一行數據
f = open( " a.txt " , mode= " r " , encoding= " utf-8 " ) # 只讀取一行數據 data = f.readline() # 打印讀取的文件內容 print (data) # 關閉文件 f.close()
2.1.4?讀取大文件
f = open( " a.txt " , mode= " r " , encoding= " utf-8 " ) # 讀取大文件的方法 for line in f: print (line) # 關閉文件 f.close()
對可迭代對象 f,進行迭代遍歷:
for line in f
,會自動地使用緩沖IO(buffered IO)以及內存管理,而不必擔心任何大文件的問題。
?2.2?寫文件
1 # w 模式寫文件會將源文件覆蓋 2 f = open( " a.txt " , mode= " w " , encoding= " utf-8 " ) 3 4 f.write( " aaa " ) 5 # 關閉 6 f.close()
1 # 追加 2 f = open( " a.txt " , mode= " a " , encoding= " utf-8 " ) 3 f.write( " ddd " ) 4 f.flush() 5 f.close()
1 # r+ 默認模式指針在文件的開頭 2 # f = open("老師點名", mode="r+", encoding="utf-8") 3 # s = f.read() 4 # print(s) 5 # f.write("周杰倫") 6 # f.close() 7 # 神坑 8 f = open( " 精品 " , mode= " r+ " , encoding= " utf-8 " ) 9 s = f.read(3) # 讀3個字符 10 # 不管你前面讀了幾個,后面去寫都是在末尾 11 f.write( " aabbcc " ) # 沒有任何操作之前進行寫,在開頭寫,如果讀取了一些內容后再寫,則是在最后 12 f.flush() 13 f.close()
文件內的光標移動
1 一: read(3 ): 2 1 . 文件打開方式為文本模式時,代表讀取3個字符 3 2 . 文件打開方式為b模式時,代表讀取3個字節 4 二: 其余的文件內光標移動都是以字節為單位如seek,tell,truncate 5 seek(offset[, whence]) 6 offset -- 開始的偏移量,也就是代表需要移動偏移的字節數,如果是負數表示從倒數第幾位開始 7 whence:可選,默認值為 0。給 offset 定義一個參數,表示要從哪個位置開始偏移;0 代表從文件開頭開始算起,1 代表從當前位置開始算起,2 代表從文件末尾算起。 8 9 10 注意: 11 1. seek有三種移動方式0,1,2 ,其中1和2必須在b模式下進行,但無論哪種模式,都是以bytes為單位移動的 12 2. truncate是截斷文件,所以文件的打開方式必須可寫,但是不能用w或w+等方式打開,因為那樣直接清空文件了,所以truncate要在r+或a或a+ 等模式下測試效果 13
?
1 # !/usr/bin/python3 2 3 # 打開文件 4 fo = open( " runoob.txt " , " r+ " ) 5 print ( " 文件名為: " , fo.name) 6 7 line = fo.readline() 8 print ( " 讀取的數據為: %s " % (line)) 9 10 # 重新設置文件讀取指針到開頭 11 fo.seek(0, 0) 12 line = fo.readline() 13 print ( " 讀取的數據為: %s " % (line)) 14 15 16 # 關閉文件 17 fo.close()
2.3?with操作
1 為了避免打開文件后忘記關閉,可以通過管理上下文,即: 2 with open( ' log ' , ' r ' ) as f: 3 如此方式,當with代碼塊執行完畢時,內部會自動關閉并釋放文件資源。 4 5 在Python 2.7 后,with又支持同時對多個文件的上下文進行管理即: 6 with open( ' log1 ' ) as obj1, open( ' log2 ' ) as obj2:
1 with open( " a.txt " , mode= " r " , encoding= " utf-8 " ) as f: 2 data = f.read() 3 print (data)

# 提示輸入文件 oldFileName = input( " 請輸入要拷貝的文件名字: " ) # 以讀的方式打開文件 oldFile = open(oldFileName, ' rb ' ) # 提取文件的后綴 fileFlagNum = oldFileName.rfind( ' . ' ) if fileFlagNum > 0: fileFlag = oldFileName[fileFlagNum:] # 組織新的文件名字 newFileName = oldFileName[:fileFlagNum] + ' [復件] ' + fileFlag # 創建新文件 newFile = open(newFileName, ' wb ' ) # 把舊文件中的數據,一行一行的進行復制到新文件中 for lineContent in oldFile.readlines(): newFile.write(lineContent) # 關閉文件 oldFile.close() newFile.close()
2.4?文件的相關操作
1 import os 2 3 # 文件重命名 4 os.rename( " 畢業論文.txt " , " 畢業論文-最終版.txt " ) 5 6 # 刪除文件 7 os.remove( " 畢業論文.txt " ) 8 9 # 創建文件夾 10 os.mkdir( " abc " ) 11 12 # 獲取當前目錄 13 os.getcwd() 14 15 # 改變默認目錄 16 os.chdir( " ../ " ) 17 18 # 獲取目錄列表 19 os.listdir( " ./ " ) 20 21 # 刪除文件夾 22 os.rmdir( " abc " )

# 創建新文件,把修改后的文件寫入新文件,刪除老文件,再重命名新文件 import os with open( " 吃的 " , mode= " r " , encoding= " utf-8 " ) as f1, \ open( " 吃的_副本 " , mode= " w " , encoding= " utf-8 " ) as f2: for line in f1: new_line = line.replace( " 肉 " , " 菜 " ) f2.write(new_line) os.remove( " 吃的 " ) # 刪除文件 os.rename( " 吃的_副本 " , " 吃的 " ) # 重命名文件

# coding=utf-8 # 批量在文件名前加前綴 import os funFlag = 1 # 1表示添加標志 2表示刪除標志 folderName = ' ./renameDir/ ' # 獲取指定路徑的所有文件名字 dirList = os.listdir(folderName) # 遍歷輸出所有文件名字 for name in dirList: print name if funFlag == 1 : newName = ' [東哥出品]- ' + name elif funFlag == 2 : num = len( ' [東哥出品]- ' ) newName = name[num:] print newName os.rename(folderName +name, folderName+newName)
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
