测开2 - Python(文件操作)
把第一次寫好漏掉的點(diǎn)寫在最前面:文件讀寫的內(nèi)容都要求是字符串。
幾種文件操作的模式:
1. 'r',讀模式(默認(rèn)模式),只能讀不能寫,文件不存在時(shí)報(bào)錯(cuò)
2. 'w',寫模式,只能寫不能讀,文件不存在時(shí)會(huì)創(chuàng)建,但是存在時(shí)會(huì)先清空原文件內(nèi)容
3.?'a',追加模式,增加新內(nèi)容,不存在時(shí)會(huì)創(chuàng)建,但不能讀
4.?'r+',讀寫模式,能寫能讀,但文件不存在時(shí)會(huì)報(bào)錯(cuò)
5.?'w+',寫讀模式,能讀能寫,文件不存在會(huì)創(chuàng)建,但文件存在時(shí)會(huì)先清空原文件內(nèi)容
6.?'a+',追加讀模式,啥都能(能寫,即追加新內(nèi)容,不存在會(huì)創(chuàng)建,能讀,不影響原內(nèi)容)
總之,只要 r 相關(guān)的,不存在時(shí)都報(bào)錯(cuò),w 相關(guān)的,都會(huì)清空原文件內(nèi)容,運(yùn)用時(shí)可根據(jù)實(shí)際情況選擇模式。日常操作就是讀寫操作配合合適的模式。
?一、讀
read():?一次性獲取文件內(nèi)容,返回值為 string
1 f = open('test.txt',encoding='utf-8') 2 result = f.read() #獲取文件內(nèi)容,read()方法一次性讀取所有內(nèi)容 3 print(result) 4 5 f.close()readline(): 讀取一行
readlines(): 一次性讀取,并把文件內(nèi)容存到 list 中,一行為一個(gè)元素
1 f = open('jlf.txt',encoding='utf-8') 2 result = f.readlines() 3 print(result) #結(jié)果:['a\n', 'b\n', 'c\n', 'd\n', 'e\n', 'f'],如果要去掉'\n',則需要用 strip() 方法 4 5 f.close()?
二、寫
write:直接寫內(nèi)容
writelines:循環(huán)把內(nèi)容寫進(jìn)文件,對(duì)象可以是字符串、列表,只要是能循環(huán)的都可以。
1 s='sdfasdf' 2 f = open('jlf.txt','w',encoding='utf-8') 3 4 # for i in s: 5 # f.write(i) 6 f.writelines(s) #把 list 的內(nèi)容循環(huán)寫進(jìn)文件,與上一個(gè)注釋掉的方法效果相同 7 f.close()?
三、文件指針
是用來指示文件操作的位置。讀模式下,指針在最前;寫模式下,因?yàn)闀?huì)清空內(nèi)容,所以也算是在前面;追加模式下,指針在最后。
?
四、文件中的其他方法(除了上面說過的讀和寫)
1 f = open('jlf.txt','r+',encoding='utf-8')#encoding參數(shù)可以指定文件的編碼 2 f.readable()#判斷文件是否可讀 3 f.writable()#判斷文件是否可寫 4 f.tell()#獲取當(dāng)前文件的指針指向 5 f.seek(0)#把當(dāng)前文件指針指向最前面 6 f.fulsh()#寫入文件后,立即從內(nèi)存中把數(shù)據(jù)寫到磁盤中 7 f.truncate()#清空文件內(nèi)容 8 f.writelines(['1','2'])#將一個(gè)列表寫入文件中 9 f.close()關(guān)閉文件?
五、幾種高效的操作
1. 不用關(guān)閉文件的方式
為防止每次打開文件使用之后忘記關(guān)閉,有這樣一種方法,可以在你代碼運(yùn)行完之后自動(dòng)關(guān)閉文件,如下
1 with open('jlf.txt',encoding='utf-8') as f1,open('abc.txt','w',encoding='utf-8') as f2: 2 content = f1.read() 3 f2.write(content) 4 print(content)2. 高效處理文件
在讀取文件內(nèi)容的時(shí)候,如果用 read 或者 readlines,都會(huì)直接把所有內(nèi)容讀取到內(nèi)存,文件較大時(shí)可能直接導(dǎo)致內(nèi)存不夠用機(jī)器卡死,所以這里給出一種比較高效的方式
1 with open('access.log',encoding='utf-8') as f: 2 for line in f: #直接循環(huán)文件,一次讀一行 3 print('每次:',line)?
六、修改文件
?1. 第一種屬于簡(jiǎn)單直接粗暴的方式,適合小文件的處理,步驟如下
- 先讀取內(nèi)容
- 替換內(nèi)容
- 清除原有內(nèi)容
- 寫進(jìn)新內(nèi)容
例如:
1 f = open('jlf.txt','a+',encoding='utf-8') 2 f.seek(0) 3 results = f.read() 4 content = results.replace('xiaolan','dalan') 5 f.seek(0) 6 f.truncate() #清空文件內(nèi)容,或者用w模式再打開一次 7 f.write(content) 8 f.close()(這種的弊端其實(shí)寫在了上一條,高效處理文件的方法中,這種是把所有內(nèi)容一次性拿來放在內(nèi)存,改完之后再重新寫回文件)
2. 逐行處理
- 打開 a 文件
- 從 a 讀一行,修改,修改后寫到 b 文件里
- 刪除 a 文件,把 b 重命名為 a
例如:
1 with open('jlf.txt',encoding='utf-8') as f,open('aaaa.txt','w',encoding='utf-8') as f2: 2 3 for line in f: 4 result = line.upper() 5 f2.write(result) 6 7 import os 8 os.remove('jlf.txt') #對(duì)文件的刪除和重命名操作需要放在文件關(guān)閉之后 9 os.rename('aaaa.txt','jlf.txt')?
七、最后貼一個(gè)練習(xí)
?監(jiān)控服務(wù)器日志,要求找出每分鐘訪問超過100次的 ip 地址
1 import time 2 point = 0 #用來標(biāo)記下面文件讀取的位置,方便繼續(xù)讀取 3 while True: #自己再寫忘記循環(huán) 4 with open('access.log',encoding='utf-8') as f: 5 f.seek(point) 6 ips = {} 7 for line in f: 8 if line.strip() != '': #忘記處理空行 9 ip = line.split(‘ ’)[0] #split后的()以一個(gè)空格分隔時(shí),可以空著不寫(),也可以寫入一個(gè)空格(' ') 10 if ip in ips.keys(): 11 ips[ip] += 1 12 else: 13 ips[ip] = 1 14 point = f.tell() 15 for k in ips: 16 if ips[k] >= 100: 17 print('有問題的 ip 是:',k) #自己寫時(shí),輸出應(yīng)為 ip,寫成了其對(duì)應(yīng)的 key 18 time.sleep(60)?
八、json 操作
說白了 json 就是一個(gè)字符串。格式其實(shí)就是一個(gè)字典。
有的時(shí)候文件讀取過程中,文件內(nèi)存的是json,剛好我們讀出來也需要轉(zhuǎn)成字典格式,那就需要有一種方法可以直接識(shí)別這種格式,json 模塊中剛好就帶了這樣的方法。
1.寫文件
import json d = {"error_code": 0,"stu_info": [{"id": 314,"name": "礦泉水","sex": "男","age": 18,"addr": "北京市昌平區(qū)","grade": "摩羯座","phone": "18317155663","gold": 100},{"id": 315,"name": "礦泉水","sex": "女","age": 27,"addr": "上海","grade": "摩羯座","phone": "18317155664","gold": 100}] } with open('abc.txt','w',encoding='utf-8') as fw:#s = json.dumps(d,ensure_ascii=False,indent=4) #把字典轉(zhuǎn)成json,字符串#fw.write(s) json.dump(d,fw,indent=4,ensure_ascii=False)
有兩種方法,dump 和 dumps。被注釋的兩行代碼中用了 dump,但兩行的作用相當(dāng)于最后一行。也就是說,json 自帶了 dumps 方法可以直接拿到要寫入的對(duì)象,寫到目標(biāo)文檔中。
2. 讀文件
1 import json 2 with open('abc.txt',encoding='utf-8') as fr: 3 result = json.load(fr) 4 print(type(result))json.load() 方法,非常方便,直接返回一個(gè)字典。
轉(zhuǎn)載于:https://www.cnblogs.com/april-aaa/p/10939648.html
總結(jié)
以上是生活随笔為你收集整理的测开2 - Python(文件操作)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hdfs的特性、命令、安全模式、基准测试
- 下一篇: LOL剑圣怎么打