python入門教程之十二Open及file操作


讀和寫文件

open() 將會返回一個 file 對象,基本語法格式如下:

open(filename, mode)
  • filename:包含了你要訪問的文件名稱的字符串值。
  • mode:決定了打開文件的模式:只讀,寫入,追加等。所有可取值見如下的完全列表。這個參數是非強制的,默認文件訪問模式為只讀(r)。

不同模式打開文件的完全列表:

模式 描述
r 以只讀方式打開文件。文件的指針將會放在文件的開頭。這是默認模式。
rb 以二進制格式打開一個文件用於只讀。文件指針將會放在文件的開頭。
r+ 打開一個文件用於讀寫。文件指針將會放在文件的開頭。
rb+ 以二進制格式打開一個文件用於讀寫。文件指針將會放在文件的開頭。
w 打開一個文件只用於寫入。如果該文件已存在則打開文件,並從開頭開始編輯,即原有內容會被刪除。如果該文件不存在,創建新文件。
wb 以二進制格式打開一個文件只用於寫入。如果該文件已存在則打開文件,並從開頭開始編輯,即原有內容會被刪除。如果該文件不存在,創建新文件。
w+ 打開一個文件用於讀寫。如果該文件已存在則打開文件,並從開頭開始編輯,即原有內容會被刪除。如果該文件不存在,創建新文件。
wb+ 以二進制格式打開一個文件用於讀寫。如果該文件已存在則打開文件,並從開頭開始編輯,即原有內容會被刪除。如果該文件不存在,創建新文件。
a 打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容之后。如果該文件不存在,創建新文件進行寫入。
ab 以二進制格式打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容之后。如果該文件不存在,創建新文件進行寫入。
a+ 打開一個文件用於讀寫。如果該文件已存在,文件指針將會放在文件的結尾。文件打開時會是追加模式。如果該文件不存在,創建新文件用於讀寫。
ab+ 以二進制格式打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。如果該文件不存在,創建新文件用於讀寫。

下圖很好的總結了這幾種模式:

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

以下實例將字符串寫入到文件 foo.txt 中:

實例

#!/usr/bin/python3

# 打開一個文件
f = open("/tmp/foo.txt", "w")

f.write( "Python 是一個非常好的語言。\n是的,的確非常好!!\n" )

# 關閉打開的文件
f.close()
  • 第一個參數為要打開的文件名。
  • 第二個參數描述文件如何使用的字符。 mode 可以是 'r' 如果文件只讀, 'w' 只用於寫 (如果存在同名文件則將被刪除), 和 'a' 用於追加文件內容; 所寫的任何數據都會被自動增加到末尾. 'r+' 同時用於讀寫。 mode 參數是可選的; 'r' 將是默認值。

此時打開文件 foo.txt,顯示如下:

$ cat /tmp/foo.txt 
Python 是一個非常好的語言。
是的,的確非常好!!

文件對象的方法

本節中剩下的例子假設已經創建了一個稱為 f 的文件對象。

f.read()

為了讀取一個文件的內容,調用 f.read(size), 這將讀取一定數目的數據, 然后作為字符串或字節對象返回。

size 是一個可選的數字類型的參數。 當 size 被忽略了或者為負, 那么該文件的所有內容都將被讀取並且返回。

以下實例假定文件 foo.txt 已存在(上面實例中已創建):

實例

#!/usr/bin/python3

# 打開一個文件
f = open("/tmp/foo.txt", "r")

str = f.read()
print(str)

# 關閉打開的文件
f.close()

執行以上程序,輸出結果為:

Python 是一個非常好的語言。
是的,的確非常好!!

f.readline()

f.readline() 會從文件中讀取單獨的一行。換行符為 '\n'。f.readline() 如果返回一個空字符串, 說明已經已經讀取到最后一行。

實例

#!/usr/bin/python3

# 打開一個文件
f = open("/tmp/foo.txt", "r")

str = f.readline()
print(str)

# 關閉打開的文件
f.close()

執行以上程序,輸出結果為:

Python 是一個非常好的語言。

f.readlines()

f.readlines() 將返回該文件中包含的所有行。

如果設置可選參數 sizehint, 則讀取指定長度的字節, 並且將這些字節按行分割。

實例

#!/usr/bin/python3

# 打開一個文件
f = open("/tmp/foo.txt", "r")

str = f.readlines()
print(str)

# 關閉打開的文件
f.close()

執行以上程序,輸出結果為:

['Python 是一個非常好的語言。\n', '是的,的確非常好!!\n']

另一種方式是迭代一個文件對象然后讀取每行:

實例

#!/usr/bin/python3

# 打開一個文件
f = open("/tmp/foo.txt", "r")

for line in f:
    print(line, end='')

# 關閉打開的文件
f.close()

執行以上程序,輸出結果為:

Python 是一個非常好的語言。
是的,的確非常好!!

這個方法很簡單, 但是並沒有提供一個很好的控制。 因為兩者的處理機制不同, 最好不要混用。

f.write()

f.write(string) 將 string 寫入到文件中, 然后返回寫入的字符數。

實例

#!/usr/bin/python3

# 打開一個文件
f = open("/tmp/foo.txt", "w")

num = f.write( "Python 是一個非常好的語言。\n是的,的確非常好!!\n" )
print(num)
# 關閉打開的文件
f.close()

執行以上程序,輸出結果為:

29

如果要寫入一些不是字符串的東西, 那么將需要先進行轉換:

實例

#!/usr/bin/python3

# 打開一個文件
f = open("/tmp/foo1.txt", "w")

value = ('www.runoob.com', 14)
s = str(value)
f.write(s)

# 關閉打開的文件
f.close()

執行以上程序,打開 foo1.txt 文件:

$ cat /tmp/foo1.txt 
('www.runoob.com', 14)

f.tell()

f.tell() 返回文件對象當前所處的位置, 它是從文件開頭開始算起的字節數。

f.seek()

如果要改變文件當前的位置, 可以使用 f.seek(offset, from_what) 函數。

from_what 的值, 如果是 0 表示開頭, 如果是 1 表示當前位置, 2 表示文件的結尾,例如:

 

  • seek(x,0) : 從起始位置即文件首行首字符開始移動 x 個字符
  • seek(x,1) : 表示從當前位置往后移動x個字符
  • seek(-x,2):表示從文件的結尾往前移動x個字符

from_what 值為默認為0,即文件開頭。下面給出一個完整的例子:

>>> f = open('/tmp/foo.txt', 'rb+')
>>> f.write(b'0123456789abcdef')
16
>>> f.seek(5)     # 移動到文件的第六個字節
5
>>> f.read(1)
b'5'
>>> f.seek(-3, 2) # 移動到文件的倒數第三字節
13
>>> f.read(1)
b'd'

 

f.close()

在文本文件中 (那些打開文件的模式下沒有 b 的), 只會相對於文件起始位置進行定位。

當你處理完一個文件后, 調用 f.close() 來關閉文件並釋放系統的資源,如果嘗試再調用該文件,則會拋出異常。

>>> f.close()
>>> f.read()
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
ValueError: I/O operation on closed file

當處理一個文件對象時, 使用 with 關鍵字是非常好的方式。在結束后, 它會幫你正確的關閉文件。 而且寫起來也比 try - finally 語句塊要簡短:

>>> with open('/tmp/foo.txt', 'r') as f:
...     read_data = f.read()
>>> f.closed
True

文件對象還有其他方法, 如 isatty() 和 trucate(), 但這些通常比較少用。


pickle 模塊

python的pickle模塊實現了基本的數據序列和反序列化。

通過pickle模塊的序列化操作我們能夠將程序中運行的對象信息保存到文件中去,永久存儲。

通過pickle模塊的反序列化操作,我們能夠從文件中創建上一次程序保存的對象。

基本接口:

pickle.dump(obj, file, [,protocol])

有了 pickle 這個對象, 就能對 file 以讀取的形式打開:

x = pickle.load(file)

注解:從 file 中讀取一個字符串,並將它重構為原來的python對象。

file: 類文件對象,有read()和readline()接口。

實例 1

#!/usr/bin/python3
import pickle

# 使用pickle模塊將數據對象保存到文件
data1 = {'a': [1, 2.0, 3, 4+6j],
         'b': ('string', u'Unicode string'),
         'c': None}

selfref_list = [1, 2, 3]
selfref_list.append(selfref_list)

output = open('data.pkl', 'wb')

# Pickle dictionary using protocol 0.
pickle.dump(data1, output)

# Pickle the list using the highest protocol available.
pickle.dump(selfref_list, output, -1)

output.close()

實例 2

#!/usr/bin/python3
import pprint, pickle

#使用pickle模塊從文件中重構python對象
pkl_file = open('data.pkl', 'rb')

data1 = pickle.load(pkl_file)
pprint.pprint(data1)

data2 = pickle.load(pkl_file)
pprint.pprint(data2)

pkl_file.close()
 
 

Python3 File(文件) 方法

序號 方法及描述
1

file.close()

關閉文件。關閉后文件不能再進行讀寫操作。

2

file.flush()

刷新文件內部緩沖,直接把內部緩沖區的數據立刻寫入文件, 而不是被動的等待輸出緩沖區寫入。

3

file.fileno()

返回一個整型的文件描述符(file descriptor FD 整型), 可以用在如os模塊的read方法等一些底層操作上。

4

file.isatty()

如果文件連接到一個終端設備返回 True,否則返回 False。

5

file.next()

Python 3 中的 File 對象不支持 next() 方法。

返回文件下一行。

6

file.read([size])

從文件讀取指定的字節數,如果未給定或為負則讀取所有。

7

file.readline([size])

讀取整行,包括 "\n" 字符。

8

file.readlines([sizeint])

讀取所有行並返回列表,若給定sizeint>0,返回總和大約為sizeint字節的行, 實際讀取值可能比 sizeint 較大, 因為需要填充緩沖區。

9

file.seek(offset[, whence])

移動文件讀取指針到指定位置

10

file.tell()

返回文件當前位置。

11

file.truncate([size])

從文件的首行首字符開始截斷,截斷文件為 size 個字符,無 size 表示從當前位置截斷;截斷之后后面的所有字符被刪除,其中 windows 系統下的換行代表2個字符大小。

12

file.write(str)

將字符串寫入文件,返回的是寫入的字符長度。

13

file.writelines(sequence)

向文件寫入一個序列字符串列表,如果需要換行則要自己加入每行的換行符。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM