python 文件操做

 

一.文件處理流程

  1. 打開文件,獲得文件句柄並賦值給一個變量
  2. 經過句柄對文件進行操做
  3. 關閉文件

二.基本操做

 

2.1 文件操做基本流程初探

複製代碼
f = open('chenli.txt') #打開文件
first_line = f.readline()
print('first line:',first_line) #讀一行print('我是分隔線'.center(50,'-'))
data = f.read()# 讀取剩下的全部內容,文件大時不要用print(data) #打印讀取內容 
f.close() #關閉文件
複製代碼
 
2.2 文件編碼
文件保存編碼以下

此刻錯誤的打開方式
f=open('chenli.txt',encoding='utf-8')
f.read() 

正確的打開方式
#不指定打開編碼,默認使用操做系統的編碼,windows爲gbk,linux爲utf-8,與解釋器編碼無關
f=open('chenli.txt',encoding='gbk') #在windows中默認使用的也是gbk編碼,此時不指定編碼也行
f.read()
 

2.3 文件打開模式

1 文件句柄 = open('文件路徑', '模式')

 

打開文件時,須要指定文件路徑和以何等方式打開文件,打開後,便可獲取該文件句柄,往後經過此文件句柄對該文件操做。python

打開文件的模式有:linux

  • r ,只讀模式【默認模式,文件必須存在,不存在則拋出異常】
  • w,只寫模式【不可讀;不存在則建立;存在則清空內容】
  • x, 只寫模式【不可讀;不存在則建立,存在則報錯】
  • a, 追加模式【可讀;   不存在則建立;存在則只追加內容】

"+" 表示能夠同時讀寫某個文件windows

  • r+, 讀寫【可讀,可寫】
  • w+,寫讀【可讀,可寫】
  • x+ ,寫讀【可讀,可寫】
  • a+, 寫讀【可讀,可寫】

 "b"表示以字節的方式操做app

  • rb  或 r+b
  • wb 或 w+b
  • xb 或 w+b
  • ab 或 a+b

 注:以b方式打開時,讀取到的內容是字節類型,寫入時也須要提供字節類型,不能指定編碼函數

 

2.4 文件內置函數flush

flush原理:編碼

  1. 文件操做是經過軟件將文件從硬盤讀到內存
  2. 寫入文件的操做也都是存入內存緩衝區buffer(內存速度快於硬盤,若是寫入文件的數據都從內存刷到硬盤,內存與硬盤的速度延遲會被無限放大,效率變低,因此要刷到硬盤的數據咱們統一往內存的一小塊空間即buffer中放,一段時間後操做系統會將buffer中數據一次性刷到硬盤)
  3. flush即,強制將寫入的數據刷到硬盤

滾動條:操作系統

import sys,time

for i in  range(10):
    sys.stdout.write('#')
    sys.stdout.flush()
    time.sleep(0.2)

 

 

2.5 文件內光標移動

注意:read(3)表明讀取3個字符,其他的文件內光標移動都是以字節爲單位如seek,tell,read,truncatecode

整理中blog

 

2.6 open函數詳解

1. open()語法

open(file[, mode[, buffering[, encoding[, errors[, newline[, closefd=True]]]]]])
open函數有不少的參數,經常使用的是file,mode和encoding
file文件位置,須要加引號
mode文件打開模式,見下面3
buffering的可取值有0,1,>1三個,0表明buffer關閉(只適用於二進制模式),1表明line buffer(只適用於文本模式),>1表示初始化的buffer大小;
encoding表示的是返回的數據採用何種編碼,通常採用utf8或者gbk;
errors的取值通常有strict,ignore,當取strict的時候,字符編碼出現問題的時候,會報錯,當取ignore的時候,編碼出現問題,程序會忽略而過,繼續執行下面的程序。
newline能夠取的值有None, \n, \r, 」, ‘\r\n',用於區分換行符,可是這個參數只對文本模式有效;
closefd的取值,是與傳入的文件參數有關,默認狀況下爲True,傳入的file參數爲文件的文件名,取值爲False的時候,file只能是文件描述符,什麼是文件描述符,就是一個非負整數,在Unix內核的系統中,打開一個文件,便會返回一個文件描述符。內存

2. Python中file()與open()區別
二者都可以打開文件,對文件進行操做,也具備類似的用法和參數,可是,這兩種文件打開方式有本質的區別,file爲文件類,用file()來打開文件,至關於這是在構造文件類,而用open()打開文件,是用python的內建函數來操做,建議使用open

3. 參數mode的基本取值

Character Meaning
‘r' open for reading (default)
‘w' open for writing, truncating the file first
‘a' open for writing, appending to the end of the file if it exists
‘b' binary mode
‘t' text mode (default)
‘+' open a disk file for updating (reading and writing)
‘U' universal newline mode (for backwards compatibility; should not be used in new code)

r、w、a爲打開文件的基本模式,對應着只讀、只寫、追加模式;
b、t、+、U這四個字符,與以上的文件打開模式組合使用,二進制模式,文本模式,讀寫模式、通用換行符,根據實際狀況組合使用、

常見的mode取值組合

複製代碼
 1 r或rt 默認模式,文本模式讀
 2 rb   二進制文件
 3     
 4 w或wt 文本模式寫,打開前文件存儲被清空
 5 wb  二進制寫,文件存儲一樣被清空
 6     
 7 a  追加模式,只能寫在文件末尾
 8 a+ 可讀寫模式,寫只能寫在文件末尾
 9     
10 w+ 可讀寫,與a+的區別是要清空文件內容
11 r+ 可讀寫,與a+的區別是能夠寫到文件任何位置 
複製代碼

 

 

2.7 上下文管理

with open('a.txt','w') as f:
    pass

 

with open('a.txt','r') as read_f,open('b.txt','w') as write_f:
    data=read_f.read()
    write_f.write(data)

 

 

2.8 文件的修改

複製代碼
import os with open('a.txt','r',encoding='utf-8') as read_f,\         open('.a.txt.swap','w',encoding='utf-8') as write_f:     for line in read_f:         if line.startswith('hello'):             line='哈哈哈\n'         write_f.write(line) os.remove('a.txt') os.rename('.a.txt.swap','a.txt')
相關文章
相關標籤/搜索