python所有文件都能用文本方式打开_python 打开文件方式讲解、常用读写操作指令(全)以及读写常见问题...
python讀寫方式
python的讀寫,在實際應用中還是很廣泛的,有必要系統性的學習一下,以便于處理問題時的抉擇和對現象的合理解釋。例如,python用logging寫入日志文件默認的讀寫方式是“a”(在文件尾追加日志記錄);將生成的字符串列表加入到文件中,一般會用到“a+”;打開文件進行讀取顯示會用到open(‘filename’,‘r’)......
r以只讀模式打開文件光標在文件開頭如果文件不存在,則出錯
r+以讀寫模式打開文件光標在文件開頭如果文件不存在,則出錯。讀寫都可以移動光標。寫入時,如果光標不在文件末尾,則會覆蓋源文件
w以只寫模式打開文件光標在文件開頭如果文件不存在,則創建文件,如果文件已存在,則從文件頭開始覆蓋文件。如果寫入內容比源文件少,則會保留未覆蓋的內容
w+以讀寫模式打開文件光標在文件開頭如果文件不存在,則會創建文件。文件已存在,從光標位置覆蓋文件。讀寫都可以移動光標。
a以只寫模式打開文件光標在文件結尾,追加模式文件不存在是,創建文件。文件存在時,打開時,光標在文件末尾,寫入不覆蓋源文件
a+以讀寫模式打開文件光標在文件結尾,追加模式文件不存在是,創建文件。文件存在時,打開時,光標在文件末尾,寫入不覆蓋源文件。
b與前面六種結合使用,以二進制方式讀或者寫(e.g. open('filename','rb'))? (為什么要用到b下文有詳解)
python常見讀寫操作指令
1.? f.read([size])?# size可有可無
該方法從文件當前位置起讀取size個字節,若無參數size,則表示讀取至文件結束為止。注意,此處按字符來讀入,一個漢字為一個字符。
2.? f.readline(?)? ? ? ? # size可有可無,都只讀取一行
從字面意思可以看出,該方法每次讀出一行內容,所以,讀取時占用內存小,比較適合大文件,該方法返回一個字符串對象。
3.? f.readlines(?)? ? ? # size可有可無,都讀取到文件尾
該方法讀取整個文件所有行,保存在一個列表(list)變量中,每行作為一個元素,但讀取大文件會比較占內存。
4.? linecache模塊
用于輸出某個文件的第n行,用法如下:
line2 = linecache.getline(‘lines.txt',2) # print the 2nd line
print line2
5.? f.write( )
將數據寫入文件,用法為f.write('strings')
6.? f.writelines()
將多行數據寫入文件中,數據以列表的方式提供:
f.writelines(['11\n','22\n',...'66\n'])
7.? f.tell( )
可以將文件指針的當前指向的位置讀出(即光標位置)
8. f.seek()
將光標位置移至所需位置。用法:?f.seek(offset,whence=0)
offset:開始偏移量,也就是代表需要移動偏移的字節數。
whence:給offset參數一個定義,表示要從哪個位置開始偏移;0代表從文件開頭開始算起,1代表從當前位置開始算起,2代表從文件末尾算起,默認為0。注意,此處偏移量是按字節計算,也就是一個漢字最少需要兩個偏移量。如果偏移量正好講一個漢字分開,則會報錯。
whence常量:
os.SEEK_SET: 0 相對文件起始位置
os.SEEK_CUR: 1 相對文件的當前位置
os.SEEK_END: 2 相對文件的結束位置
>>> f.close()
>>> f=open('2.txt','w+')
>>> f.write('123')
>>> f.tell() #當前文件指針的位置
3
>>> import os #導入OS
>>> f.seek(-3,os.SEEK_CUR)#在文件指針當前的位置-3,就是移到開始位置,由此讀出了剛剛寫入在2.txt中的123的內容
>>> f.read()
'123'
9.??f.truncate( [size])? ? ? ? ? # size可有可無
當不指定size的時候,表示從光標位置刪除后面內容;當指定size之后,表示從文件頭開始,保留size個字節的字符(同上,中文按兩個字節計算)
10.? f.flush( )
將內存內容立即寫入硬盤
11.? f.close()? ? ? ?# 一定不要忘記!!!
關閉文件。接下來普及一下不關閉文件的后果:
close()是為了釋放資源。 如果不close(),那就要等到垃圾回收時,自動釋放資源。垃圾回收的時機是不確定的,也無法控制的。
如果程序是一個命令,很快就執行完了,那么可能影響不大(注意:并不是說就保證沒問題)。
但如果程序是一個服務,或是需要很長時間才能執行完,或者很大并發執行,就可能導致資源被耗盡,也有可能導致死鎖。
另外,緩存的信息可能會意外丟失,文件可能會損壞。因為我們寫文件時,操作系統往往不會立刻把數據寫入磁盤,而是放到內存緩存起來,空閑的時候再慢慢寫入。只有調用close()方法時,操作系統才保證把沒有寫入的數據全部寫入磁盤。忘記調用close()的后果是數據可能只寫了一部分到磁盤,剩下的丟失了。所以,還是用with語句來得保險,同時這也個比較 pythonic 的方式:
with open('close.txt', 'w') as f:
f.write('remember it please!')
Q:為什么要用‘b’來進行讀寫呢?
A? : 從兩個方面討論:
寫文件時,對于字符串x='abc\ndef',我們可用len(x)得到它的長度為7,\n我們稱之為換行符,實際上是0x0A。當我們用'w'即文本方式寫的時候,在windows平臺上會自動將'0x0A'變成兩個字符'0x0D','0x0A',即文件長度實際上變成8。當用'r'文本方式讀取時,又自動的轉換成原來的換行符。 如果換成'wb'二進制方式來寫的話,則會保持一個字符不變,讀取的時候也是原樣讀取。 所以如果用文本方式寫入,用二進制方式讀取的話,就要考慮這多出的一個字節了。'0x0D'也稱回車符。 Linux下不會變,因為linux只使用'0X0A'來表示換行。
讀文件時,直到讀到文檔結束符(EOF)才算讀取到文件最后,Python會認為字節\x1A(26)轉換成的字符為文檔結束符(EOF),? 故使用'r'進行讀取二進制文件時,可能會出現文檔讀取不全的現象。
例如:
二進制文件中存在如下從低位向高位排列的數據:7F 32 1A 2F 3D 2C 12 2E 76
如果使用'r'進行讀取,則讀到第三個字節,即認為文件結束。
如果使用'rb'按照二進制位進行讀取的,不會將讀取的字節轉換成字符,從而避免了上面的錯誤。
方案:
二進制文件就用二進制方法讀取'rb'
總結:
使用'r'的時候,如果碰到'0x1A',就視為文件結束,就是EOF,使用'rb'則不存在這個問題。也就是說,如果你用二進制寫入再用文件讀出的話,如果其中存在'0x1A',就只會讀出文件的一部分,使用'rb'會一直讀取文件末尾。
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的python所有文件都能用文本方式打开_python 打开文件方式讲解、常用读写操作指令(全)以及读写常见问题...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 联想一体机电源键不亮_联想/兄弟打印机复
- 下一篇: html怎么让图片重叠_PS倒影效果怎么