Python學習筆記(九)—文件的操做

總結內容:app

  一、文件的基本操做步驟ide

  二、文件的打開方式函數

  三、操做文件用到的方法編碼

  四、練習url

 1、文件的基本操做步驟spa

  一、找到操做的文件(若是在同一目錄下使用相對路徑;若是不在相同目錄下要使用絕對路徑)指針

  二、打開文件日誌

  三、操做文件進行讀寫code

  四、關閉文件對象

2、文件的打開方式

  一、open()方法

    open() 方法用於打開一個文件,並返回文件對象,在對文件進行處理過程都須要使用到這個函數,若是該文件沒法被打開,會拋出 OSError。

    格式:open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

    參數說明:

      file: 必需,文件路徑(相對或者絕對路徑)。

      mode: 可選,文件打開模式

      buffering: 設置緩衝

      encoding: 通常使用utf8

      errors: 報錯級別

      newline: 區分換行符

      closefd: 傳入的file參數類型

      opener:

    說明:使用open方式打開文件,最後必定要記得使用close方法關閉文件

1 #打開test.txt文件
2 f = open('test.txt') #test.txt文件同py文件在同一目錄下
3 print(f.read())  #讀取文件中的全部內容
4 f.close() #關閉文件
View Code

  二、使用with方式打開文件,使用該方式打開文件後,會自動關閉打開的文件

    格式:with  open(文件,操做方式) as  文件別名:

          操做文件主體

with open('test.txt','a') as f: #以最近方式對文件進行操做
    f.write('test11') #往文件中寫入數據
View Code

3、操做文件用到的方法

  說明:文件操做的模式包括:讀、寫、追加三種模式,默認讀模式

    r:以只讀方式打開文件。文件的指針將會放在文件的開頭。這是默認模式;若是文件不存在,程序將會報錯

    rb:以二進制格式打開一個文件用於只讀。文件指針將會放在文件的開頭。這是默認模式。通常用於非文本文件如圖片等

     r+:打開一個文件用於讀寫。文件指針將會放在文件的開頭。打開不存在的文件,程序報錯;能夠寫入內容可是寫入的內容會從文件的頂部開始覆蓋原文件

    w:打開一個文件只用於寫入。若是該文件已存在則打開文件,並從開頭開始編輯,即原有內容會被刪除。若是該文件不存在,建立新文件。

    wb:以二進制格式打開一個文件只用於寫入。若是該文件已存在則打開文件,並從開頭開始編輯,即原有內容會被刪除。若是該文件不存在,建立新文件。通常用於非文本文件如圖片等。

     w+:打開一個文件用於讀寫。若是該文件已存在則打開文件,並從開頭開始編輯,即原有內容會被刪除。若是該文件不存在,建立新文件。能夠寫入內容,可是因爲會清空內容,因此返回值都是空

     a:打開一個文件用於追加。若是該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容以後。若是該文件不存在,建立新文件進行寫入。

    ab:以二進制格式打開一個文件用於追加。若是該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容以後。若是該文件不存在,建立新文件進行寫入。

     a+:打開一個文件用於讀寫。若是該文件已存在,文件指針將會放在文件的結尾。文件打開時會是追加模式。若是該文件不存在,建立新文件用於讀寫。經常使用模式,既能夠讀文件也能夠寫文件

  一、讀文件的方法 

    read()方法:讀取文件中的全部內容,以字符串的方式進行展現。

f = open('test.txt','r+')
res = f.read()
print(res)
f.close()

運行結果:
test11
View Code

    readline()方法:獲取文件中的每一行的內容,以字符串形式展現

1 f = open('test.txt')
2 print(f.readline())  #打印第一行內容
3 print(f.readline())  #打印第二行內容
4 f.close()
5 
6 運行結果:
7 test11
8 test12
View Code

    readlines()方法:獲取文件中全部的內容,以字符的形式展現

1 f = open('test.txt')
2 print(f.readlines())  #讀取全部內容
3 f.close()
4 
5 運行結果:
6 ['test11\n', 'test12\n', 'test13\n', 'test14\n', 'test15\n']
View Code

  二、寫文件方法

    write()方法:向文件中寫入指定字符串

1 f = open('test.txt','w')
2 f.write('test16')
3 f.close()
4 f = open('test.txt')
5 print(f.read())
6 f.close()
7 
8 運行結果:
9 test16
View Code

    writelines()方法:向文件中寫入一序列的字符串

 1 a = ['list1\n','list2\n','list3\n']
 2 f = open('test.txt','w')
 3 f.writelines(a)
 4 f.close()
 5 f = open('test.txt')
 6 print(f.read())
 7 f.close()
 8 
 9 運行結果:
10 list1
11 list2
12 list3
View Code

  三、修改文件內容

    方式一:

1 f = open('users.txt')
2 res = f.read().replace('test','wyh')
3 f.close()
4 f = open('users.txt','w')
5 f.write(res)
6 f.close()
View Code

    方式二:

1 f = open('users.txt','a+')
2 f.seek(0)  #將文件指針移動文件開始位置
3 res = f.read().replace('test','list')  #將文件內容中的test修改成list
4 f.seek(0)
5 f.truncate()   #清空文件裏面的內容
6 f.write(res)
7 f.close()
View Code

    方式三:

 1 import os  #導入os模塊
 2 f = open('users.txt')
 3 f2 = open('users.txt.bat','w')
 4 for line in f:
 5     new_line  = line.replace('list','test')  #將文件內容中的list修改成test
 6     f2.write(new_line)  #將修改的內容,添加到文件2中
 7 f.close()
 8 f2.close()
 9 os.remove('users.txt')  #刪除原文件
10 os.rename('users.txt.bat','users.txt')   #將修改後的問題重命名
View Code

  四、打開二進制文件並保存

1 import requests   #導入requests模塊
2 url = 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1584945092&di=ba5f1891ad196f22cb25394d459780d5&imgtype=jpg&er=1&src=http%3A%2F%2Fi0.hdslb.com%2Fbfs%2Farchive%2F40bbc6dc7f5691d5ee1e4f1aeaa307f4f745ee41.jpg'
3 res = requests.get(url).content  #打開URL地址並以二進制形式進行讀取
4 f = open('changba.jpg','wb') #以讀模式打開文件
5 f.write(res)
6 f.close()
View Code

  五、文件的高效處理

  首先處理文件中的內容的流程大概是:CPU-->內存-->磁盤;首先把數據從磁盤中取出並放入到內存中,而後CPU處理的時候直接從內存中讀取。可是內存的大小是有限制的,若是咱們打開一個特別的大的文件,若是一下將全部內容都讀取到內存勢必會給內存帶來很大的壓力,因此處理大文件的時候咱們儘可能是逐行去處理。逐行讀取代碼的示例以下:

 1 #使用while循環方式,讀取文件
 2 f = open('users.txt',encoding='utf-8')
 3 while True:
 4     line = f.readline()
 5     if line != '':
 6         print('line:',line)
 7     else:
 8         print('end')
 9         break
10 f.close()
11 
12 #使用for循環方式,讀取文件
13 f = open('users.txt',encoding='utf-8')
14 f.seek(0)
15 for line in f:
16     print(line)
17 f.close()
View Code

  六、其它方法

    seek()方法:肯定文件指針的位置

    flush()方法:刷新緩衝區,即當即把緩衝區裏面的內容寫入磁盤

    tell()方法:記錄文件指針的當前位置

    truncate()方法:清空文件的內容,須要配和指針使用
    注意:若是寫入文件報錯的話須要制定字符編碼

 4、練習

   練習:監控日誌
    一、從日誌裏面找到,1分鐘以內超過20次訪問的IP
    二、腳本每分鐘運行一次
   思路:
    一、讀取文件內容,獲取IP地址
    二、把每一個IP地址存起來,使用字典存儲(避免重複)
    三、判斷IP訪問的次數是否超過20次
    四、加入黑名單

 

 1 import time
 2 point = 0
 3 while True:
 4     ips = {}
 5     f = open(r'C:\Users\Administrator\Desktop\access.log', encoding='utf-8')  #文件前邊加入r表明路徑中的特殊字符不會被轉義
 6     f.seek(point)
 7     for line in f:
 8         ip = line.split()[0]
 9         if ip in ips:
10             ips[ip] += 1
11         else:
12             ips[ip] = 1
13     point = f.tell()  # 記錄文件指針的位置
14     for ip, count in ips.items():
15         if count >= 20:
16             print('%s  加入黑名單!' % ip)
17     f.close()
18     time.sleep(60)
View Code
相關文章
相關標籤/搜索