用Python操作文件
用word操作一個文件的流程如下:
1、找到文件,雙擊打開。
2、讀或修改。
3、保存&關閉。
用Python操作文件也差不多:
f=open(filename) # 打開文件
f.write("我是野生程序員") # 寫操作
f.read() #讀操作
f.close() #保存并關閉
不過有一點跟人肉操作word文檔不同,就是word文檔只要打開了,就即可以讀、又可以修改。 但Python比較變態,只能以讀、創建、追加 3種模式中的任意一種打開文件,不能即寫又讀。
一、操作模式
- r 只讀模式
- w 創建模式,若文件已存在,則覆蓋舊文件
- a 追加模式,新數據會寫到文件末尾
二、創建文件
f = open(file='C:/工作日常/staff.txt',mode='w')
f.write("Kwan CEO 100W\n")
f.write("KK 人事 5000\n")
f.close()
三、只讀模式
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
你得有這么個文件才能用上面的代碼。。。
四、追加模式
f = open(file='兼職白領學生空姐模特護士聯系方式.txt',mode='a')
f.write("黑姑娘 北京 168 48\n") # 會追加到文件尾部
f.close()
五、循環文件
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()
輸出:
['馬纖羽', '深圳', '173', '50', '13744234523']
['羅夢竹', '北京', '175', '49', '18623423421']
['葉梓萱', '上海', '171', '49', '18042432324']
六、其它功能
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
# 判斷文件是否可寫
七、混合模式
- w+ 寫讀 , 這個功能基本沒什么意義,它會創建一個新文件 ,寫一段內容,可以再把寫的內容讀出來,沒什么卵用。
- r+ 讀寫,能讀能寫,但都是寫在文件最后,跟追加一樣。
- a+ 追加讀,文件一打開時光標會在文件尾部,寫的數據全會是追加的形式。
r+ 模式示例:
因為默認就是往文件尾部寫入。
八、修改文件
嘗試直接以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會覆蓋原文件
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
