python3筆記(合集)
阿新 • • 發佈:2019-03-11
重點跟進的課程:
day14正則表示式
day16面向物件程式設計
day18多執行緒
day19http協議和request模組的使用
day16面向物件程式設計
day25結巴分詞
day27根據關鍵詞批量採集文章
day36爬蟲斷點續爬
2.關於網頁請求:
#最簡單的網頁請求模組: import urllib.request headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" " (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36" } url = 'https://www.duanwenxue.com/sanwen/suibi/' req = urllib.request.Request(url, headers=headers)#請求 resp = urllib.request.urlopen(req) #開啟網頁 html = resp.read().decode('gbk', 'ignore') #讀取 print(html)
1.基礎篇:函式
#【1】 print("hello", 'world', sep='/', file=sys.stderr) # 輸出到標準錯誤 #【2】 # 如果不指定,那麼就會使用系統的編碼(gbk) f = open("輸出.txt", 'w', encoding='utf-8') # 這個是開啟一個檔案,然後用只寫的模式開啟 #【3】 ran = range(101) # for i in ran: # print(i) print(sum(ran)) #------------------day3-------------- #【4】 引號包括:單引號、雙引號、三引號 str7 = 'hello\nworld' print(str7) str8 = 'hello\r\naa' print(str8) str9 = 'hello\tpython' print(str9) #【5】字串提取 len(str2) #字串長度 str1 = "hello#world" str3 = str1[:] # 字串切片操作 # [:] 提取整個字串 # [start:] 從start提取到結尾 # [: end] 從頭提取到end-1 # [start: end] 從start提取到end-1 #【6】判斷一個字串是否在另一個字串 #成員操作(in) str1 = "hello world" isin = 'hello' in str1 print(isin) # - 判斷一個字串是否在另一個字串裡面 # - 如果存在那麼就返回True,否則返回False #【7】字串編碼 #- 只有Unicode編碼的字串才有encode方法編碼其它型別的編碼(python3中會轉成bytes型別) #------------------day4-------------- 列表的建立,訪問和賦值 [] () split list() range(n) for len #如果不想要另一個列表同樣發生變化,那麼就需要使用切片[:]進行賦值 #判斷開頭,結尾,字串 url = "https://www.sanwen8.cn/subject/nxnyyi.html" print(url.endswith('.html')) print(url.startswith('https://')) #都是true #lambda方法,join方法 list1 = list('abcdef') list2 = map(lambda x: x, 'abcde') print('/'.join(list1)) -----------------------------列表------------------------------- #format方法 str2 = 'my name is {1}, I\'m {0} years old.'.format(30, 'xiaoming') str4 = 'my name is {name}, I\'m {age} years old.'.format(age=33, name='xiaoming') #pop()方法,刪除 L3 = L2.pop() pi = "PI = {:.3f}".format(3.1415926) print(pi) #結果 PI = 3.142 這個看不懂 #append()方法 list3.insert(1, ['a']) # insert是指定位置插入,第一個引數是下標值 list5.extend('abc') # extend(在末尾追加)引數必須是可迭代型別 list5.remove(6) # remove() 函式用於移除列表中某個值的第一個匹配項 list8.sort(reverse=True) # sort可以將列表的元素進行排序,reverse引數如果設定為True那麼結果就是倒序的 print(list12.count(10)) list15 = [1, 2, 3, 4, 5, 6]#求和 print(sum(list15) -----------------------------元組------------------------------- *x, y = (10, 20, "hello", 'seo', 3.14) # 星號在解包中代表一個或多個元素,儘可能多的包含 # 星號可以將多餘的元素打包為一個list print(x, type(x)) print('y=', y) -----------------------------集合------------------------------- A = {1, 2, 3} B = {1, 2, 3, 4, 5} print(A < B) # 判斷集合A是不是集合B的真子集,如果是則返回True -----------------------------字典------------------------------- frozenset() 返回一個凍結的集合,凍結後集合不能再新增或刪除任何元素 #set和frozenset區別https://www.cnblogs.com/panwenbin-logs/p/5519617.html D.get(k[,d]) 獲取字典中鍵名為k的值,如果k不存在,那麼就返回d,d是可選引數,預設值是None d1 = {} d1['seo'] = [{'seo是什麼': 90, 'SEO教程': 900, 'seo方案': 230}, {'淘寶seo': 90, 'SEO高階用法': 50}] print(d1) print(d1['seo']) sorted #sorted() 函式對所有可迭代的物件進行排序操作 title = "三星新廣告再懟蘋果 外媒:以新比舊三星未免可笑_TechWeb" if 'TechWeb' in title: newtitle = title.replace('TechWeb', '')#替換 【增刪改查】 list1 = [40, 8, 15, 18, 12] pop_sort(list1) #排序 #迴圈 while for if elif else continue pass join format .append n = random.randint(1, 100) break x for x in range(10) -----------------------------def函數語言程式設計------------------------------- d = 10 #全域性函式 # 函式定義:用def定義函式, def sumx(end): if end <= 0: return 0 return end + sumx(end - 1) def gen(): yield 10 for x in gen(): print(x) -----------------------------檔案操作------------------------------- # 檔案讀寫,網路請求統稱叫IO操作 # input output 輸入和輸出 # 流(stream) """ 'buffer', 'close'關閉, 'closed', 'detach', 'encoding'獲取檔案編碼, 'errors', 'fileno', 'flush'重新整理緩衝區,將內容寫入到檔案, 'isatty', 'line_buffering', 'mode', 'name', 'newlines', 'read'讀取檔案所有內容, 'readable', 'readline', 'readlines', 'seek', 'seekable', 'tell', 'truncate', 'writable', 'write'寫入, 'writelines' """ f = open('test01.txt', mode='w', encoding='utf-8', buffering=1) f.write("漢諾塔(又稱河內塔)問題是源於印度一個古老傳說的益智玩具。" "大梵天創造世界的時候做了三根金剛石柱子\n") # line = f.readline() # for line in f: # 檔案流是可迭代物件,所以可以用for迴圈一行行的讀取出來 lines[i] = line.strip() print(f1.tell()) # 追加模式,游標一開始就移動到檔案的末尾 img = open('P1.jpg', mode='rb') # 二進位制讀模式 # print(img.read()) print(img.tell()) img2 = open('p2.jpg', mode='wb') # 二進位制寫模式 img2.write(img.read()) img.close() -----------------------------錯誤與異常處理------------------------------- 1. 錯誤和異常處理 - 每種錯誤都有自己對應的異常類 - Exception能夠捕獲所有的錯誤 - try可以和except配對 - else語句是指沒有異常發生的時候才會執行,必須放在except之後 - finally語句是指不管有沒有異常發生,都會執行finally語句中的程式碼,放在最後 - 可以直接用try-finally語句 - 當try-finally語句中有錯誤發生的時候,程式執行完finally語句之後就會退出,不會繼續往下執行 - 只有通過except語句捕獲之後才會往下執行 try: f = open("1.txt") f.write('wwww') except Exception as e: print(e) def openfile(fiename): try: f = open(fiename) except Exception: raise IOError("檔案格式不對,或檔案不存在") else: return f openfile('1.txt') assert 1 == 1, '1 != 0' list1 = [0, 2, 3] try: assert list1[0] == 1, 'list1[1] != 1' except AssertionError as e: print(e) import random snum = random.randint(0, 100) while True: unum = input("Input a number:") try: rnum = int(unum) except ValueError: print('invalid literal') continue if rnum == snum: print("you guess it") break elif rnum < snum: print('less than') else: print("lager than") from urllib import error from urllib import request def download(url, encoding='utf-8'): try: html = request.urlopen(url).read() except error.HTTPError as e: print('got http error', e) except error.URLError: print('url not true') except ValueError: print("invalid url") else: return html.decode(encoding) -----------------------------模組和包------------------------------- import re 1. 模組匯入 - 用import 語句匯入一個模組 - 一個py檔案就是一個模組 - 檔名就是模組名 - 匯入模組的時候,會執行模組檔案 - 模組的搜尋路徑:當前檔案所在目錄->系統環境變數下的目錄 - from...import... 從指定的模組中匯入指定的函式或變數或類 - as 給匯入的模組或函式或變數等取別名 2. 第三方模組和包的安裝方法 - pip install 包/模組名 - easy_install 包/模組名 - pip uninstall 包/模組名 -解除安裝 3. 包 - 包就是普通檔案目錄下多了一個__init__.py檔案 - 匯入包的時候會自動執行__init__.py 檔案 - 可以使用import和from...import語句匯入包中的模組 - 在模組中如果要使用包中某個模組的屬性、方法,那麼需要匯入模組才行,不能直接通過包來訪問 - 如果只是匯入包名,那麼只能用包自身的屬性(變數)和方法(函式) -----------------------------正則表示式-------------------------------【day14】重點課,常複習! import re # ret = re.match('(l)', 'hello world') # ret = re.search('(l)', "hello world") # reg = re.compile('(\D+)') # all_list = re.findall('(^我\w+)', mul_line, flags=re.MULTILINE) all_list = re.search('([a-c]+)', mul_line, re.I) # print(all_list.group(1)) # new = re.sub('a(b)c', 'z\g<1>y', "hello abc") line = '自制電椅處死蟑螂:燈泡閃爍約15秒,後蟑螂死去_新聞頻道_中華網' ret = re.split('[:,_]#去除掉括號裡面的', line, flags=re.X) print("_".join(ret[:-2])) #【day14】,有個日誌分析指令碼:logAnalysis.py,main.py, import re content = "" with open('xiaoqiang.html', encoding='utf-8') as f: content += f.read() title = re.search(r'<title>(.*?)</title>', content, flags=(re.I | re.S)) title = title.group(1) if title else "" print(title) all_like = re.findall(r'<a href=".*?" class="pvOnMod1".*?>(.*?)</a>', content) # print(all_like) post = re.search(r'<div.*?id="endText".*?>(.*?)<div class="ep-source cDGray">', content, re.I | re.S) newpost = post.group(1).strip() # clean = re.sub('</?.*?>|\s', "", newpost, flags=(re.I | re.S)) clean = re.subn('</?.*?>|\s', "", newpost, flags=(re.I | re.S)) print(clean) -----------------------------urllib庫------------------------------- 1. urllib包 - request模組:開啟和讀取url的 - error模組:包含了request模組丟擲的異常 - parse模組:解析url的 - robotparser模組:解析robots.txt檔案的 2. request模組 - urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None) - 引數: - url:可以是一個字串(url連線)也可以是一個Request物件 - data: 傳送給伺服器的資料 - timeout: 連線超時,時間單位是秒 3.class urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None) - 返回一個Request物件,能夠作為urlopen的第一個引數 - url就是要請求的url連線,是一個合法的字串 - data post請求的時候要傳送的資料 - headers 是一個字典,用於構造自定義的請求頭 - origin_req_host 請求的host主域 - unverifiable 是否驗證HTTPS - method 請求方法
-------------------------------------day16面向物件程式設計----------------- class A: def __init__(self, name, age): self.name = name self._age = age def _sayhi(self): print('Hi, my name is{}. I am {}'.format(self.name, self._age)) """面向物件程式設計: 面向物件: 面向過程: - 面向過程是按照步驟進行的 - 有明確的步驟 - 案例:把大象裝進大的冰箱裡 - 1.把冰箱的門開啟 - 2.把大象拉到冰箱門口 - 3.把大象推進冰箱裡面 - 4.把冰箱門關起來 什麼是面向物件? - 面向物件是基於物件本身的 - 沒有固定步驟,只有相應的行為和屬性 - 案例:把大象裝進冰箱 - 有兩個物件:大象和冰箱 - 大象的行為:走路,吃東西,睡覺 - 大象的屬性:耳朵大,四條腿,鼻子長,體重高 - 冰箱的行為:開門,關門,冰凍,裝東西 - 冰箱的屬性:立方體的、黑色、品牌、型號 - 通過呼叫裝東西的這個行為,就可以把大象裝進冰箱 - 類和例項 - 類就是分類,表明物件是屬於哪個分類的,該分類有什麼行為和屬性,也就是區別於其他的類的東西 - 例項就是某個類下具體的某樣東西。比如:大象叫什麼名字,多重,吃多少東西,幾歲了。例項就是 區別與別的東西 - __main__.Elephant object at 0x00314790 名稱空間 類名 記憶體地址 類屬性和例項屬性、例項方法 - 直接在類下面寫的屬性(變數)就是類屬性 - 類屬性是所有的類例項物件都共享的 - 類屬性只能通過類名來修改 - 例項物件可以呼叫類屬性 - 類名可以呼叫類屬性 - 例項屬性是每個例項獨有的,修改例項屬性本身並不會影響到其他例項物件 - 例項屬性是在__init__函式裡面宣告(定義)的 - 例項屬性在例項化的時候需要制定 - 例項化時會最先執行__init__函式,如果有引數,那麼需要傳入指定的引數 — 類名不能呼叫例項屬性 - 例項物件可以呼叫例項方法(行為) - 類名如果要呼叫例項方法的時候,需要傳入具體的例項物件 - 例項方法的第一個引數表示例項物件本身 類方法 - 類方法的第一個引數名稱是cls,代表的是類本身 - 類方法的宣告需要使用裝飾器@classmethod - 類名可以呼叫類方法 - 例項物件也可以呼叫類方法 靜態方法 - 當一個函式,即用不到類的屬性和方法,也用不到例項的屬性和方法的時候,但是又想把它 放在類裡面方便管理,這時候就需要用到靜態方法 - 靜態方法使用@staticmethod 進行修飾,表明該方法是靜態方法 - 靜態方法裡面是不能引用例項屬性、例項方法,但是可以通過類名類呼叫類屬性和類方法(但是不建議) - 例項物件和類名都可以呼叫靜態方法 魔術方法 - 魔術方法是python類內建的一些方法名稱,以雙下劃線開頭和結尾的 - 面向物件的三大特徵:封裝、繼承、多型 類的繼承(單繼承) - 子類可以繼承父類,通過類名()裡面放入父類的名稱就可以了 - 子類可以繼承父類的屬性和方法 - 如果子類要新增自己例項屬性的時候,需要重寫__init__函式,並呼叫父類的__init__函式 - 子類可以新增自己的方法 - 子類也可以重寫父類的方法 類的繼承(多重繼承) - 要想獲取所有父類的屬性,那麼需要顯式的再__init__方法中呼叫父類的__init_方法 - 假如多個父類的方法重名,預設使用的是第一個父類的方法,要想指明使用哪個父類的 方法的時候,需要重寫該方法,然後重寫的方法裡面呼叫指定父類的方法 類的成員私有化 - 屬性私有化 - 方法私有化 - 完全私有化,在屬性或方法名稱前面用雙下劃線(__) - 完全私有化的屬性和方法只能在類的內部訪問,例項物件不能訪問到 - 部分私有化(property)保護屬性 - 保護屬性 屬性和方法名稱前面是一個下劃線(_), 例項物件可以方法"""
pickle模組
https://www.cnblogs.com/abobo/p/8080447.html