1. 程式人生 > >Python學習筆記三——文件操作及處理json

Python學習筆記三——文件操作及處理json

r+ 3.4 windows phone wow64 con odin 某個文件 like

一、文件操作

基礎知識:

1.open是打開已存在的文件或新建一個文件(在文件名後需加訪問模式)

2.close是把剛剛新建或打開的文件關閉

3.write可以向文件中導入數據

4.read(num)可以從文本中讀取數據,num表示要從文件中讀取的數據的長度(單位是字節),如果沒有傳入num,那麽就表示讀取文件中所有的數據

5.readlines可以按照操作行的方式把整個文件中的內容一次性讀取,並且返回的是一個列表,其中每一行的數據為一個元素

6.tell在讀寫過程中可以知道文件的地址

7.seek()在讀寫過程中可以進行另一個位置操作
seek(offset,fom)
offset:偏移量
from:方向
0:表示文件開頭
1:表示當前位置
2:表示文件末尾

另:

在os模塊中對文件的操作
1.rename 可以對文件重命名
2.remove 可以對文件進行刪除操作
3.mkdir 創建文件夾
4.getcwd 獲取當前目錄
5.chdir 改變默認目錄
6.listdir 獲取目錄列表
7.rmdir 刪除文件夾

對文件的操作分三步:

1、打開文件獲取文件的句柄,句柄就理解為這個文件

2、通過文件句柄操作文件

3、關閉文件。


基本操作 :
1         f = open(file.txt,r) #以只讀方式打開一個文件,獲取文件句柄,如果是讀的話,r可以不寫,默認就是只讀,
2         在python2中還有file方法可以打開文件,python3中file方法已經沒有了,只有open        
res = f.read()#獲取所有文件內容
print(res) #打印文件的所有內容
f.close()#關閉文件

      
           f = open(‘file.txt‘,‘r‘)
3         frist_line = f.readline()#獲取文件的第一行內容,返回的是一個list
4         print(frist_line)#打印第一行
     f.close()#關閉文件

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

打開文件的模式有:

 1  r,只讀模式(默認)。打開文件不存的話,會報錯
2 w,只寫模式。【不可讀;不存在則創建;存在則刪除內容;】 3 a,追加模式。【不可讀; 不存在則創建;存在則只追加內容;】 4 5 6 "+" 表示可以同時讀寫某個文件 7 8 r+ 讀寫模式 【可讀、可寫;可追加,如果打開的文件不存在的話,會報錯】 9 w+ 寫讀模式 【寫讀模式,使用w+的話,已經存在的文件內容會被清空,可以讀到已經寫的文件內容】 10 a+ 追加讀模式 【追加讀寫模式,不存在則創建;存在則只追加內容;】 11 12 "U"表示在讀取時,可以將 \r \n \r\n自動轉換成 \n (與 r 或 r+ 模式同使用) 13 14 rU 15 r+U 16 17 "b"表示處理二進制文件(如:FTP發送上傳ISO鏡像文件,linux可忽略,windows處理二進制文件時需標註) 18 rb 19 wb 20 ab

文件操作方法:

 1             f = open(file.txt,r+,encoding=utf-8)#encoding參數可以指定文件的編碼
 2             f.readline()#讀一行
 3             f.readable()#判斷文件是否可讀
 4             fr.writable()#判斷文件是否可寫
 5             fr.encoding#打印文件的編碼
 6             f.read()#讀取所有內容,大文件時不要用,因為會把文件內容都讀到內存中,內存不夠的話,會把內存撐爆
 7             f.readlines()#讀取所有文件內容,返回一個list,元素是每行的數據,大文件時不要用,因為會把文件內容都讀到內存中,內存不夠的話,會把內存撐爆
 8             f.tell()#獲取當前文件的指針指向
 9             f.seek(0)#把當前文件指針指向哪
10             f.write(愛情證書)#寫入內容
11             f.fulsh()#寫入文件後,立即從內存中把數據寫到磁盤中
12             f.truncate()#清空文件內容
13             f.writelines([愛情證書,孫燕姿])#將一個列表寫入文件中
14             f.close()關閉文件

讀取小文件時,可以

 1 f = open(users.txt,encoding=utf-8)
 2 #文件對象、文件句柄
 3
 4 # while True:
 5 #     line = f.readline()
 6 #     if line!=‘‘:
 7 #         print(‘line:‘,line)
 8 #     else:
 9 #         print(‘文件內容都讀完了,結束了‘)
10 #         break

用上面的read()和readlines()方法操作文件的話,會先把文件所有內容讀到內存中,這樣的話,內存數據一多,非常卡,高效的操作,就是讀一行操作一行,讀過的內容就從內存中釋放了

大文件時,讀取文件高效的操作方法:

1
  f = open(‘users.txt‘,encoding=‘utf-8‘)
     for line in f:
2      print(line)

這樣的話,line就是每行文件的內容,讀完一行的話,就會釋放一行的內存

with使用:

在操作文件的時候,經常忘了關閉文件,這樣的就可以使用with,它會在使用完這個文件句柄之後,自動關閉該文件,使用方式如下:

1     with open(file.txt,r) as f:#打開一個文件,把這個文件的句柄付給f
2           for line in f:
3               print(line)
4    with open(file.txt) as fr,with open(file_bak,w) as fw: #這個是多文件的操作,打開兩個文件,fr是讀file.txt,fw是新建一個file_bak文件
5            for line in fr:#循環file.txt中的每一行
6                fw.write(line)#寫到file_bak文件中

修改文件:

修改文件的話,有兩種方式,

一種是把文件的全部內容都讀到內存中,然後把原有的文件內容清空,重新寫新的內容;

第二種是把修改後的文件內容寫到一個新的文件中

下面是一個file.txt

        寂寞當然有一點

        你不在我身邊

        總是特別想念你的臉

        距離是一份考卷

第一種方法: a:

1 #1、簡單、粗暴直接的
2 f = open(file.txt,encoding=utf-8)
3 res = f.read().replace(一點,二點)
4 f.close()
5 f = open(file.txt,mode=w,encoding=utf-8)
6 f.write(res)
7 f.flush()  # 立即把緩沖區裏面的內容,寫到磁盤上
8 f.close() 

替換後的lile.txt :

        寂寞當然有二點 

        你不在我身邊

        總是特別想念你的臉

        距離是一份考卷

        

或者 : b:

1 with open(file.txt, r+,encoding=utf-8) as fr:
2     res1 = fr.read()
3     fr.seek(0)
4     new_res = res1.replace(, you)
5     fr.write(new_res)

或者 :

f = open(file.txt,a+,encoding=utf-8)
f.seek(0)
res = f.read().replace(,you)
f.seek(0)
f.truncate() #清空文件裏面的內容
f.write(res)
f.close()

修改後的file.txt:

   寂寞當然有二點

        you不在我身邊

        總是特別想念you的臉

        距離是一份考卷

第二種方法:

 (二)a:
import os
f = open(file.txt,encoding=utf-8)
f2 = open(file.txt.bak,w,encoding=utf-8)
for line in f:
    new_line = line.replace(一點,二點)
    f2.write(new_line)
f.close()
f2.close()
os.remove(file.txt)
os.rename(file.txt.bak,file.txt)

 (二)b:
import os
with open(file.txt,encoding=utf-8) as f, open(file.txt.bak,w,encoding=utf-8) as f2:  #這個是多文件的操作,打開兩個文件,f是讀file.txt,f2是新建一個file_bak文件
    for line in f:  #循環file.txt中的每一行
        new_line = line.replace(‘一,‘二)
        f2.write(new_line)  #寫到file_bak文件中

os.remove(file.txt)
os.rename(file.txt.bak,file.txt)

替換後file.txt:

  寂寞當然有二點 

        你不在我身邊

        總是特別想念你的臉

        距離是一份考卷

        

拓展練習 : 監控日誌

日誌文件 :

access.log
178.210.90.90 - - [04/Jun/2017:03:44:13 +0800] "GET /wp-includes/logo_img.php HTTP/1.0" 302 161 "http://nnzhp.cn/wp-includes/logo_img.php" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.99 Safari/533.4" "10.3.152.221"
178.210.90.90 - - [04/Jun/2017:03:44:13 +0800] "GET /blog HTTP/1.0" 301 233 "http://nnzhp.cn/wp-includes/logo_img.php" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.99 Safari/533.4" "10.3.152.221"
178.210.90.90 - - [04/Jun/2017:03:44:15 +0800] "GET /blog/ HTTP/1.0" 200 38278 "http://nnzhp.cn/wp-includes/logo_img.php" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.99 Safari/533.4" "10.3.152.221"
66.249.75.29 - - [04/Jun/2017:03:45:55 +0800] "GET /bbs/forum.php?mod=forumdisplay&fid=574&filter=hot HTTP/1.1" 200 17482 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" "-"
37.9.169.20 - - [04/Jun/2017:03:47:59 +0800] "GET /wp-admin/security.php HTTP/1.1" 302 161 "http://nnzhp.cn/wp-admin/security.php" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.99 Safari/533.4" "-"
37.9.169.20 - - [04/Jun/2017:03:48:01 +0800] "GET /blog HTTP/1.1" 301 233 "http://nnzhp.cn/wp-admin/security.php" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.99 Safari/533.4" "-"
37.9.169.20 - - [04/Jun/2017:03:48:02 +0800] "GET /blog/ HTTP/1.1" 200 38330 "http://nnzhp.cn/wp-admin/security.php" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.99 Safari/533.4" "-"
37.9.169.20 - - [04/Jun/2017:03:48:21 +0800] "GET /wp-admin/security.php HTTP/1.1" 302 161 "http://nnzhp.cn/wp-admin/security.php" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.99 Safari/533.4" "-"
37.9.169.20 - - [04/Jun/2017:03:48:21 +0800] "GET /blog HTTP/1.1" 301 233 "http://nnzhp.cn/wp-admin/security.php" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.99 Safari/533.4" "-"
37.9.169.20 - - [04/Jun/2017:03:48:23 +0800] "GET /blog/ HTTP/1.1" 200 38330 "http://nnzhp.cn/wp-admin/security.php" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.99 Safari/533.4" "-"
42.236.49.31 - - [04/Jun/2017:03:49:04 +0800] "GET /questions HTTP/1.1" 200 41977 "http://bbs.besttest.cn/questions" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36; 360Spider" "-"
66.249.75.28 - - [04/Jun/2017:03:49:42 +0800] "GET /bbs/forum.php?mod=forumdisplay&fid=473&filter=digest&digest=1 HTTP/1.1" 200 17242 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" "-"
123.125.71.60 - - [04/Jun/2017:03:52:50 +0800] "GET /robots.txt HTTP/1.1" 302 161 "-" "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)" "-"
123.125.71.117 - - [04/Jun/2017:03:52:50 +0800] "GET /blog HTTP/1.1" 301 233 "-" "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)" "-"
123.125.71.80 - - [04/Jun/2017:03:52:51 +0800] "GET /blog/ HTTP/1.1" 200 38330 "-" "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)" "-"
66.249.75.28 - - [04/Jun/2017:03:53:29 +0800] "GET /bbs/forum.php?mod=forumdisplay&fid=516&filter=heat&orderby=heats HTTP/1.1" 200 17019 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" "-"
40.77.167.135 - - [04/Jun/2017:03:55:07 +0800] "GET /static/css/bootstrap/fonts/glyphicon

 1 #1、要從日誌裏面找到1分鐘之內訪問超過200次的
 2 #2、每分鐘都運行一次
 3 
 4 # 1、讀取文件內容,獲取到ip地址
 5 # 2、把每個ip地址存起來 {}
 6 # 3、判斷ip訪問的次數是否超過200次
 7 # 4、加入黑名單 print
 8 
 9 #[‘118.24.4.30‘,‘118.24.4.30‘,‘118.24.4.30‘,‘118.1xx.x.xx‘,‘118.1xx.x.xx‘]
10 # {
11 #     ‘118.23.3.40‘:2,
12 #     ‘118.23.3.41‘:5
13 # }
14 import time
15 point = 0 #初始的位置  
16 while True:
17     ips = {}  # 存放ips字典
18     f = open(access.log,encoding=utf-8)
19     f.seek(point)
20     for line in f: #循環取文件裏面每行數據
21         ip = line.split()[0] #按照空格分割,取第一個元素就ip
22         if ip in ips:#判斷這個ip是否存在
23             # ips[ip] = ips[ip]+1
24             ips[ip]+=1#如果存在的話,次數加+1
25         else:
26             ips[ip]=1 #如果不存在ip的次數就是1
27     point = f.tell() #記錄文件指針位置,下一個60s後從這個位置開始循環
28     f.close()
29     for ip,count in ips.items():#循環這個字典,判斷次數大於200的
30         if count>=200:
31             print(%s 加入黑名單%ip)
32     time.sleep(60)
3

二、處理Json

# json通用的數據類型,所有的語言都認識
# k-v { }
#json串是字符串

json串格式 : 用三個單引號 引住json ps: json的鍵值一定是用雙引號
 1 s=‘‘‘
 2 {
 3         "error_code": 0,
 4         "stu_info": [
 5                 {
 6                         "id": 309,
 7                         "name": "小白",
 8                         "sex": "男",
 9                         "age": 28,
10                         "addr": "河南省濟源市北海大道32號",
11                         "grade": "天蠍座",
12                         "phone": "18512572946",
13                         "gold": 100
14                 },
15                 {
16                         "id": 310,
17                         "name": "小白",
18                         "sex": "男",
19                         "age": 28,
20                         "addr": "河南省濟源市北海大道32號",
21                         "grade": "天蠍座",
22                         "phone": "18516572946",
23                         "gold": 100
24                 }
25         ]
26 }
27 
28 ‘‘‘

json是一種所有語言中都通用的key-value數據結構的數據類型,很像python中的字典,json處理使用json模塊,json模塊有下面常用的方法:

json.dumps()

json.dump()

json.loads()

json.load()

1     import json    
2     dic = {"name":"niuniu","age":18}
3     print(json.dumps(dic))#把字典轉成json串
# 輸出 :
{"age": 18, "name": "niuniu"}


4 fj = open(a.json,w) # a.json不存在的 5 print(json.dump(dic,fj))#把字典轉換成的json串寫到一個文件裏面
# 輸出 : 在當前的目錄下,新增了一個a.json文件,文件內容為json :
{"age": 18, "name": "niuniu"}

 
6 s_json = {"name":"niuniu","age":20,"status":true} 7 print(json.loads(s_json))#把json串轉換成字典
# 輸出 :
{‘status‘: True, ‘name‘: ‘niuniu‘, ‘age‘: 20}



8 fr = open(‘a.json,r) # a.json 內容為 : {"age": 18, "name": "niuniu"}
9   print(json.load(fr))#從文件中讀取json數據,然後轉成字典
# 輸出 :
{‘name‘: ‘niuniu‘, ‘age‘: 18}

Python學習筆記三——文件操作及處理json