V1.0功能:AQI計算
案例描述:
案例分析:
- 實現步驟:
- 實現每種污染物對應的AQI函數,一個輸入參數,即Cp
- 實現線性縮放函數,5個輸入參數
上機實驗:

1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 # author: Kevin.Wang 4 # time : 2018/10/16 5 6 7 """ 8 作者:王鑫正 9 版本:1.0 10 日期:2018/10/16 11 功能:AQI計算 12 """ 13 14 15 def cal_linear(iaqi_lo, iaqi_hi, bp_lo, bp_hi, cp): 16 """ 17 范圍縮放 18 """ 19 iaqi = (iaqi_hi - iaqi_lo) * (cp - bp_lo) / (bp_hi - bp_lo) + iaqi_lo 20 return iaqi 21 22 23 def cal_pm_iaqi(pm_val): 24 """ 25 計算PM2.5的IAQI 26 """ 27 if 0 <= pm_val < 35: 28 iaqi = cal_linear(0, 50, 0, 35, pm_val) 29 elif 35 <= pm_val < 75: 30 iaqi = cal_linear(50, 100, 35, 75, pm_val) 31 elif 75 <= pm_val < 115: 32 iaqi = cal_linear(100, 150, 75, 115, pm_val) 33 else: 34 pass 35 36 return iaqi 37 38 39 def cal_co_iaqi(co_val): 40 """ 41 計算CO的IAQI 42 """ 43 if 0 <= co_val < 3: 44 iaqi = cal_linear(0, 50, 0, 3, co_val) 45 elif 3 <= co_val < 5: 46 iaqi = cal_linear(50, 100, 2, 4, co_val) 47 48 else: 49 pass 50 51 return iaqi 52 53 54 def cal_aqi(para_list): 55 """ 56 AQI計算 57 """ 58 pm_val = para_list[0] 59 co_val = para_list[1] 60 61 pm_iaqi = cal_pm_iaqi(pm_val) 62 co_iaqi = cal_co_iaqi(co_val) 63 64 iaqi_list = [] 65 iaqi_list.append(pm_iaqi) 66 iaqi_list.append(co_iaqi) 67 68 aqi = max(iaqi_list) 69 return aqi 70 71 72 def main(): 73 """ 74 主函數 75 """ 76 print('請輸入以下信息,用空格分隔') 77 input_str = input('(1)PM2.5 (2)CO:') 78 str_list = input_str.split(' ') 79 pm_val = float(str_list[0]) 80 co_val = float(str_list[1]) 81 82 para_list = [] 83 para_list.append(pm_val) 84 para_list.append(co_val) 85 86 # 調用AQI計算函數 87 aqi_val = cal_aqi(para_list) 88 89 print('空氣質量指數為:{}'.format(aqi_val)) 90 91 92 if __name__ == '__main__': 93 main()
V2.0功能:json文件讀取
案例描述:
- 讀取已經獲取的JSON數據文件
- 並將AQI前5的數據輸出到文件
上機實驗:

1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 # author: Kevin.Wang 4 # time : 2018/10/16 5 6 7 """ 8 作者:王鑫正 9 版本:1.0 10 日期:2018/10/16 11 功能:2.0 JSON文件讀取 12 """ 13 import json 14 15 16 def process_json_file(filepath): 17 """ 18 解碼json文件 19 """ 20 f = open(filepath,mode='r',encoding='utf-8') 21 city_list = json.load(f) 22 return city_list 23 24 25 def main(): 26 """ 27 主函數 28 """ 29 filepath = input('請輸出json文件名稱:') 30 city_list = process_json_file(filepath) 31 city_list.sort(key=lambda city:city['aqi']) 32 top5_list = city_list[:5] 33 34 f = open('top5_aqi.json',mode='w',encoding='utf-8') 35 json.dump(top5_list,f,ensure_ascii=False) 36 f.close() 37 38 39 if __name__ == '__main__': 40 main()
補充說明:
1. JSON格式
- JSON(JavaScript Object Notation)是一種輕量級數據交換格式
- 可以對復雜數據進行表達和存儲,易於閱讀和理解
- 規則
- 數據保存在鍵值對中
- 鍵值對之間由逗號分隔
- 花括號用於保存鍵值對數據組成的對象
- 方括號用於保存鍵值對數據組成的數組
- 采用對象、數組方式組織起來的鍵值對可以表示任何結構的數據
- JSON格式是互聯網上主要使用的復雜數據格式之一
1 [ 2 { 3 "aqi":47, 4 "area":"北京", 5 "position_name":"萬壽西宮", 6 "time_point":"2017-07-29" 7 }, 8 { 9 "aqi": 63, 10 "area": "北京", 11 "position_name": "叮鈴", 12 "time_point": "2017-07-29" 13 } 14 ]
2. JSON庫
- JSON庫是處理JSON格式的Python標准庫
- 兩個過程:
- 編碼(encoding),將Python數據類型轉換成JSON格式的過程
- 解碼(decoding),從JSON格式中解析數據對用到Python數據類型的過程
- 函數:
- dumps(),將Python數據類型轉換為JSON格式
- loads(),將JSON格式字符串轉換為Python數據類型
- dump(),與dumps()功能一致,輸出到文件
- load(),與loads()功能一致,從文件讀入
3. 列表排序
- list.sort(func)
- func指定了排序的方法
- func可以通過lambda函數實現
4. JSON格式轉換
- 百度搜索“json format”,可以轉換
V3.0功能:讀取JSON數據文件並將其轉換為CSV文件
案例描述:
- 讀取已經獲取的JSON數據文件
- 並將其轉換為CSV文件
上機實驗:

1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 # author: Kevin.Wang 4 # time : 2018/10/16 5 6 7 """ 8 作者:王鑫正 9 版本:1.0 10 日期:2018/10/16 11 功能:3.0 JSON文件讀取,轉換為CSV文件 12 """ 13 import json 14 import csv 15 16 17 def process_json_file(filepath): 18 """ 19 解碼json文件 20 """ 21 f = open(filepath,mode='r',encoding='utf-8') 22 city_list = json.load(f) 23 return city_list 24 25 26 def main(): 27 """ 28 主函數 29 """ 30 filepath = input('請輸出json文件名稱:') 31 city_list = process_json_file(filepath) 32 city_list.sort(key=lambda city:city['aqi']) 33 34 lines = [] 35 # 列名 36 lines.append(list(city_list[0].keys())) 37 for city in city_list: 38 lines.append(list(city.values())) 39 40 f = open('aqi.csv','w',encoding='utf-8',newline='') 41 writer = csv.writer(f) 42 for line in lines: 43 writer.writerow(line) 44 45 46 if __name__ == '__main__': 47 main()
補充說明:
1. CSV格式
- CSV(Comma-Separated Values)是一種通用的、相對簡單的文件格式
- 在商業和科學領域上廣泛使用
- 規則
- 以行為單位
- 每行表示一條記錄
- 以英文逗號分割每列數據(如果數據為空,逗號也要保留)
- 列名通常放置在文件第一行
- import csv
- csv.writerow(list)將列表中的元素寫入文件的一行中
V4.0增加功能:判斷輸入的文件判斷是JSON格式還是CSV格式,並進行相應的操作
案例描述:
- 根據輸入的文件判斷是JSON格式還是CSV格式,並進行相應的操作
上機實驗:

1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 # author: Kevin.Wang 4 # time : 2018/10/16 5 6 7 """ 8 作者:王鑫正 9 版本:1.0 10 日期:2018/10/16 11 功能:4.0 JSON文件讀取,轉換為CSV文件 12 """ 13 import json 14 import csv 15 import os 16 17 18 def process_json_file(filepath): 19 """ 20 解碼json文件 21 """ 22 # f = open(filepath,mode='r',encoding='utf-8') 23 # city_list = json.load(f) 24 # return city_list 25 26 with open(filepath,mode='r',encoding='utf-8') as f: 27 city_list = json.load(f) 28 print(city_list) 29 30 31 def process_csv_file(filepath): 32 """ 33 處理csv文件 34 """ 35 with open(filepath, mode='r', encoding='utf-8', newline='') as f: 36 reader = csv.reader(f) 37 for row in reader: 38 print(', '.join(row)) # 將列表里每一行的函數用‘, ’連接起來 39 40 41 def main(): 42 """ 43 主函數 44 """ 45 filepath = input('請輸入文件名稱:') 46 filename, file_ext = os.path.splitext(filepath) 47 48 if file_ext == '.json': 49 # json文件 50 process_json_file(filepath) 51 elif file_ext == '.csv': 52 # csv文件 53 process_csv_file(filepath) 54 else: 55 print('不支持的文件格式!') 56 57 58 if __name__ == '__main__': 59 main()
補充說明:
1. CSV補充
- CSV文件讀取
1 import csv 2 csv.reader() 將沒行記錄作為列表返回
- 使用with語句操作文件對象
1 with open('file name') as somefile: 2 for line in somefile: 3 print(line)
- 使用with語句,不管在處理文件過程中是否發生異常,都能保證with語句執行完畢后關閉文件,不需要close()語句。
2. os模塊
- os模塊提供了與系統、目錄操作相關的功能,不受平台的限制
函數 | 含義 |
os.remove() | 刪除文件 |
os.makedirs() | 創建多層目錄 |
os.rmdir() | 刪除單級目錄 |
os.rename() | 重命名文件 |
os.path.isfile() | 判斷是否為文件 |
os.path.isdir() | 判斷是否為目錄 |
os.path.join() | 連接目錄,如path1連接path2為path1/path2 |
os.path.splitext() | 將文件分割成文件名與擴展名,如分割tmp.txt為tmp和.txt |
V5.0增加功能:網絡爬蟲
案例描述:
- 為了能有效地提取並利用網絡信息並提供工作效率,出現了網絡爬蟲
- 利用網絡爬蟲實時獲取城市的空氣質量
上機實驗:

1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 # author: Kevin.Wang 4 # time : 2018/10/16 5 6 7 """ 8 作者:王鑫正 9 版本:1.0 10 日期:2018/10/16 11 功能:4.0 JSON文件讀取,轉換為CSV文件 12 """ 13 14 import requests 15 16 17 def get_html_text(url): 18 """ 19 20 """ 21 r = requests.get(url, timeout=30) 22 # print(r.status_code) 23 return r.text 24 25 26 def main(): 27 """ 28 主函數 29 """ 30 city_pinyin = input('請輸入城市拼音:',) 31 url = 'http://pm25.in/' + city_pinyin 32 url_text = get_html_text(url) 33 # print(url_text) 34 aqi_div = '''<div class="span12 data"> 35 <div class="span1"> 36 <div class="value"> 37 ''' 38 index = url_text.find(aqi_div) 39 begin_index = index + len(aqi_div) 40 end_index = begin_index + 2 41 aqi_val = url_text[begin_index:end_index] 42 print('空氣質量為:{}'.format(aqi_val)) 43 44 45 if __name__ == '__main__': 46 main()
補充說明:
1. 網絡爬蟲
- 自動抓取互聯網信息的程序;利用互聯網數據進行分析、開發產品
- 步驟:
- 通過網絡鏈接獲取網頁內容
- 對獲得的網頁內容進行處理
2. requests模塊
- requests模塊是一個簡潔且簡單的處理HTTP請求的工具
- 支持非常豐富的鏈接訪問功能,包括URL獲取,HTTP會話,Cookie記錄等
- requests網頁請求
函數 | 含義 |
get() | 對應HTTP的GET方式 |
post() | 對應HTTP的POST方式,用於傳遞用戶數據 |
- requests對象屬性
函數 | 含義 |
status_code | HTTP請求的返回狀態,200表示連接成功,400表示失敗 |
text | HTTP相應內容的字符串形式,即url對應的頁面內容 |
3. 網頁常用操作
- 查看對應代碼,右鍵選擇“審查元素”
- 打開網頁源碼,Ctrl+U
V5.0
案例描述:
- 為了能有效地提取並利用網絡信息並工作提高效率。出現了網絡爬蟲
- 利用網絡爬蟲實時獲取城市的空氣質量
- 高效地解析和處理HTML,beautifulsoup4
上機實驗:
補充說明:
1. 網頁解析
- 結構化解析
- DOM(Document Object Model),樹形結構
2.BeautifulSoup解析網頁
- 用於解析HTML或XML
- pip install beautifulsoup4
- import bs4
- 步驟
- 創建BeautifulSoup對象
- 查詢節點
- find,找到第一個滿足條件的節點
- find_all,找到所有滿足條件的節點
- 創建對象
- 創建BeautifulSoup對象
1 bs = BeautifulSoup( 2 url, 3 html_parser, 指定解析器 4 enoding 指定編碼格式(確保和網頁編碼格式一致) 5 )