python(基礎---檔案)
檔案**
Linuex中也可用數字表示為:r=4,w=2,x=1 因此rwx=4+2+1=7
- open(file, mode=‘r’, buffering=None, encoding=None, errors=None, newline=None, closefd=True):
讀檔案
引數含義
File:檔案存放路徑
- 檔案路徑是一個字串(包括你要讀取的檔名和檔案字尾名)
- 路徑中”/”或者 “\”表示下級。(”\”中第一個”\”是轉義符)
- 路徑可以是絕對路徑和相對路徑(如果路徑裡只有檔名,則表示的是相對路徑,相當於和該python檔案是同級儲存)
Mode:模式
r: 讀
w: 寫
x: 讀寫
rb: 讀二進位制檔案(圖片,音訊,視訊等)
encoding:字元編碼
GBK:僅在中國通用
Utf-8:萬國通用碼
Ascii
方法:
file = open(“C:\Users\Administrator\Desktop\001.txt”, “r”)
data = file.read(30)
print(file.name)
print(data)
file.close()
read(10)代表著讀取檔案的長度,如果不設定則全部讀取(漢子也算一個長度)
file.name 代表著所讀檔案的檔名
補充:這時候print(“file”)的返回值是001.txt中檔案字串的長度
- file.close()
方法用於關閉一個已開啟的檔案。關閉後的檔案不能再進行讀寫操作, 否則會觸發 ValueError 錯誤。 close() 方法允許呼叫多次。
當 file 物件,被引用到操作另外一個檔案時,Python 會自動關閉之前的 file 物件。 使用 close() 方法關閉檔案是一個好的習慣。
補充:這時候print(“file”)的返回值是None
2. file.flush()****
用來重新整理緩衝區的,即將緩衝區中的資料立刻寫入檔案,同時清空緩衝區,不需要是被動的等待輸出緩衝區寫入。
一般情況下,檔案關閉後會自動重新整理緩衝區,但有時你需要在關閉前重新整理它,這時就可以使用 flush() 方法。
3.file.fileno()
返回一個整型的檔案描述符(file descriptor FD 整型),可用於底層作業系統的 I/O 操作。
在Linux系統中一切皆可以看成是檔案,檔案又可分為:普通檔案、目錄檔案、連結檔案和裝置檔案。檔案描述符(file descriptor)是核心為了高效管理已被開啟的檔案所建立的索引,其是一個非負整數(通常是小整數),用於指代被開啟的檔案,所有執行I/O操作的系統呼叫都通過檔案描述符。程式剛剛啟動的時候,0是標準輸入,1是標準輸出,2是標準錯誤。如果此時去開啟一個新的檔案,它的檔案描述符會是3。POSIX標準要求每次開啟檔案時(含socket)必須使用當前程序中最小可用的檔案描述符號碼,因此,在網路通訊過程中稍不注意就有可能造成串話
4. file.isatty()
檢測檔案是否連線到一個終端裝置,如果是返回 True,否則返回 False。
5. file.next()
ython 3 的內建函式 next() 通過迭代器呼叫 next() 方法返回下一項。 在迴圈中,next()方法會在每次迴圈中呼叫,該方法返回檔案的下一行,如果到達結尾(EOF),則觸發 StopIteration
6. file.read([size])
從檔案讀取指定的位元組數,如果未給定或為負則讀取所有。(返回一個字串型別)
7. file.readline([size])
用於從檔案讀取整行,包括 “\n” 字元。如果指定了一個非負數的引數,則返回指定大小的位元組數,包括 “\n” 字元。
如果size 超出了當前行的字元長度,則只顯示當前行,不會顯示下一行的字元,但是游標的位置是下一行的開始
8. file.readlines([sizeint])
用於讀取所有行(直到結束符 EOF)並返回列表,該列表可以由 Python 的 for… in … 結構進行處理。 如果碰到結束符 EOF 則返回空字串。
若有sizeint引數時候:
若Sizeint小於第一行長度(一個字元和漢字都長度都為1)則列印第一行的所有內容,若sizeint大於第一行長度小於第二行長度(換行是長度加1,不加2,計算游標時才加2)則列印第一行和第二行所有的內容,以此類推。
9.file.seek(offset[, whence])
offset – 開始的偏移量,也就是代表需要移動偏移的位元組數
whence:可選,預設值為 0。給offset引數一個定義,表示要從哪個位置開始偏移;0代表從檔案開頭開始算起,1代表從當前位置開始算起,2代表從檔案末尾算起。
10.file.tell()
方法返回檔案的當前位置,即檔案指標當前位置。
12. file.truncate([size])
用於從檔案的首行首字元開始截斷,截斷檔案為 size 個字元,無 size 表示從當前位置截斷;截斷之後 V 後面的所有字元被刪除,其中 Widnows 系統下的換行代表2個字元大小。
13. file.write(str)
用於向檔案中寫入指定字串。
在檔案關閉前或緩衝區重新整理前,字串內容儲存在緩衝區中,這時你在檔案中是看不到寫入的內容的。
如果檔案開啟模式帶 b,那寫入檔案內容時,str (引數)要用 encode 方法轉為 bytes 形式,否則報錯:TypeError: a bytes-like object is required, not ‘str’。
14. file.writelines(sequence)
向檔案中寫入一序列的字串。這一序列字串可以是由迭代物件產生的,如一個字串列表。換行需要制定換行符 \n。
13. 補充:
1.
for i in file:
print(i, end="\r")
file.close()
實行結果:
街
燈1
下你
是風1
又似畫s,
恍若燈火處的畫中仙
不食人間煙火,又讓人
難以靠近。
1323465465465465
for i in file:
print(i, end="\r")
print(9999999999, end="")
file.close()
實行結果:
街
燈1
下你
是風1
又似畫s,
恍若燈火處的畫中仙
不食人間煙火,又讓人
難以靠近。
9999999999
結論:
1讀檔案時候print(i, end="\r") 讀完後將游標移動到開始,但是前面沒有被覆蓋掉,因為讀完一行後,Pycharm列印面板上的游標移動到當前行的第一個,但是讀取檔案中的游標換行,列印面板中的游標就換行了,繼續列印,沒有影響。
2.讀取到檔案最後一行時候,游標移動到當前行的第一行,檔案結尾時,讀取檔案中的游標不會換行,在執行print(9999999999, end="")時候就將檔案中的最後一行覆蓋掉。
7. end="\r" 指的是列印面板的游標,和檔案中的游標沒有關係。
2.
print(file.readline(1)) 數字代表讀取該行中的前幾個字元,無參時讀取整行資料
print(file.readlines(1)) 數字要讀取到的字元總數,引數如果超過一行的總數,則自動讀取下一行,作為下一個列表元素。無參時讀取所有資料等價於read,但返回值是每行組成一個元素(元素末尾是”\n”結束)的列表eg [‘街\n’, ‘燈1\n’]
寫檔案
file = open(“C:\Users\Administrator\Desktop\002.txt”, mode=“w”)
如果檔案不存在,則新建一個檔案,如果存在,則覆蓋後寫檔案
要寫入特定編碼的文字檔案,請給open()函式傳入encoding引數,將字串自動轉換成指定編碼
檔案相關補充:
1.
讀取的時候換行 +1,漢字和字元各佔一個
計算游標位置時,游標換行 +2 (漢字佔兩個游標,換行也是兩個游標)
Eg:
001.txt檔案
132三星星fa
今天是星期三
今天是星期11
今天是星期11
1
2
3
4
file = open(“C:\Users\Administrator\Desktop\001.txt”, mode=“r”)
file.seek(0)
i = file.read(8)
print(file.tell())
print(i)
file.close()
實行結果:
18446744073709551628
132三星星fa
i = file.read(9)
實行結果:
14
132三星星fa
i = file.read(15)
實行結果:
25
132三星星fa
今天是星期三
i = file.read(16)
實行結果:
27
132三星星fa
今天是星期三
2. os.path.join()
os.path.join()函式中可以傳入多個路徑:
第一個絕對路徑之前的引數將被忽略
以上一種情況為先。在上一種情況確保情況下,若出現”./”開頭的引數,會從”./”開頭的引數的上一個引數開始拼接。
注意:可以將多個路徑進行拼接,第一個絕對路徑之前的引數將被忽略
也就是說,如果path2的第一個字元是‘/’,那麼返回的拼接路徑中path1並沒有包含。
3. os.path.isdir()用於判斷物件是否為一個目錄
os.listdir()用於返回一個由檔名和目錄名組成的列表,需要注意的是它接收的引數需要是一個絕對的路徑
4.執行完自動close,避免忘記關閉檔案導致資源的佔用,般來說推薦以下方法:
寫
with open(‘test.txt’, ‘w’, encoding=‘utf-8’) as f:
f.write(‘test’)
#讀
with open(‘test.txt’, ‘r’, encoding=‘utf-8’) as f:
f.readlines()
註解:
1.當執行open語句時,先呼叫物件的__enter__()方法,執行完with裡面的程式碼塊的時候,在呼叫物件的__exit__()方法,檔案的關閉語句在__exit__()裡面執行
2.as 後面的物件是__enter__()方法返回的物件 ,是第一個引數(檔案路徑)進行“r”或者“w”或者其它操作後返回的一個物件
注意:
With只支援這兩個方法,少一個都不行
5. 遇到有些編碼不規範的檔案,你可能會遇到UnicodeDecodeError,因為在文字檔案中可能夾雜了一些非法編碼的字元。遇到這種情況,open()函式還接收一個errors引數,表示如果遇到編碼錯誤後如何處理。最簡單的方式是直接忽略:
f = open(’/Users/michael/gbk.txt’, ‘r’, encoding=‘gbk’, errors=‘ignore’)
6.檔案開啟模式 “x”
如果檔案已經存在,使用此模式開啟將引發異常
pickle 模組
python的pickle模組實現了基本的資料序列和反序列化。
通過pickle模組的序列化操作我們能夠將程式中執行的物件資訊儲存到檔案中去,永久儲存。
通過pickle模組的反序列化操作,我們能夠從檔案中建立上一次程式儲存的物件。
基本介面:
pickle.dump(obj, file, [,protocol])
有了 pickle 這個物件, 就能對 file 以讀取的形式開啟:
x = pickle.load(file)
列印
ppprint.pprint(x)