文件對象的字節模式/b模式(以utf-8編碼為例) |
|||
|
讀操作 |
寫操作 |
指針操作 |
ASCII字節 |
返回bytes/字節類型的Ascii |
寫入bytes類型字節 例如:b'This is ascii' |
使用seek每次設置任意字節 |
中文字符串 |
返回bytes/字節類型的亂碼 需要解碼后顯示 例如:'\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-8,在pycharm里新建文本文件就是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',讀寫文件都以字節方式讀寫。常見的JPG、EXE等數據文件使用。
文本模式下,換行時根據操作系統不同,換行也不同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是起始位置,值為 0 表示自文件起始處開始,1 表示自當前文件指針位置開始,2 表示自文件末尾開始。
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官方手冊 原創內容,如需轉載,請標明出處!