list、dict、set、元祖、字串和檔案
阿新 • • 發佈:2021-01-02
一、list的排序(倒序和降序)
list1 = [1, 2, 4, 2, 6] for i in list1: print(i) # 排序 --倒序 list1.reverse() print(list1) # 升序 list1.sort() print(list1) # 降序 list1.sort(reverse=True) print(list1)
二、list轉成字典
user_list = ['cyx', 'lml', 'tqb'] pwd_list = [123, 456, 789] user_list_dict = {} # 將list存入字典中 當兩個list長度不等時 用長度來迴圈for i in range(len(user_list)): user_list_dict[user_list[i]] = pwd_list[i] print(user_list_dict)
三、dict增、刪、改、查和遍歷
# 字典與json相似 # 區別在於json必須要雙引號 字典兩者皆口 user_dict = {'cyx': 123, 'lml': 456, 'tqb': 789} # 增 # value是不限制資料型別的,一個字典裡可放多個數據型別 也可以直接將定義的變數賦值進去 user_dict['python'] = 1234 user_dict['list'] = [1, 2, 3, 4] user_dict['str'] = 'password' # key一般定義為可以識別 能理解的key # 每個key為userID時,value是user資訊 key可以命名為數字 user_dict[1001] = {'name': 'cyx', 'age': 18, 'score': 98.0} print(user_dict) # 刪-------del del user_dict[1001] print(user_dict) # 刪-------pop =======會返回刪除的key對應的值 print(user_dict.pop('cyx')) # 改user_dict['lml'] = 123 print(user_dict) # 查=====精準查詢 print(user_dict['python']) print(user_dict['list']) # 查詢不存在的值 print(user_dict.items()) # 遍歷整個dict 每個key-value輸出為元祖 print(user_dict.keys()) # 返回所有的key 輸出為list print(user_dict.values()) # 返回所有的value 輸出為list
# 遍歷字典中所有的key # 第一種=======keys()取出所有的key for k in user_dict.keys(): print(k) # 第二種=======取出字典所有的元素 for k in user_dict.items(): print(k) print(k[0], k[1]) # 第三種=========兩張變數的迴圈 for k, v in user_dict: print(k, v) # 判斷key是否存在 # 第一種 user_dict['43242'] # 會報keyerror # 第二種 print(user_dict.get('432432')) # 值不存在時,返回None
四、set集合
# 集合set 不可重複 可以用來去重 w = [1, 2, 3, 2, 4, 5, 3] print(set(w)) s = {1, 2, 3, 4, 5} s1 = {2, 4, 6, 8, 0} # 合併集合 s.update(s1) # s集合與s1的並集 在s集合的基礎上進行修改 不生成新的集合 print(s) # 交集 s3 = s.intersection(s1) print(s3) # 並集 s2 = s.union(s1) # 兩個集合並起,形成一個新的集合 print(s2) # 差集 在s中存在 在s1中不存在的 s4 = s ^ s1 print(s4)
五、元祖tuple和list之間的轉換
# 元祖資料不能修改(tuple) t = (1, 2, 3, 4) l1 = [1, 2, 3, 4] # 除不能修改排序,基本方法基本一樣 # 如何list和元祖互相轉換 # list---tuple 強轉 t2 = tuple(l1) print(t2) # 迴圈轉入list中 t1 = [] for i in t: t1.append(i) print(t1) # 元祖可強轉為list 無法迴圈 l2 = list(t) print(l2)
六、字串的常用方法(查、格式化、去空格及大小寫轉換)
t = 'hahabhba' # a出現的次數 print(t.count('a')) # 從左到右查詢 a第一次出現所在的下標 print(t.find('a')) print(t.find('b')) # 和find一樣 print(t.index('b')) # format un = '姓名:{name},年齡:{age}' print(un.format(name='xw', age=20)) # 賦值 寫死 # format_map 把字典中的每個key和字串中的宣告的站位去進行查詢 更靈活 print(un.format_map({'name': 'wqw','age': 20})) # 去空格 去除前後的空格 print(' abc'.strip()) print('abc '.strip()) print('a b c'.strip()) # 判斷是否是純空格 返回bool型別 print(' '.isspace()) # True print(' 1 '.isspace()) # False # isalpha 判斷是否是純數字 純數字返回False 其他返回True print('今天'.isalpha()) print('123'.isalpha()) print('adsd'.isalpha()) print('ad123>>'.isalpha()) # 轉換大小寫 f = 'hhaQWE' print('f:', f) print(t.upper()) # 大寫 print(t.lower()) # 小寫 # =====重要===== f1 = 'xiaowang,xiaoli,xiaoming' print(f1.split(',')) print(f1.replace(',', '\n')) # 把,替換成換行符/n val = '這學生的姓名是:{name}' for i in f1.split(','): print(val.format(name=i)) # 倒序 new_f1 = f1.split(',') # 切分 print(new_f1.reverse()) # 反轉 for i in new_f1: print(val.format(name=i)) # 提取ip,用空格分開,分開後,會生成list 取list下標為1的元素 str = '223.104.3.169 - - [03/Jul/2020:17:09:33 +0800] ''' \ '"GET /bbs/forum.php HTTP/1.1" 404 1045 "-" "Apache-HttpClient/4.5.10 (Java/1.8.0_201)"' log = str.split(' ')[0] print(log) # 是否以輸入的內容開始或結束 返回布林型別 print(t.startswith('h')) print(t.endswith('h')) print(t.endswith('b')) # 去除左、右空格 print(' a bc '.lstrip()) print(' ab c '.rsplit()) # 返回的是列表 print(' ab c '.strip())
六、字串的切片使用
s = 'http://baidu.com/' # s[起始:結束:步長]print(s[7:]) # 起始為7,結束為最後一位 print(s[:6]) # 沒有結束,只有起始,則代表從0開始,到6的前面 print(s[1:4]) # 從1開始 到4之前結束 print(s[1:3:2]) # 2是步長 每次遞增2 print(s[:-13]) print(s[:-1]) li = [1, 2, 5, 2, 4, 5, 1, 4] print(li[2:6]) # 切片應用,提取下標2(包含)到下標為6(不包含)直接的值
七、檔案讀寫
# 1、檔案開啟 # 相對路徑 # ../day02/n.txt(上層目錄) ./n.txt(當前路徑) ../../day02/n.txt(多層路徑) # 絕對路徑 # /user/local/ngixt/n.txt file = open('n.txt', encoding='utf-8') # print(file) 打印出來是物件 # 全部讀取 print(file.read()) # 檔案讀取是流 讀過了 下面再讀就沒有內容了 # 讀取一行 print(file.readline()) # 讀取所有行 返回的是列表 print(file.readlines()) # 關閉檔案 file.close() file1 = open('n.txt', encoding='utf-8') # 第一種 迴圈遍歷檔案 for l in file1.readlines(): print(l.strip()) # 第二種 逐行讀取 最好選擇逐行 for line in file1: print(line.strip()) file1.close() # 操作模式 分為r(僅讀取) w(寫入,每次新寫入) a(追加append) f = open('a.txt', 'w', encoding='utf-8') data = '天琴座' # 寫入資料 f.write(data) l1 = ['xq', 'ws', 'ed'] # 第一種寫入 f.writelines(l1) # 第二種 迴圈寫入 for i in l1: f.write(i) f.write('\n') f.close()
八、非空即真
# 布林型別 True False 只要變數是有值為真,為空或None為假 print(bool(None)) print(bool('')) print(bool('1')) user = input('請輸入使用者名稱:') print(user) if user: print("使用者輸入的內容:", user) else: print('未輸入')
九、日誌提取ip報警練習
# nginx日誌監控系統 # 資料來源為access。log # 用來監控日誌中記錄的ip # 當某一個ip出現次數超過50次後 報警 # 且打印出報警資訊 報警XXXX地址 已經訪問超50次 # 執行頻率 每分鐘執行一次 # 讀取 import time # 讓這個程式滾動起來 不會停止 # while True: # file = open('access.log', encoding='utf-8') # # print(file.readlines()) # # 提取ip 記錄次數 # ip = [] # for l1 in file: # ip.append(l1.strip().split(' ')[0]) # # print(ip) # set_ip = set(ip) # for i in set_ip: # if ip.count(i) >= 50: # # 列印報警資訊 # print('報警{ip}地址 已經訪問超50次'.format(ip=i)) # print(set_ip) # # # 每次讀取時,需要跳過已讀資料,需要記錄上次讀取位數 下次讀取時 先進行跳轉 # file.close() # print('end') # time.sleep(5) ip_dict = {} point = 0 while True: file = open('access.log', encoding='utf-8') # print(file.readlines()) # 跳到上次讀取的位置,如果第一次就是初始值point為0 file.seek(point) # 需考慮是否要清空 for line in file: ip = line.strip().split(' ')[0] # 提取ip 記錄次數,如清空需要全量去讀取, # 如果不清空則每次要加入增量,不然把重複的資料會加入到字典中 if ip_dict.get(ip): # 獲取對應k的值 沒有則走下一個迴圈 ip_dict[ip] += 1 else: ip_dict[ip] = 1 for k, v in ip_dict.items(): if v >= 50: # 列印報警資訊 print('報警{ip}地址 已經訪問超50次'.format(ip=k)) # 記錄讀取後的位置 point = file.tell() # 每次讀取時,需要跳過已讀資料,需要記錄上次讀取位數 下次讀取時 先進行跳轉 file.close() print('end') time.sleep(5)