文件操作和集合
阿新 • • 發佈:2018-04-12
ren 移動文件 基本 識別 ini 同學 update 寫入文件 每次
判斷方法
# 非空即真、非0即
#不為空的話就是true,是空的話就是false
#只要不是0 就是 true,是0就是false
#布爾類型 True False
# print(bool(‘‘)) # print(bool(‘g‘)) name=input(‘name:‘).strip() if name:#輸入不為空則真 print(‘輸入不是為空‘) else: print(‘輸入不能為空‘) #這些空數據都能識別 a=[] b={} c=0 f=tuple() e=‘‘ a=b=c=0#定義了3個變量,值都是0 可以用這麽方法定義多個變量
交互變量:
#a,b交換值 a=1 b=2 c=None c=b b=a a=c b,a=a,b#交換a,b兩個變量值 Python已經在底層引用第三方變量 b,a,c=a,c,b#對應交換 #不引用第三方變量,交換a,b值 a=a+b b=a-b a=a-b
深拷貝淺拷貝
l=[1,1,2,3,4,5,6,8]#循環刪list裏面的數據時,結果會不正確 for i in l:#循環l2 if i%2!=0: l.remove(i) print(l) #結果為:[1, 2, 4, 6, 8] l2=[1,1,2,3,4,5,6,8] print(id(l)) print(id(l2)) for i inl2:#循環l2,卻刪除l,這樣就不會刪除了l下標 if i%2!=0: l.remove(i) print(l) #結果為:[ 2, 4, 6, 8] import copy #淺拷貝,內存地址一樣 #深拷貝,重新開辟內存空間 l2=copy.deepcopy(l)#深拷貝 l2=l#淺拷貝 #示例,淺拷貝 # lis=[1,1,2,3,4,5,6,8] # lis2=lis # print(id(lis)) # print(id(lis2)) # lis2.append(‘zhangliuliang‘) # print(lis)#lis會增加zhangliuliang#深拷貝 lis=[1,1,2,3,4,5,6,8] lis2=copy.deepcopy(lis) lis2.append(‘test‘) print(id(lis)) print(id(lis2)) print(lis)#lis不會增加zhangliuliang
集合
集合也是一種數據類型,一個類似列表東西,它的特點是無序的,不重復的,也就是說集合中是沒有重復的數據
集合的作用:
1、它可以把一個列表中重復的數據去掉,而不需要你再寫判斷
2、可以做關系測試,比如說有兩個班,一個性能測試班,一個是接口測試班的,想找出來既學習了性能又學習了接口測試的同學,就可以用集合
#集合天生去重 s=set()#空集合 s2=set(‘1231123fddf‘) print(s2) s3={1,1,3,4,5,6,7} d={‘k‘:‘v‘} #交集 並集 差集 #取交集 print(s2 & s3)#結果為空,因為s3元素為整型,s2為字符串 s3={‘1‘,‘2‘,‘3‘,‘4‘,‘5‘,‘6‘,‘7‘} print(s2 & s3) print(s3.intersection(s2)) #並集,就是把兩個集合合並在一起,然後去重 print(s2|s3) print(s2.union(s3)) #差集 就是去除某個集合相同的元素 s4={1,2,3} s5={1,4,6} print(s4-s5) print(s4.difference(s5)) #對稱差集,去掉兩集合都存在的元素 print(s4 ^ s5) print(s4.symmetric_difference(s5)) #print(s4.symmetric_difference_update(s5)) s4.add(‘ss‘) s4.pop()#隨機刪除一個元素 s4.remove(‘ss‘)#指定刪除哪個 s4.update({1,2,3})#把另外一個集合加進來 s4.discard(1)#如果刪除的元素存在則刪除,如果不存在不做處理 s4.isdisjoint(s5)#如果有集合則False,沒有交集則Flase #判讀是否子集、父集 print(s4.issubset(s5)) # 判斷s4是不是s5的子集 print(s4.issuperset(s5)) # 判斷s4是不是s5的父集
文件:
對文件的操作分三步:
1、打開文件獲取文件的句柄,句柄就理解為這個文件
2、通過文件句柄操作文件
3、關閉文件。
文件的幾種模式:
# 讀模式 r 讀寫模式 r+ #1、不能寫 #2、文件不存在的話會報錯 # 寫模式 w, 寫讀模式 w+ #1、文件不存在的話,會幫你新建文件 #2、打開一個已經存的文件,他會清空以前文件的內容 #3、不能讀 # 追加模式 a, 追加讀模式 a+ #文件末尾去增加內容 # 1、文件不存在的話,會幫你新建文件 # 2、打開一個已經存的文件,不會清空,末尾增加 # 3、不能讀 1、打開文件的模式有: r,只讀模式(默認)。 w,只寫模式。【不可讀;不存在則創建;存在則刪除內容;】 a,追加模式。【不可讀; 不存在則創建;存在則只追加內容;】 2、"+"表示可以同時讀寫某個文件 r+,【可讀、可寫;可追加,如果打開的文件不存在的話,會報錯】 w+,【寫讀模式,使用w+的話,已經存在的文件內容會被清空,可以讀到已經寫的文件內容】 a+,【追加讀寫模式,不存在則創建;存在則只追加內容;】 3、"U"表示在讀取時,可以將 \r \n \r\n自動轉換成 \n (與 r 或 r+ 模式同使用) rU r+U 4、"b"表示處理二進制文件(如:FTP發送上傳ISO鏡像文件,linux可忽略,windows處理二進制文件時需標註 rb wb ab
文件基本操作:
f = open(‘pwd.txt‘,‘r‘,encoding=‘utf-8‘) #以只讀方式打開一個文件,獲取文件句柄,如果是讀的話,r可以不寫,默認就是只讀,文件不存在會報錯 #在python2中還有file方法可以打開文件,python3中file方法已經沒有了,只有open frist_line = f.readline()#獲取文件的第一行內容 print(frist_line)#打印第一行 res = f.read()#因為前面已經讀取第一行,文件指針已經指向第二行,所以獲取除了第一行剩下的所有文件內容 print(res) f.close()#關閉文件 # 結果: # 10123,123!qweQ # # 123,123!qwQW # 321,123@qwQw # 我
f = open(‘names‘,‘a+‘,encoding=‘utf-8‘) #打開文件,采用utf-8編碼打開 f.seek(0) print(f.read()) #讀文件 # print(f.readline()) #讀取一行內容 # print(f.readlines()) #是把文件的每一行放到一個list裏面 f.write(‘\n‘)#換行寫入 f.write(‘天氣真好‘)#寫入 f.seek(0)#寫入數據之後文件指針在最後一行,應該重新移動到第一行才能完全讀取內容 print(f.read())
文件操作方法:
(1)
f = open(‘pwd.txt‘,‘a+‘,encoding=‘utf-8‘)#encoding參數可以指定文件的編碼 f.seek(0)#把當前文件指針指向哪 print(f.readline())#讀一行 f.readable()#判斷文件是否可讀 print(f.readable()) f.writable()#判斷文件是否可寫 print(f.writable()) f.encoding#打印文件的編碼 print(f.encoding) f.read()#讀取所有內容,大文件時不要用,因為會把文件內容都讀到內存中,內存不夠的話,會把內存撐爆 f.readlines()#讀取所有文件內容,返回一個list,元素是每行的數據,大文件時不要用,因為會把文件內容都讀到內存中,內存不夠的話,會把內存撐爆 f.tell()#獲取當前文件的指針指向 print(f.tell()) f.write(‘你好‘)#寫入內容 #f.fulsh()#寫入文件後,立即從內存中把數據寫到磁盤中 f.seek(0) f.truncate()#清空文件內容 f.truncate(10)#截取10個字符 f.seek(0) print(f.read()) f.writelines([‘姓名‘,‘hwt‘])#將一個列表寫入文件中 f.seek(0) print(f.read()) f.close()#關閉文件
(2)大文件時,讀取文件高效的操作方法:
用上面的read()和readlines()方法操作文件的話,會先把文件所有內容讀到內存中,這樣的話,內存數據一多,非常卡,高效的操作,就是讀一行操作一行,讀過的內容就從內存中釋放了
f = open(‘pwd.txt‘) for line in f: print(line)#這樣的話,line就是每行文件的內容,讀完一行的話,就會釋放一行的內存
(3)with使用:
在操作文件的時候,經常忘了關閉文件,這樣的就可以使用with,它會在使用完這個文件句柄之後,自動關閉該文件,使用方式如下:
with open(‘pwd.txt‘,‘r‘,encoding=‘utf-8‘) as f:#打開一個文件,把這個文件的句柄付給f for line in f: print(line) with open(‘pwd.txt‘,encoding=‘utf-8‘) as fr, open(‘names‘,‘w‘,encoding=‘utf-8‘) as fw: #這個是多文件的操作,打開兩個文件,fr是讀pwd.txt,fw是新建一個names文件 for line in fr:#循環pwd.txt中的每一行 fw.write(line)#寫到names文件中 print(line) #結果: # If I were a boy如果我是個男孩 # Even just for a day就算只是一天 # If I were a boy如果我是個男孩 # Even just for a day就算只是一天(4)修改文件
with open(‘pwd.txt‘,‘r+‘,encoding=‘utf-8‘) as f: res = f.read() new_res = res.replace(‘我‘,‘me‘) #f.write(‘\n‘) f.write(new_res) f.seek(0) for line2 in f: print(line2) #結果: # If I were a boy如果我是個男孩 # Even just for a day就算只是一天 # 我 # If I were a boy如果me是個男孩 # Even just for a day就算只是一天 # me
with open(‘pwd.txt‘,‘r‘,encoding=‘utf-8‘) as f:#先看pwd文件數據 for line in f: print(line) with open(‘phones.txt‘,‘r‘,encoding=‘utf-8‘) as f:#在看phone文件數據 for line in f: print(line) with open(‘pwd.txt‘,encoding=‘utf-8‘) as fr, open(‘phones.txt‘,‘w+‘,encoding=‘utf-8‘) as fw: #這個是多文件的操作,打開兩個文件,fr是讀pwd.txt,fw是新建一個names文件 for line in fr:#循環pwd.txt中的每一行 new_line = line.replace(‘我‘,‘me‘) fw.write(new_line)#寫到names文件中 with open(‘phones.txt‘,‘r‘,encoding=‘utf-8‘) as f:#輸出替換後的phone數據進行對比 for line2 in f: print(line2) #結果: #pwd輸出數據 # If I were a boy如果我是個男孩 # Even just for a day就算只是一天 # 我 # phone替換前數據 # 大家好 # 蘋果 # 香蕉 # 快樂 #phone替換後數據,因為W有清空功能,所以原先數據清除了 # If I were a boy如果me是個男孩 # Even just for a day就算只是一天 # me
小練習:
#需求 # 1、監控日誌,如果有攻擊咱們的,就把ip加入黑名單 #分析: #1、打開日誌文件 #2、把ip地址拿出來 #3、判斷每一個ip出現的次數,如果大於100次的話,加入黑名單 #4、每分鐘讀一次 #直接循環一個文件對象的話,每次循環的是文件的每一行 #文件句柄 文件對象 import time point = 0 # 每次記錄文件指針的位置 while True: all_ips = [] #存放所有的ip地址 f = open(‘access.log‘,encoding=‘utf-8‘) f.seek(point)#移動文件指針 for line in f: ip = line.split()[0] all_ips.append(ip) point = f.tell() #記錄了指針的位置 all_ip_set = set(all_ips) # for ip in all_ip_set: if all_ips.count(ip)>50: print(‘應該加入黑名單的ip是%s‘%ip) f.close() time.sleep(60) #暫停60秒
文件操作和集合