1. 程式人生 > >Python文件基本操作

Python文件基本操作

TP 結束 種類型 結果 code object 空字符串 close open

Python文件基本操作

1、文件對象的屬性

屬性 描述
file.closed 如果文件已被關閉返回true,否則返回false。
file.mode 返回被打開文件的訪問模式。
file.name 返回文件的名稱。
file.newlines 未讀取到行分隔符時為 None , 只有一種行分隔符時為一個字符串, 當 文件有多種類型的行結束符時,則為一個包含所有當前所遇到的行結束 符的列表
file.encoding 返回文件的編碼方式
file = open(‘allen.txt‘, ‘w‘)
print(file.name)
print(file.mode)
print(file.encoding)
print(file.newlines)

輸出結果:
allen.txt
w
UTF-8
None

2、文件的打開

文件打開是通過內置函數open(),並返回一個文件對象,

file object = open(file_name [, access_mode][, buffering])
  • file_name: file_name變量是一個包含了你要訪問的文件名稱的字符串值。比如:‘hello.text’

  • access_mode:訪問文件的模式,只讀(r),寫入(w),追加(a)等。所有可取值見如下的完全列表。這個參數是非強制的,默認文件訪問模式為只讀(r)。

  • buffering:值為0,訪問文件時不寄存行。值為1,訪問文件時寄存行。值為大於1的正數表示指定寄存區緩沖大小。值為負數時表示寄存區緩沖大小為系統默認。

一表勝十文:

模式 描述
r 以只讀方式打開文件。文件的指針將會放在文件的開頭。這是默認模式.
rb 以二進制格式打開一個文件用於只讀。文件指針將會放在文件的開頭。這是默認模式。一般用於非文本文件如圖片等。
r+ 以讀寫方式打開文件,文件的指針在文件的開頭
rb+ 以二進制格式打開一個文件可以用於讀寫,文件指針放在開頭。一般用於非文本文件如圖片等。
w 以只寫方式打開文件,文件的指針在文件的開頭,如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件。
wb 以二進制格式打開一個文件用於只寫,文件的指針在文件的開頭。如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件。一般用於非文本文件如圖片等。
w+ 打開一個文件用於讀寫。如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件。
wb+ 以二進制格式打開一個文件用於讀寫。如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件。一般用於非文本文件如圖片等。
a 打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容之後。如果該文件不存在,創建新文件進行寫入。
ab 以二進制格式打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容之後。如果該文件不存在,創建新文件進行寫入。r+
a+ 打開一個文件用於讀寫。如果該文件已存在,文件指針將會放在文件的結尾。文件打開時會是追加模式。如果該文件不存在,創建新文件用於讀寫。
ab+ 以二進制格式打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。如果該文件不存在,創建新文件用於讀寫。

一圖勝十表:
技術分享圖片

模式 r r+ w w+ a a+
?? ?? ? ?? ? ??
? ?? ?? ?? ?? ??
創建 ? ? ?? ?? ?? ??
覆蓋 ? ? ?? ?? ? ?
指針在開始 ?? ?? ?? ?? ? ?
指針在結尾 ? ? ? ? ?? ??

3、文件輸入

文件的輸入和輸出是相對應屏幕來說,從讀取文件內容到屏幕上叫輸入,將屏幕上內容寫到文件內叫輸出

3.1 read(size):

用於從文件讀取指定的字節數,size:從文件中讀取的字節數。如果size未給定或為負則讀取所有
allen.txt文件內容

line1
line2
line3
file = open(‘allen.txt‘, ‘r‘)
cont1 = file.read(2)
cont2 = file.read(10)
cont3 = file.read(15)
print(‘cont1=%s‘ % cont1)
print(‘cont2=%s‘ % cont2)
print(‘cont3=%s‘ % cont3)
file.close()

結果:
cont1=li

cont2=ne1
line2

cont3=line3

從結果上看,使用同一個file讀取多次時,指針的位置從上一次讀取的最後位置的下一個位置開始讀取的。

3.2 readline()

用於從文件讀取整行,包括 "\n" 字符。如果指定了一個非負數的參數,則返回指定大小的字節數,包括 "\n" 字符。

fo = open("allen.txt", "r+")
print("文件名為: ", fo.name)

line = fo.readline()
print("讀取第一行 %s" % line)

line = fo.readline(5)
print("讀取的字符串為: %s" % line)
fo.close()

結果:

文件名為:  allen.txt
讀取第一行 line1
讀取的字符串為: line2

3.3 readlines()

用於讀取剩余未讀取的所有行(直到結束符 EOF)並返回列表,而不是所有行,如果碰到結束符 EOF 則返回空字符串。

fo = open("allen.txt", "r+")
print("文件名為: ", fo.name)
line = fo.readlines(1)
print("讀取第一行 %s" % line)
line = fo.readlines()
print("讀取剩余行: %s" % line)
fo.close()

結果:

文件名為:  allen.txt
讀取第一行 [‘line1\n‘]
讀取剩余行: [‘line2\n‘, ‘line3‘]

使用for循環
例子1:

fo = open(‘allen.txt‘, ‘r‘)
for line in fo.readlines():
    print(line)
fo.closed

結果:

line1

line2

line3

例子2:

fo = open(‘allen.txt‘, ‘r‘)
for line in fo.readlines():
    print(line.strip())
fo.closed

再來看加上strip()後的結果

line1
line2
line3

從以上兩個例子中可以看出,readlines()讀取的時候將換行符\n也一塊讀取出來,需要我們自己去掉,其實read()、readline()也是一樣

4、文件輸出

4.1 write()

向文件中寫入指定字符串。

import os

fo = open(‘allen.txt‘, ‘w+‘)
while True:
    line = input(‘input content‘)  # input不會保留換行符,需要自己加上系統的換行符
    if line != ‘.‘:
        fo.write(‘%s%s‘ % (line, os.linesep))
    else:
        break
for line in fo.readlines():
    print(line)
fo.close()

如果我們分別輸入3行:

line4
line5
line6

本來我們“allen.txt”文件中有以下三行:

line1
line2
line3

加上我們輸入的3行應該是

line1
line2
line3
line4
line5
line6

運行結果:

line4
line5
line6

但結果並不是啊,原因是什麽呢?還有為什麽我們要加上os.linesep()

需要註意點:
1、以‘w/w+’模式打開的文件,如果文件存在則會覆蓋,如果文件不存在則會新建。
2、write()和read()一樣並不會操作換行符,需要使用os模塊下os.linesep()加上換行符,否則只會在一行上寫

4.2 writelines()

向文件中寫入一序列的字符串。
這一序列字符串可以是由叠代對象產生的,如一個字符串列表。
換行需要制定換行符 \n。

fo = open(‘allen.txt‘, ‘w+‘)
while True:
    line = input(‘input content‘)  # input不會保留換行符,需要自己加上系統的換行符
    if line != ‘.‘:
        fo.writeline(‘%s%s‘ % (line, os.linesep))
    else:
        break
for line in fo.readlines():
    print(line)
fo.close()

我們輸入3行

line1
line2
line3

打開文件查看結果:

line1
line2
line3

5、文件定位移動

5.1 tell()

例子1:

fo = open(‘allen.txt‘, ‘r‘)
for line in fo.readline():
    print(‘本行內容:%s,指針所在的位置:%d‘ % (line, fo.tell()))
fo.close()
本行內容:line1,指針所在的位置:6
本行內容:line2,指針所在的位置:12
本行內容:line3,指針所在的位置:18

例子2:

fo = open(‘allen.txt‘, ‘r‘)
for line in fo.readlines():
    print(‘本行內容:%s,指針所在的位置:%d‘ % (line, fo.tell()))
fo.close()
本行內容:line1,指針所在的位置:18
本行內容:line2,指針所在的位置:18
本行內容:line3,指針所在的位置:18

從例子1和2中我們可以看出readline()讀取一行,指針的位置移動一行,readlines()是一下子讀取到尾部。

5.2 seek()

seek(offset[, whence]) :沒有返回值
offset -- 偏移量,也就是代表需要移動字節數
whence:可選,默認值為 0。表示要從哪個位置開始偏移;0代表從文件開頭開始算起,1代表從當前位置開始算起,2代表從文件末尾算起

fo = open("allen.txt", "r+")
line = fo.readline()
print("第一次讀取的數據為:%s所在的位置為:%d " % (line, fo.tell()))
# 重新設置文件讀取指針到開頭
fo.seek(0, 0)
line = fo.readline()
print("第二次讀取的數據為:%s所在的位置為:%d " % (line, fo.tell()))
fo.closed
第一次讀取的數據為:line1所在的位置為:6 
第二次讀取的數據為:line1所在的位置為:6 

6、文件叠代

file對象是一個可叠代的對象,可以使用for循環進行叠代

fo = open("allen.txt", "r")
for content in fo:
    print(content)
fo.close()
line1

line2

line3

內功深厚的同學,應該發現了一個問題,上邊所有的例子我們再關閉文件的時候都是直接close(),試想一下,萬一中間出現異常了,close就執行不了,為了保證無論是否出錯都能正確地關閉文件,我們可以使用 try ... finally :

try:
    f = open(‘allen.txt‘, ‘r‘)
    print f.read()
finally:
    if f:
        f.close()

但是每次都這麽寫實在太繁瑣,所以,Python 引入了 with 語句來自動幫我們調用 close() 方法:

with open(‘allen.txt‘, ‘r‘) as f:
    f.read()

是不是很簡潔,有木有

Python文件基本操作