python文件對象幾種操作模式區別——文件操作方法詳解


 

 

文件對象的字節模式/b模式(以utf-8編碼為例)

 

讀操作

寫操作

指針操作

ASCII字節

返回bytes/字節類型的Ascii

寫入bytes類型字節

例如:b'This is ascii'

使用seek每次設置任意字節

中文字符串

返回bytes/字節類型的亂碼
例如:\xe4\xbd\xa0 三組為一個中文

需要解碼后顯示

例如:'\xe4\xbd\xa0'.decode('utf-8')

把字符串編碼后才可寫操作

例如:'內容'.encode('utf-8')

使用seek每次設置3的倍數的字節

 

 

文件對象的文本模式

 

讀操作

寫操作

指針操作

ASCII字節

返回可查看的字符串

寫入查見的字符串

使用seek每次設置任意字節

中文字符串

返回可查看的字符串

寫入查見的字符串

使用seek每次設置3的倍數的字節


模式

文件存在

文件不存在

操作

文件內容

r

創建open對象正常正常打開

創建open對象報錯無法讀取原文件

只讀

只可讀不可寫,默認就是r模式。

可以用指針調節位置去讀。

w

創建open對象正常原文件內容直接清空

創建open對象正常創建新文件

只寫

打開文件時,內容就被清空。可以調節指針位置去寫。

a

創建open對象正常正常打開

創建open對象正常創建新文件

只寫

不覆蓋原文件內容。只能在末尾追加內容,調節指針無法改變寫的位置。如果不寫內容,原文件不變。

r+

創建open對象正常正常打開

創建open對象報錯無法讀取原文件

讀寫

不覆蓋原文件內容。指針默認在末尾追加內容,指針在其它位置寫操作時,覆蓋原文件內容。如果不寫內容,原文件不變。根據指針位置讀文件

w+

創建open對象正常原文件內容直接清空

創建open對象正常創建新文件

讀寫

打開文件時,內容就被清空。寫操作覆蓋之前的文件內容。根據指針位置讀文件

a+

創建open對象正常正常打開

創建open對象正常創建新文件

讀寫

指針默認在末尾,寫文件只能追加內容,根據指針位置讀文件。如果不寫內容,原文件不變。

備注:只要是可寫模式,在關閉文件之前,都可以多次調用write方法追加內容

 

 

詳細的講解

一、文件的操作

 操作文件大概流程過程,文件是否存在,打開文件,讀寫文件,關閉文件

 

 1 >>> import os
 2 >>> os.path.isfile('wdwj') #不存在
 3 False
 4 >>> f=open('wdwj','w')#用'w'寫的方式打開文件,不存在就自動創建
 5 >>> f.write('我的文件內容')#寫文件內容
 6 6
 7 >>> f.close()#關閉文件
 8 >>> os.path.isfile('wdwj')#已經成功創建
 9 True
10 >>> with open('wdwj') as f: #使用with 打開文件后,自動關閉文件
11 ...     data=f.read()
12 ... 
13 >>> print(data)
14 我的文件內容

 

python3 就是open 沒有file

查看/設置系統文件編碼集

import sys

sys.getdefaultencoding()

sys.setdefaultencoding("utf-8")

 

關於文件操作的編碼問題。

windows下:pycharm當中設置基本編碼是utf-8pycharm里新建文本文件就是utf-8

然后運行pycharm程序,讀取這個文本文件就會出錯,它會使用windows默認GBK編碼去讀取。

 

打開文件

f = open('musictxt',encoding='utf-8')#encoding='utf-8'不加這個參數的話,就按當前系統編碼集

open方法詳細參數

def open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True):

 

打開文件的模式,上文中的表格里有更詳細的說明

 r,只讀模式(默認)。

 w,只寫模式。

 a,追加模式。

通常文件以文本打開,讀寫文件的字符串都會被特定的編碼方式(默認是UTF-8)編碼。

模式后面加'b',讀寫文件都以字節方式讀寫。常見的JPGEXE等數據文件使用。

文本模式下,換行時根據操作系統不同,換行也不同Unix上是 \n , Windows上是 \r\n。注意,文本操作時影響不大。但以字節模式操作時,會影響數據。

 

二、文件對象方法

文件讀操作時,如果未設置指針位置。默認讀取文件的位置指針會從文件頭移到文件尾,所以讀取一次后無法重復讀取。

讀取文件

f.read(size)size是可選項目,指定字符串長度。size未指定或者為負數,會讀取整個文件。當文件大小是當前機器內存兩倍時,會出錯。如果到了文件末尾,會顯示空字符串。

注意:是read(),不是readline()

1 >>> f.read()
2 'zhe shi wenjian.\n'
3 >>> f.read()
4 '' #這兩個單引號是空字符串

讀取行

f.readline(),注意:返回的每行結尾會自動加換行符'\n',如果到文件末尾就返回空字符串''

 1 >>> f.readline()
 2 'wo shi wenjian neirong.\n'
 3 >>> f.readline()
 4 'zhe shi di er hang\n'
 5 >>> f.readline()
 6 ''
 7 
 8 #循環遍歷文件對象,來讀取第一行。
 9 >>> for line in f:
10 ...     print(line, end='')
11 ...
12 wo shi wenjian neirong.
13 zhe shi di er hang

 

如果你想把文件中的所有行讀到一個列表中,你也可以使用 list(f) 或者 f.readlines()

寫文件

f.write(string)方法將 string 的內容寫入文件,並返回寫入字符的長度:

 >>> f.write('This is a test\n')

15

 想要寫入其他非字符串內容,首先要將它轉換為字符串:

 >>> value = ('the answer', 42)

>>> s = str(value)

>>> f.write(s)

18

 

文件對象的指針操作 

f.tell()方法返回一個整數  顯示當前指針位置

f.seek(offset,from_what)方法設置設置指針位置。

form_what是起始位置,值為 表示自文件起始處開始,表示自當前文件指針位置開始,表示自文件末尾開始。

 1 >> f = open('workfile', 'rb+')
 2 >>> f.write(b'0123456789abcdef')
 3 16
 4 >>> f.seek(5) 
 5 5
 6 >>> f.read(1)
 7 b'5'
 8 >>> f.seek(-3, 2) 
 9 13
10 >>> f.read(1)
11 b'd'

可以操作本文本件,但注意一個字符串是3個字節。指針是按字節走的,不是3的倍數顯示會出錯。

注意:文本中同時包含中文和ascii時,無論是字節還是字符串操作指針,產生亂碼比較麻煩。

例如:以下就是產生了不是3的倍數的字節,需要修改bytes字節數據來修復。操作bytes類型的字符,用切片方法切掉壞數據

>>> b

b'abcdefg,\x8d\xe9\x9d\xa2\xe4\xba\x86,\x80\xe4\xb8\x8b\xe5\x9c\xa8\xe5\x89\x8d\xe9\x9d\xa2\xe5\x8a\xa0\xe4\xb8\x80\xe4\xb8\x8b,,try,try12345678abcdef-------hehe'

>>> b[:4]

b'abcd'

>>> b=b[:8]+b[10:]

>>> c.decode('utf-8')

'下在前面加一下,,try,try12345678abcdef-------hehe'

>>> 

 

以下是詳細的文件操作例子:

 1 >>> f = open('bin_file','wb') #以字節的寫模式創建文件對象
 2 >>> f.write(b'我是文件內容') #只能是ASCII字符
 3   File "<stdin>", line 1
 4 SyntaxError: bytes can only contain ASCII literal characters.
 5 >>> f.write(b'wo shi wenjian neirong')#只能是ASCII字符
 6 22 #一共寫了22號字節
 7 >>> f.close()
 8 >>> 
 9 (env) hehe@ubuntu:~/tmp/file_object_test$ more bin_file 
10 #ascii字節寫入的文件,在命令行可以用文本本件方式打開
11 wo shi wenjian neirong
12 >>> f = open('bin_file')#ascii字節寫入的文件,用文件對象可以用文本本件方式打開
13 >>> f.read()
14 'wo shi wenjian neirong'
15 >>> f.close()
16 >>> f = open('bin_file','rb')#ascii字節寫入的文件,用文件對象可以用字節本件方式打開
17 >>> f.read()
18 b'wo shi wenjian neirong'
19 >>> f.close()
20 >>> f = open('bin_file','wb')#創建以字節寫的方式的文件對象
21 >>> f.write(b'我是內容')#寫操作時,只能接收字節參數,使用字符串參數會出錯
22   File "<stdin>", line 1
23 SyntaxError: bytes can only contain ASCII literal characters.
24 >>> f.write('我是內容'.encode('utf-8'))#把字符串編碼成字節就可以寫入
25 12
26 >>> f.close()
27 (env) hehe@ubuntu:~/tmp/file_object_test$ more bin_file #命令行下,可以直接以文本方式打開
28 我是內容
29 >>> f = open('bin_file','r')#在交互模式下,可以使用文本模式打開字節寫入的中文字符串
30 >>> f.read()
31 '我是內容'
32 >>> f.close()
33 >>> f = open('bin_file','rb')
34 >>> f.read()#每4個符號("\xb9")是一個字節,每3個字節是一個中文。
35 b'\xe6\x88\x91\xe6\x98\xaf\xe5\x86\x85\xe5\xae\xb9'
36 >>> f.tell()
37 12
38 >>> f.seek(0)#因為讀取文件的時候指針已經去了文件末尾,所以需要移動它到開頭
39 0
40 >>> f.read().decode('utf-8')#用字節模式打開文件,查看中文字符需要解碼。
41 '我是內容'
42 >>> f.seek(0)
43 0
44 >>> f.seek(1)
45 1
46 >>> f.read()#往后移動了一個字節所以 \xe6沒顯示
47 b'\x88\x91\xe6\x98\xaf\xe5\x86\x85\xe5\xae\xb9'
48 >>> f.seek(1)
49 1
50 >>> info=f.read()
51 >>> info.decode('utf-8')#移動一個節字是不行的,3個字節是一個中文,
52 Traceback (most recent call last):
53   File "<stdin>", line 1, in <module>
54 UnicodeDecodeError: 'utf-8' codec can't decode byte 0x88 in position 0: invalid start byte
55 >>> f.seek(3)
56 3
57 >>> info=f.read()
58 >>> info.decode('utf-8')#以下結果正好少了一個字
59 '是內容'
60 >>> 

 

根據python3官方手冊 原創內容,如需轉載,請標明出處!

 


免責聲明!

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



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