用Python操做文件

用Python操做文件

用word操做一個文件的流程以下:python

一、找到文件,雙擊打開。程序員

二、讀或修改。vim

三、保存&關閉。windows

用Python操做文件也差很少:編輯器

f=open(filename)  # 打開文件
f.write("我是野生程序員") # 寫操做
f.read()  #讀操做
f.close() #保存並關閉

不過有一點跟人肉操做word文檔不一樣,就是word文檔只要打開了,就便可以讀、又能夠修改。 但Python比較變態,只能以讀、建立、追加 3種模式中的任意一種打開文件,不能即寫又讀。測試

1、操做模式

  • r 只讀模式
  • w 建立模式,若文件已存在,則覆蓋舊文件
  • a 追加模式,新數據會寫到文件末尾

2、建立文件

f = open(file='C:/工做平常/staff.txt',mode='w')
f.write("Kwan  CEO  100W\n")
f.write("KK  人事  5000\n")
f.close()

3、只讀模式

f = open(file='兼職白領學生空姐模特護士聯繫方式.txt',mode='r')
print(f.readline())  # 讀一行
print('------分隔符-------')
data = f.read()  # 讀全部,剩下的全部
print(data)
f.close()

執行結果:編碼

馬纖羽     深圳    173    50    13744234523
------分隔符-------
喬亦菲     廣州    172    52    15823423525
羅夢竹     北京    175    49    18623423421
劉諾涵     北京    170    48    18623423765
嶽妮妮     深圳    177    54    18835324553
賀婉萱     深圳    174    52    18933434452
葉梓萱     上海    171    49    18042432324

你得有這麼個文件才能用上面的代碼。。。code

4、追加模式

f = open(file='兼職白領學生空姐模特護士聯繫方式.txt',mode='a')
f.write("黑姑娘 北京  168  48\n")  # 會追加到文件尾部
f.close()

5、循環文件

f = open(file='兼職白領學生空姐模特護士聯繫方式.txt',mode='r')
for line in f:
    line = line.split()
    name,addr,height,weight,phone = line
    height = int(height)
    weight = int(weight)
    if height > 170 and weight <= 50:
        print(line)
f.close()

輸出:blog

['馬纖羽', '深圳', '173', '50', '13744234523']
['羅夢竹', '北京', '175', '49', '18623423421']
['葉梓萱', '上海', '171', '49', '18042432324']

6、其它功能

def mode(self) -> str:
        # 返回文件打開的模式
    def name(self) -> str:
        # 返回文件名
    def fileno(self, *args, **kwargs): # real signature unknown
        # 返回文件句柄在內核中的索引值,之後作IO多路複用時能夠用到
    def flush(self, *args, **kwargs): # real signature unknown
        # 把文件從內存buffer裏強制刷新到硬盤
    def readable(self, *args, **kwargs): # real signature unknown
        # 判斷是否可讀
    def readline(self, *args, **kwargs): # real signature unknown
        # 只讀一行,遇到\r or \n爲止
    def seek(self, *args, **kwargs): # real signature unknown
        '''
        把操做文件的光標移到指定位置
        *注意seek的長度是按字節算的, 字符編碼存每一個字符所佔的字節長度不同。
        如「路飛學城」 用gbk存是2個字節一個字,用utf-8就是3個字節,所以以gbk打開時,seek(4) 就把光標切換到了「飛」和「學」兩個字中間。
        但若是是utf8,seek(4)會致使,拿到了飛這個字的一部分字節,打印的話會報錯,由於處理剩下的文本時發現用utf8處理不了了,由於編碼對不上了。少了一個字節
        '''
    def seekable(self, *args, **kwargs): # real signature unknown
        # 判斷文件是否可進行seek操做
    def tell(self, *args, **kwargs): # real signature unknown
        # 返回當前文件操做光標位置 
    def truncate(self, *args, **kwargs): # real signature unknown
        # 按指定長度截斷文件
        # *指定長度的話,就從文件開頭開始截斷指定長度,不指定長度的話,就從當前位置到文件尾部的內容全去掉。
    def writable(self, *args, **kwargs): # real signature unknown
        # 判斷文件是否可寫

7、混合模式

  • w+ 寫讀 , 這個功能基本沒什麼意義,它會建立一個新文件 ,寫一段內容,能夠再把寫的內容讀出來,沒什麼卵用。
  • r+ 讀寫,能讀能寫,但都是寫在文件最後,跟追加同樣。
  • a+ 追加讀,文件一打開時光標會在文件尾部,寫的數據全會是追加的形式。

r+ 模式示例:索引

由於默認就是往文件尾部寫入。

8、修改文件

嘗試直接以r+模式打開文件,默認會把新增的內容追加到文件最後面。但我想要的是修改中間的內容 ,怎麼辦? 爲何會把內容添加到尾部呢?(最新測試r+會從頭覆蓋,測試代碼以下)

問:爲何原有數據會被覆蓋呢?

這是硬盤的存儲原理致使的,當你把文件存到硬盤上,就在硬盤上劃了一塊空間,存數據,等你下次打開這個文件 ,seek到一個位置,每改一個字,就是把原來的覆蓋掉,若是要插入,是不可能的,由於後面的數據在硬盤上不會總體向後移。因此就出現 當前這個狀況 ,你想插入,卻變成了會把舊內容覆蓋掉。

問:可是人家word, vim 均可以修改文件 呀,你這不能修改算個什麼玩意?

並沒說就不能修改了,你想修改固然能夠,就是不要在硬盤上修改,把內容所有讀到內存裏,數據在內存裏能夠隨便增刪改查,修改以後,把內容再所有寫回硬盤,把原來的數據所有覆蓋掉。vim word等各類文本編輯器都是這麼幹的。

問:說的好像有道理,但你又沒看過word軟件的源碼,你憑什麼這麼篤定?

不須要看源碼,硬盤的存儲原理決定了word必須這麼幹 ,不信的話,還有個簡單的辦法來確認我說的,就是用word or vim讀一個編輯一個大文件 ,至少幾百MB的,你 會發現,加載過程會花個數十秒,這段時間幹嗎了? cpu 去玩了?去上廁所啦? 固然不是,是在努力把數據 從硬盤上讀到內存裏。

問:還有更好的方式麼?

沒有。

佔硬盤方式的文件修改代碼示例

f_name = "兼職白領學生空姐模特護士聯繫方式.txt"
f_new_name = "%s.new" % f_name
old_str = "劉諾涵"
new_str = "[黑姑娘]"
f = open(f_name,'r')
f_new = open(f_new_name,'w')
for line in f:
    if old_str in line:
        new_line = line.replace(old_str,new_str)
    else:
        new_line = line
    f_new.write(new_line)
f.close()
f_new.close()

上面的代碼,會生成一個修改後的新文件 ,原文件不動,若想覆蓋原文件:

import os
f_name = "兼職白領學生空姐模特護士聯繫方式.txt"
f_new_name = "%s.new" % f_name
old_str = "劉諾涵"
new_str = "[黑姑娘]"
f = open(f_name,'r')
f_new = open(f_new_name,'w')
for line in f:
    if old_str in line:
        new_line = line.replace(old_str,new_str)
    else:
        new_line = line
    f_new.write(new_line)
f.close()
f_new.close()
os.rename(f_new_name,f_name) #把新文件名字改爲原文件 的名字,就把以前的覆蓋掉了,windows使用os.replace # 幫助文檔說明replace會覆蓋原文件
相關文章
相關標籤/搜索