python基礎之文件處理


一.文件處理流程

  1. 打開文件,得到文件句柄並賦值給一個變量
  2. 通過句柄對文件進行操作
  3. 關閉文件
正趣果上果
Interesting fruit fruit

詞:郭婞
曲:陳粒
編曲/混音/和聲:燕池
蕭:嗎子
Words: Guo 婞
Song: Chen tablets
Arrange / Mix / Harmony: Yan Chi
Xiao: Well

你佩桃木降妖劍
他會一招不要臉
哇呀呀呀
輸在沒有錢
輸在沒有錢
You wear peach down demon sword
He will shamelessly
Wow yeah
Lost in the absence of money
Lost in the absence of money

你願終老不羡仙
誰料溫柔終老空了長生殿
哎唏唏唏
敗給好容顏
敗給好容顏
You would like to end the old do not envy cents
Mummy gentle death of the empty palace
Hey Xi Xi
Lost to good appearance
Lost to good appearance

人生在世三萬天
趣果有間 孤獨無解
苦練含笑半步癲
吶我去給你煮碗面
Life is thirty thousand days
Fun fruit there is no solution between solitude
Hard practicing smiling half-step epilepsy
I'll go and cook your bowl

心懷嚙雪大志願
被人稱作小可憐
嗚呼呼呼
突樣未成年
突樣未成年
Heart of the snow big volunteer
Was called a small pitiful
Alas
Sudden sample of minor
Sudden sample of minor

本欲歃血定風月
烏飛兔走光陰只負尾生約
噫噓噓噓
真心怕火煉
真心也怕火煉
The desire to set the wind blood months
Wu Flying Rabbit only time to bear the tail about
噫 boo boo
Really afraid of fire refining
Really afraid of fire

人生在世三萬天
趣果有間 孤獨無解
苦練含笑半步癲
吶我去給你煮碗面
Life is thirty thousand days
Fun fruit there is no solution between solitude
Hard practicing smiling half-step epilepsy
I'll go and cook your bowl

是非對錯二十念
十方觀遍 庸人戀闕
自學睡夢羅漢拳
嚇 冇知醬紫好危險
Right and wrong twenty read
square view over the Yong love Que
Self - study sleep Lohan boxing
Scare know that a good risk of Jiang Xi

示范文件內容
示范文件內容

二.基本操作

2.1 文件操作基本流程初探

文件保存編碼如下

此刻錯誤的打開方式
#不指定打開編碼,即python解釋器默認編碼,python2.*為ascii,python3.*為utf-8
f=open('chenli.txt')
f.read() 

正確的打開方式
f=open('chenli.txt',encoding='gbk')
f.read()

2.3 文件打開模式

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

打開文件時,需要指定文件路徑和以何等方式打開文件,打開后,即可獲取該文件句柄,日后通過此文件句柄對該文件操作。

打開文件的模式有:

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

"+" 表示可以同時讀寫某個文件

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

 "b"表示以字節的方式操作

  • 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,truncate

整理中

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語句  

為了避免打開文件后忘記關閉,可以通過with管理上下文,進而優化內存,即:

with open('log','r') as f:
        pass

如此方式,當with代碼塊執行完畢時,內部會自動關閉並釋放文件資源。
在Python 2.7 后,with又支持同時對多個文件的上下文進行管理,即:

with open('log1') as obj1, open('log2') as obj2:
    pass

2.8 Python3 File seek() 方法

seek() 方法用於移動文件讀取指針到指定位置。
seek()方法語法如下:
  fileObject.seek(offset[,whence])

參數

  • offset--開始的偏移量,也就是代表需要移動偏移的字節數
  • whence:可選,默認值為0.給offset參數一個定義,表示要從哪個位置開始偏移;0代表從文件開頭開始算起,1代表從當前位置開始算起,2代表從文件末尾算起。

返回值
  該函數沒有返回值。

例子1:這種模式是按照字符來操作

f=open("new_test","r",encoding="utf8")  #hello哈
print(f.read(3))   # hel
f.seek(0)
 
print("------")
print(f.read())  # hello哈

例子2:這種模式是按照字節來操作

f=open("new_test","rb")  #hello哈
print(f.read(3))   # b'hel'
f.seek(-3,2)  # 該模式一定按字節操作
 
print("------")
print(f.read().decode("utf8"))  # 哈

滾動條:

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

百分比顯示滾動條:

import sys,time
for i in range(100):
    s="\r%d%% %s" %(i,"#"*i)
    sys.stdout.write(s)
    sys.stdout.flush()
    time.sleep(0.5)

2.9 eval用法

eval(str) 用來計算在字符串中的有效Python表達式,並返回一個對象

例如:把字符串轉成字典

a=input("pls{....}:")  # {"name":"luchuan"}
print(type(a)) #<class 'str'>
a=eval(a)
 
print(type(a)) #<class 'dict'>
print(a["name"]) #alex

3.0 truncate方法

truncate只有在寫模式才能用
truncate()方法用於截斷文件,如果指定了可選參數size,則表示截斷文件為size個字符。如果沒有指定size,則重置到當前位置。

f=open('a.txt','w')
f.write('1111111111\n')
f.write('1111111111\n')
f.write('1111111111\n')
f.seek(0)
f.truncate(3)

3.1 writelines方法

f=open('a.txt','w')
f.writelines(['1111111\n','11111111\n'])
f.close()

思考題:

硬盤數據是在block塊上,數據只能追加和覆蓋,不能進行修改。
內存里的數據是可以修改得。

現在需要對以下test文件進行修改,應該怎么操作?

test內容:
昨夜寒蛩不住鳴。
驚回千里夢,已三更。
起來獨自繞階行。
人悄悄,簾外月朧明。
白首為功名,舊山松竹老,阻歸程。
欲將心事付瑤琴。
知音少,弦斷有誰聽。
count = 0
with open("test",encoding="utf8") as f_read,open("test2",encoding="utf8",mode="w") as f_write:
    for line in f_read:
        if count==3:
            line="".join([line.strip(),"張飛\n"])
        f_write.write(line)
        count+=1
 
import os
os.rename("test","test_bak")
os.rename("test2","test")
View Code

參考鏈接:http://www.cnblogs.com/linhaifeng/articles/5984922.html

  

  

  

 

  

  

  


免責聲明!

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



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