使用Python獲取數據,目前主要的方法集中在文本文件、Excel文件、關係型和非關係型數據庫、API、網頁等方面。php
獲取數據所用到的包:html
Numpy中文文檔:www.numpy.org.cn/article/bas…python
Pands中文文檔:www.pypandas.cn/docs/mysql
Python能夠讀取任意格式的文本數據,使用Python讀取文本數據的基本步驟是:git
(1)定義數據文件;(2)獲取文件對象; (3)讀取文件內容; (4)關閉文件對象。github
定義數據文件即定義要讀取的文件,該步驟不是必須的,能夠跟「獲取文件對象」整合。但爲了後續操做的便捷性、全局數據對象的可 維護性以及減小代碼冗餘,建議讀者養成習慣,將數據文件預先賦值給一個對象。web
定義文本數據文件的方法是:正則表達式
file_name = [文件名稱]
複製代碼
實例:sql
file_name = 'text.txt'
複製代碼
文件名稱中能夠只寫文件名,此時默認Python讀取當前工做目錄下 的文件;也能夠加入路徑,默認使用斜槓,尤爲是Windows下要注意用法。mongodb
獲取文件對象的意義是基於數據文件產生對象,後續全部關於該數據文件的操做都基於該對象產生。
語法:
fileobject = open(name[,mode][,buffering])
複製代碼
參數:
返回:經過open函數會建立一個文件對象(fileobject)。示例:
file_name = 'text.txt'
file_object=open(file_name)
複製代碼
或
file_object=open('text.txt')
複製代碼
Python基於文件對象的讀取分爲3種方法,以讀取text.txt爲例:
這是第一行
這是第二行
這是第三行
複製代碼
關於read()方法:
一、讀取整個文件,將文件內容放到一個字符串變量中
二、若是文件大於可用內存,不可能使用這種處理
執行代碼:
file_name = 'text.txt'
file_object=open(file_name,encoding='utf-8')
text1 = file_object.read()
text1
複製代碼
結果
'這是第一行\n這是第二行\n這是第三行'
複製代碼
關於readline()方法:
一、readline()每次讀取一行,比readlines()慢得多
二、readline()返回的是一個字符串對象,保存當前行的內容
執行代碼:
file_name = 'text.txt'
file_object=open(file_name,encoding='utf-8')
text2 = file_object.readline()
text2
複製代碼
結果
'這是第一行\n'
複製代碼
關於readlines()方法:
一、一次性讀取整個文件。
二、自動將文件內容分析成一個行的列表。
執行代碼:
file_name = 'text.txt'
file_object=open(file_name,encoding='utf-8')
text3 = file_object.readlines()
text3
複製代碼
結果
['這是第一行\n', '這是第二行\n', '這是第三行']
複製代碼
在實際應用中,read方法和readlines方法比較經常使用,並且兩者都能讀取所有文件中的數據。
兩者的區別只是返回的數據類型不一樣,前者返回字符串,適用於全部行都是完整句子的文本文件,例如大段文字信息;
後者返回列表,適用於每行是一個單獨的數據記錄,例如日誌信息。不一樣的讀取方法會直接影響後續基於內容的處理應用;readline因爲每次只讀取一行數據,所以一般須要配合seek、next等指針操做才能完整遍歷讀取全部數據記錄。
每次使用完數據對象以後,須要關閉數據對象。方法是
file_object.close()
複製代碼
理論上,Python能夠讀取任意格式的文件,但在這裏先講以讀取格式化的文本數據文件爲主,其中包括txt、csv、tsv等格式的文件,以及有固定分隔符分隔並以通用數據編碼和字符集編碼(例如utf八、ASCII、GB2312等)存放的無擴展名格式的數據文件。
另外,Python文件操做中的指針相似於Word操做中的光標,指針所處的位置就是光標的位置,它決定了Python的讀寫從哪裏開始。默認狀況下,當經過open函數打開文件時,文件的指針處於第一個對象的位置。所以,在上述經過readline讀取文件內容時,獲取的是第一行數據。仍然是上面示例中的數據文件,咱們經過以下代碼演示基於不一樣指針位置讀取的內容:
fn=open('text.txt',encoding='utf-8')#得到文件對象
print(fn.tell())#輸出指針位置
line1=fn.readline()#得到文件第一行數據
print(line1)#輸出第一行數據
print(fn.tell())#輸出指針位置
line2=fn.readline()#得到文件第二行數據
print(line2)#輸出第二行數據
print(fn.tell())#輸出指針位置
line3=fn.readline()#得到文件第三行數據
print(line3)#輸出第三行數據
fn.close()#關閉文件對象
複製代碼
結果:
0
這是第一行
16
這是第二行
32
這是第三行
複製代碼
Numpy讀取數據的方法包括loadtxt、load和fromfile等3種
numpy.loadtxt(fname, dtype=<type 'float'>, comments='#', delimiter=None, converters=None, skiprows=0, usecols=None, unpack=False, ndmin=0)
複製代碼
參數 | 做用 |
---|---|
fname | 被讀取的文件名(文件的相對地址或者絕對地址) |
dtype | 指定讀取後數據的數據類型 |
comments | 跳過文件中指定參數開頭的行(即不讀取) |
delimiter | 指定讀取文件中數據的分割符 |
converters | 對讀取的數據進行預處理 |
skiprows | 選擇跳過的行數 |
usecols | 指定須要讀取的列 |
unpack | 選擇是否將數據進行向量輸出 |
encoding | 對讀取的文件進行預編碼 |
執行代碼:
import numpy as np
txt_array = np.loadtxt('text.txt',dtype=str,comments='#',encoding='utf-8')
print(txt_array)
複製代碼
結果
['這是第一行' '這是第二行' '這是第三行']
複製代碼
numpy.load(file, mmap_mode=None, allow_pickle=True, fix_imports=True, encoding='ASCII')[source])
複製代碼
參數 | 做用 |
---|---|
file | 要讀取的文件,字符串或pathlib.Path。類文件對象必須支持 seek()和read()方法。pickle文件要求類文件對象也支持該readline()方法。 |
mmap_mode | 內存映射模式,值域爲None、'r+'、'r'、'w+'、'c',選填。 |
allow_pickle | 布爾型,選填,決定是否容許加載存儲在npy文件中的pickled對象數組,默認值爲True。 |
fix_imports | 布爾型,選填,僅在Python3上加載Python2生成的pickle文件時纔有用,其中包括包含對象數組的npy / npz文件。若是fix_imports爲True,則pickle將嘗試將舊的Python 2名稱映射到Python 3中使用的新名稱。 |
encoding | 字符串,決定讀取Python2字符串時使用何種編碼,選填。 |
執行代碼:
import numpy as np#導入nump庫
write_data=np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])#定義要存儲的數據 np.save('load_data',write_data)#保存爲npy數據文件
np.save('load_data',write_data)#保存爲npy數據文件
read_data=np.load('load_data.npy')#讀取npy文件
print(read_data)#load()沒法直接讀取txt文件,只能讀取.npy或者.npz的文件。
複製代碼
結果
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
複製代碼
numpy.fromfile(file, dtype=float, count=-1, sep='')
複製代碼
參數 | 做用 |
---|---|
file | 要讀取的文件,字符串或pathlib.Path。 |
dtype | 數據類型 |
count | 整數型,讀取數據的數量,-1意味着讀取全部數據。 |
sep | 字符串,若是file是一個文本文件,那麼該值就是數據間的分隔符。若是爲空("")則意味着file是一個二進制文件,多個空格將按照一個空格處理。 |
執行代碼:
import numpy as np
txt_array3 = np.loadtxt('text.txt',dtype=str,comments='#',encoding='utf-8')
print(txt_array3)
tofile_name = 'binary'#定義導出二進制文件名
txt_array3.tofile(tofile_name)#導出二進制文件
fromfile_data = np.fromfile(tofile_name,dtype='float32')#讀取二進制文件print(fromfile_data)#打印數據
複製代碼
結果
['這是第一行' '這是第二行' '這是第三行']
複製代碼
pandas.read_csv(filepath_or_buffer: Union[str, pathlib.Path, IO[~AnyStr]], sep=',', delimiter=None, header='infer', names=None, index_col=None, usecols=None, squeeze=False, prefix=None, mangle_dupe_cols=True, dtype=None, engine=None, converters=None, true_values=None, false_values=None, skipinitialspace=False, skiprows=None, skipfooter=0, nrows=None, na_values=None, keep_default_na=True, na_filter=True, verbose=False, skip_blank_lines=True, parse_dates=False, infer_datetime_format=False, keep_date_col=False, date_parser=None, dayfirst=False, cache_dates=True, iterator=False, chunksize=None, compression='infer', thousands=None, decimal=b'.', lineterminator=None, quotechar='"', quoting=0, doublequote=True, escapechar=None, comment=None, encoding=None, dialect=None, error_bad_lines=True, warn_bad_lines=True, delim_whitespace=False, low_memory=True, memory_map=False, float_precision=None)
複製代碼
參數 | 做用 |
---|---|
file | 要讀取的文件,字符串或pathlib.Path。 |
dtype | 數據類型 |
count | 整數型,讀取數據的數量,-1意味着讀取全部數據。 |
sep | 字符串,若是file是一個文本文件,那麼該值就是數據間的分隔符。若是爲空("")則意味着file是一個二進制文件,多個空格將按照一個空格處理。 |
text.csv文檔原始數據:
1 2
這是第一行第一列 這是第一行第二列
這是第二行第一列 這是第二行第二列
複製代碼
執行代碼:
import pandas as pd
txt_array4 = pd.read_csv('text.csv',sep=',',dtype='str',encoding='gbk')
print(txt_array4)
複製代碼
結果
1 2
0 這是第一行第一列 這是第一行第二列
1 這是第二行第一列 這是第二行第二列
複製代碼
pandas.read_fwf(filepath_or_buffer, colspecs='infer', widths=None, **kwds)
複製代碼
參數 | 做用 |
---|---|
filepath_or_buffer | 要讀取的文件,字符串或pathlib.Path。 |
widths | 由整數組成的列表,選填,若是間隔是連續的,可使用的字段寬度列表而不是「colspecs」。 |
執行代碼:
import pandas as pd
txt_array4 = pd.read_fwf('text.csv',sep=',',dtype='str',encoding='gbk')
print(txt_array4)
複製代碼
結果
1,2
0 這是第一行第一列,這是第一行第二列
1 這是第二行第一列,這是第二行第二列
複製代碼
pandas.read_table(filepath_or_buffer, sep='\t', delimiter=None, header='infer', names=None, index_col=None, usecols=None, squeeze=False, prefix=None, mangle_dupe_cols=True, dtype=None, engine=None, converters=None, true_values=None, false_values=None, skipinitialspace=False, skiprows=None, nrows=None, na_values=None, keep_default_na=True, na_filter=True, verbose=False, skip_blank_lines=True, parse_dates=False, infer_datetime_format=False, keep_date_col=False, date_parser=None, dayfirst=False, iterator=False, chunksize=None, compression='infer', thousands=None, decimal=b'.', lineterminator=None, quotechar='"', quoting=0, escapechar=None, comment=None, encoding=None, dialect=None, tupleize_cols=None, error_bad_lines=True, warn_bad_lines=True, skipfooter=0, skip_footer=0, doublequote=True, delim_whitespace=False, as_recarray=None, compact_ints=None, use_unsigned=None, low_memory=True, buffer_lines=None, memory_map=False, float_precision=None)[source]
複製代碼
參數:對於read_table而言,參數與read_csv徹底相同。其實read_csv原本就是read_table中分隔符是逗號的一個特例,表如今語法中是read_csv的sep=','(默認)。所以,具體參數請查閱read_csv的參數部分。
read_csv() 讀取以‘,’分割的文件到DataFrame
read_table()讀取以‘/t’分割的文件到DataFrame
分割符既有空格又有製表符(‘/t’),sep參數用‘/s+’,能夠匹配任何空格。
參數 | 做用 |
---|---|
filepath_or_buffer | 要讀取的文件,字符串或pathlib.Path。 |
widths | 由整數組成的列表,選填,若是間隔是連續的,可使用的字段寬度列表而不是「colspecs」。 |
執行代碼:
import pandas as pd
txt_array4 = pd.read_table('text.csv',sep='/s+',dtype='str',encoding='gbk')
print(txt_array4)
複製代碼
結果
1,2
0 這是第一行第一列,這是第一行第二列
1 這是第二行第一列,這是第二行第二列
複製代碼
對於純文本格式或非格式化、非結構化的數據,一般用於天然語言處理、非結構化文本解析、應用正則表達式等後續應用場景下,Python默認的三種方法更爲適合。
對於結構化的、純數值型的數據,而且主要用於矩陣計算、數據建模的,使用Numpy的loadtxt方法更爲方便,例如本書中使用的sklearn 自己就依賴於Numpy。
對於二進制的數據處理,使用Numpy的load和fromfile方法更爲合適。
對於結構化的、探索性的數據統計和分析場景,使用Pandas方法進行讀取效果更佳,由於其提供了相似於R的數據框,能夠實現「仿SQL」式的操做方式,對數據進行任意翻轉、切片(塊等)、關聯等都 很是方便。
對於結構化的、數值型和文本型組合的數據統計分析場景,使用Pandas更爲合適,由於每一個數據框中幾乎能夠裝載並處理任意格式的數 據。
現有的Excel分爲兩種格式:xls(Excel 97-2003)和xlsx(Excel 2007及以上)。
Python處理Excel文件主要是第三方模塊庫xlrd、xlwt、pyexcel-xls、xluntils和pyExcel-erator,以及win32com和openpyxl模塊,此外Pandas中也帶有能夠讀取Excel文件的模塊(read_excel)。
咱們主要說主流的read_excel()
pandas.read_excel(io,sheet_name = 0,header = 0,names = None,index_col = None,usecols = None,squeeze = False,dtype = None, ...)
複製代碼
參數 | 做用 |
---|---|
io | 字符串,文件的路徑對象。 |
sheet_name | None、string、int、字符串列表或整數列表,默認爲0。字符串用於工做表名稱,整數用於零索引工做表位置,字符串列表或整數列表用於請求多個工做表,爲None時獲取全部工做表。 |
header | 指定做爲列名的行,默認0,即取第一行的值爲列名。數據爲列名行如下的數據;若數據不含列名,則設定 header = None。 |
names | 默認爲None,要使用的列名列表,如不包含標題行,應顯示傳遞header=None。 |
index_col | 指定列爲索引列,默認None列(0索引)用做DataFrame的行標籤。 |
usecols | int或list,默認爲None。 |
squeeze | boolean,默認爲False,若是解析的數據只包含一列,則返回一個Series。 |
dtype | 列的類型名稱或字典,默認爲None。數據或列的數據類型。例如{'a':np.float64,'b':np.int32}使用對象保存存儲在Excel中的數據而不解釋dtype。若是指定了轉換器,則它們將應用於dtype轉換的INSTEAD。 |
skiprows | 省略指定行數的數據,從第一行開始。 |
skipfooter | 省略指定行數的數據,從尾部數的行開始。 |
執行代碼:
import pandas as pd
txt_array4 = pd.read_excel('text.xlsx',sep='\s+',encoding='gbk')
print(txt_array4)
複製代碼
結果
1 2
0 這是第一行第一列 這是第一行第二列
1 這是第二行第一列 這是第二行第二列
複製代碼
選擇要導入的表,右鍵選擇「導入嚮導」,再選擇格式類型「EXCEL」。
pymysql語法教程連接:www.runoob.com/python3/pyt…
import pymysql
# 打開數據庫鏈接(IP地址,用戶名,密碼,數據庫名稱)
db = pymysql.connect("localhost","testuser","test123","TESTDB" )
# 使用 cursor() 方法建立一個遊標對象 cursor
cursor = db.cursor()
# 使用 execute() 方法執行 SQL 查詢
cursor.execute("SELECT VERSION()")
# 使用 fetchone() 方法獲取單條數據.
data = cursor.fetchone()
print ("Database version : %s " % data)
# 關閉數據庫鏈接
db.close()
複製代碼
結果
Database version : 5.5.57-log
複製代碼
SQL語句教程:www.w3school.com.cn/sql/index.a…
正則表達式教程:www.runoob.com/regexp/rege…
# SQL 查詢語句
sql = "SELECT `訂單產品數據`.`訂單狀態`,COUNT(*) FROM `訂單產品數據` GROUP BY `訂單產品數據`.`訂單狀態`"
try:
# 執行SQL語句
cursor.execute(sql)
# 獲取全部記錄列表
results = cursor.fetchall()
print (results)
except:
print ("報錯")
複製代碼
結果:
(('交易取消', 33), ('交易完成', 16), ('待發貨', 17), ('待收貨', 218), ('拍下商品', 20), ('退貨完成', 6))
複製代碼
PyMongo教程:www.runoob.com/python3/pyt…
MongoDB教程:www.runoob.com/mongodb/mon…
import pymongo
myclient = pymongo.MongoClient('mongodb://localhost:27017/')
dblist = myclient.list_database_names()
if "runoobdb" in dblist:
print("數據庫已存在!")
複製代碼
結果
數據庫已存在!
複製代碼
mydb = myclient["runoobdb"]
mycol = mydb["sites"]
mylist = [
{ "name": "Taobao", "alexa": "100", "url": "https://www.taobao.com" },
{ "name": "QQ", "alexa": "101", "url": "https://www.qq.com" },
{ "name": "Facebook", "alexa": "10", "url": "https://www.facebook.com" },
{ "name": "知乎", "alexa": "103", "url": "https://www.zhihu.com" },
{ "name": "Github", "alexa": "109", "url": "https://www.github.com" }
]
x = mycol.insert_many(mylist)
# 輸出插入的全部文檔對應的 _id 值
print(x.inserted_ids)
複製代碼
結果
[ObjectId('5b236aa9c315325f5236bbb6'), ObjectId('5b236aa9c315325f5236bbb7'), ObjectId('5b236aa9c315325f5236bbb8'), ObjectId('5b236aa9c315325f5236bbb9'), ObjectId('5b236aa9c315325f5236bbba')]
複製代碼
mydb = myclient["runoobdb"]
mycol = mydb["sites"]
for x2 in mycol.find():
print(x2)
複製代碼
結果
{'_id': ObjectId('5d4390faa89575889f30d11e'), 'name': 'RUNOOB', 'alexa': '10000', 'url': 'https://www.runoob.com'}
{'_id': ObjectId('5d439138a89575889f30d11f'), 'name': 'Taobao', 'alexa': '100', 'url': 'https://www.taobao.com'}
{'_id': ObjectId('5d439138a89575889f30d120'), 'name': 'QQ', 'alexa': '101', 'url': 'https://www.qq.com'}
{'_id': ObjectId('5d439138a89575889f30d121'), 'name': 'Facebook', 'alexa': '10', 'url': 'https://www.facebook.com'}
{'_id': ObjectId('5d439138a89575889f30d122'), 'name': '知乎', 'alexa': '103', 'url': 'https://www.zhihu.com'}
{'_id': ObjectId('5d439138a89575889f30d123'), 'name': 'Github', 'alexa': '109', 'url': 'https://www.github.com'}
複製代碼
在企業實際應用中,非關係型數據庫每每基於「大數據」的場景產生,伴隨着海量、實時、多類型等特徵。這些數據庫經過捨棄了關係型數據庫的某些特徵和約束,而後在特定方面進行加強,所以才能知足特定應用需求。非關係型數據庫因爲約束性、規範性、一致性和數據準確性低於關係性數據庫,所以經常使用於實時海量數據讀寫、非結構化和半結構化信息讀寫、海量集羣擴展、特殊場景應用等。因此在金融、保險、財務、銀行等領域內,這種應用比較少;而互聯網、移動應用等新興產 業和行業領域則應用較多。
爲了更好地讓全部讀者都能瞭解從API獲取數據的具體過程,本節使用百度免費API做爲實際數據來源。百度API提供了衆多地圖類功 能,如基本地圖、位置搜索、周邊搜索、公交駕車導航、定位服務、地理編碼及逆地理編碼等。本節使用的是百度Web服務API中的Geocoding API。
Geocoding API用於提供從地址到經緯度座標或者從經緯度座標到地址的轉換服務,用戶能夠發送請求且接收JSON、XML的返回數。 該應用可用於對運營數據中的地址相關信息進行解析,從而得到經緯度信息,這些信息可用於進一步基於地理位置進行解析、展現和分析等。
要得到該API,須要擁有百度相關帳戶和AK信息。
第一步 得到百度帳戶,沒有帳戶的讀者可在 passport.baidu.com/v2/?reg 處免費註冊獲取。
第二步 註冊成爲百度開放平臺開發者,讀者可進入 lbsyun.baidu.com/apicon-sole… 完成相關注冊。 該過程很是簡單,遵循引導整個過程在5分鐘內便可完成。
第三步 註冊完成以後,會有一個名爲「【百度地圖開放平臺】開發者激活郵件」的驗證連接發送到指定(註冊時郵箱)郵箱,點擊連接便可完成驗證。
第四步 點擊「申請祕鑰」進入建立應用界面,在該應用建立中,我 們主要使用Geocoding API v2,其餘應用服務根據實際需求勾選。IP白名單區域,若是不作限制,請設置爲「0.0.0.0/0」。設置完成後,點擊提 交。
第五步 得到AK祕鑰。完成上述步驟以後,會默認跳轉到應用列表界面,界面中的「訪問應用(AK)」即是該應用的祕鑰。
咱們先經過Python請求該API來得到JSON格式的數據。本示例的目標是經過給百度API發送一條地理位置數據,返回其經緯度信息。 本節會用到Python第三方庫requests,讀者須要先經過pip install requests進行安裝。完整代碼以下:
import requests # 導入庫
add = '廣州市天河區正佳廣場' # 定義地址
ak = 'DdOyOKo0VZBgdDFQnyhINKYDGkzBkuQr' # 建立訪問應用時得到的AK
url = 'http://api.map.baidu.com/geocoder/v2/?address=%s&output=xml&ak=%s' # 請求URL
res = requests.get(url % (add, ak)) # 得到返回請求
add_info = res.text # 返回文本信息
print (add_info) # 打印輸出
複製代碼
結果
<?xml version="1.0" encoding="utf-8"?>
<GeocoderSearchResponse>
<status>0</status>
<result>
<location>
<lng>113.333581818</lng>
<lat>23.1383236194</lat>
</location>
<precise>1</precise>
<confidence>80</confidence>
<comprehension>100</comprehension>
<level>購物</level>
</result>
</GeocoderSearchResponse>
複製代碼
接着咱們經過引入一個XML格式化處理庫來從中提取經緯度信息。
# 設置字符編碼爲utf-8
import importlib
importlib.reload(sys)
import xml.etree.ElementTree as Etree # 導入XML中的ElementTree方法
root = Etree.fromstring(add_info) # 得到XML的根節點
lng = root[1][0][0].text # 得到lng數據
lat = root[1][0][1].text # 得到lat數據
print ('lng: %s' % lng) # 格式化打印輸出
print ('lat: %s' % lat) # 格式化打印輸出
複製代碼
結果
lng: 113.333581818
lat: 23.1383236194
複製代碼
import requests # 導入庫
add = '廣州市天河區正佳廣場' # 定義地址
ak = 'DdOyOKo0VZBgdDFQnyhINKYDGkzBkuQr' # 建立訪問應用時得到的AK
url = 'http://api.map.baidu.com/geocoder/v2/?address=%s&output=json&ak=%s' # 請求URL
res = requests.get(url % (add, ak)) # 得到返回請求
add_info = res.text # 返回文本信息
print (add_info) # 打印輸出
複製代碼
結果
{"status":0,"result":{"location":{"lng":113.33358181846966,"lat":23.138323619365097},"precise":1,"confidence":80,"comprehension":100,"level":"購物"}}
複製代碼
該結果能夠經過JSON進行格式化處理
import json # 導入庫
add_json = json.loads(add_info) # 加載JSON字符串對象
lat_lng = add_json['result']['location'] # 得到經緯度信息
print (lat_lng) # 打印輸出
複製代碼
結果
{'lng': 113.33358181846965, 'lat': 23.138323619365096}
複製代碼
有關百度API的更多信息,具體查閱
在API應用中,中文的編碼處理因細節太多而經常讓人頭疼。所以,若是能夠則應儘可能減小直接在API的數據中出現中文字符。在實際企業應用中,會出現多種API形式,但不管哪一種形式,其基本實現思路 都是一致的:導入庫→定義請求變量→發送請求→得到返回數據→格式化並得到目標數據,所以須要掌握JSON和XML的數據與其餘數據的轉換方法。
舉個簡單的例子
import requests # 導入庫
url = 'https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&tn=baidu&wd=python&oq=python' # 定義要抓取的網頁地址
res = requests.get(url) # 得到返回請求
html = res.text # 返回文本信息
print(html) # 打印輸出網頁源代碼
複製代碼
想進階的朋友看Scrapy爬取網頁教程:www.imooc.com/learn/1017
非結構化的文本數據指的是文本數據中沒有結構化的格式,須要定製化解析才能獲取數據,而且每條記錄的字段也可能存在差別,這意味 着傳統的結構化讀取方式很難工做。非結構化的日誌就是一個典型示例,服務器的日誌可由運維工程師自行定義,所以不一樣公司的日誌格式有所不一樣;另外在網站日誌中還可能包含經過頁面「埋碼」的方式而採集來的用戶行爲數據,這些都會使日誌面臨非結構化的解析問題。
file = 'file_log'
fn = open(file, 'r') # 打開要讀取的日誌文件對象
content = fn.readlines() # 以列表形式讀取日誌數據
print(content[:2])
fn.close() # 關閉文件對象
複製代碼
其實日誌文件只是普通文本文件中的一種類型而已,其餘的非結構化數據文件均可以以相似的方法讀取,即便文件沒有任何擴展名。 對於非結構化的文本處理,一般更多地側重於特定場景,通用性較差,緣由就在於非結構化的形式自己變化多樣。天然語言理解、文本處 理和挖掘、用戶日誌和機器日誌解析等都是該領域中的主要工做。
Python讀取圖像一般使用PIL和OpenCV兩個庫,相對而言,筆者使用後者的狀況更多。
OpenCV教程:juejin.im/post/5afd25…
import cv2
# 一、文件的讀取 二、封裝格式解析 三、數據解碼 四、數據加載
img = cv2.imread('canton.jpg',1)
cv2.imshow('image',img)
# jpg png 一、文件頭 二、文件數據
cv2.waitKey (0)
# waitKey(0),以毫秒爲單位延遲。0是指「永遠」的特殊值
複製代碼
Python讀取視頻最經常使用的庫也是OpenCV。
import cv2 # 導入庫
cap = cv2.VideoCapture("test.avi") # 得到視頻對象
status = cap.isOpened() # 判斷文件知否正確打開
# 輸出基本屬性
if status: # 若是正確打開,則得到視頻的屬性信息
frame_width = cap.get(3) # 得到幀寬度
frame_height = cap.get(4) # 得到幀高度
frame_count = cap.get(7) # 得到總幀數
frame_fps = cap.get(5) # 得到幀速率
print('frame width: ', frame_width) # 打印輸出
print('frame height: ', frame_height) # 打印輸出
print('frame count: ', frame_count) # 打印輸出
print('frame fps: ', frame_fps) # 打印輸出
# 讀取視頻內容並展現視頻
success, frame = cap.read() # 讀取視頻第一幀
while success: # 若是讀取狀態爲True
cv2.imshow('vidoe frame', frame) # 展現幀圖像
success, frame = cap.read() # 獲取下一幀
k = cv2.waitKey(int(1000 / frame_fps)) # 每次幀播放延遲必定時間,同時等待輸入指令
if k == 27: # 若是等待期間檢測到按鍵ESC
break # 退出循環
# 操做結束釋放全部對象
cv2.destroyAllWindows() # 關閉全部窗口
cap.release() # 釋放視頻文件對象
複製代碼
對於語音文件的讀取,可使用Python的audioop、aifc、wav等庫實現。但針對語音處理這一細分領域,當前市場上已經具有很是成熟的 解決方案,例如科大訊飛、百度語音等,大多數狀況下,咱們會經過調用其API實現語音分析處理,或者做爲分析處理前的預處理。
以百度語音API服務應用爲例,說明如何經過請求百度語音的API,將語音數據轉換爲文字信息。
申請百度語音API教程:jingyan.baidu.com/article/f3e…
# 導入庫
import json # 用來轉換JSON字符串
import base64 # 用來作語音文件的Base64編碼
import requests # 用來發送服務器請求
# 得到token
API_Key = 'DdOyOKo0VZBgdDFQnyhINKYDGkzBkuQr' # 從申請應用的key信息中得到
Secret_Key = 'oiIboc5uLLUmUMPws3m0LUwb00HQidPx' # 從申請應用的key信息中得到
token_url = "https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials&client_id=%s&client_secret=%s" # 得到token的地址
res = requests.get(token_url % (API_Key, Secret_Key)) # 發送請求
res_text = res.text # 得到請求中的文字信息
token = json.loads(res_text)['access_token'] # 提取token信息
# 定義要發送的語音
voice_file = 'baidu_voice_test.pcm' # 要識別的語音文件
voice_fn = open(voice_file, 'rb') # 以二進制的方式打開文件
org_voice_data = voice_fn.read() # 讀取文件內容
org_voice_len = len(org_voice_data) # 得到文件長度
base64_voice_data = base64.b64encode(org_voice_data).decode('utf-8') # 將語音內容轉換爲base64編碼格式
# 發送信息
# 定義要發送的數據主體信息
headers = {'content-type': 'application/json'} # 定義header信息
payload = {
'format': 'pcm', # 以具體要識別的語音擴展名爲準
'rate': 8000, # 支持8000或16000兩種採樣率
'channel': 1, # 固定值,單聲道
'token': token, # 上述獲取的token
'cuid': 'B8-76-3F-41-3E-2B', # 本機的MAC地址或設備惟一識別標誌
'len': org_voice_len, # 上述獲取的原始文件內容長度
'speech': base64_voice_data # 轉碼後的語音數據
}
data = json.dumps(payload) # 將數據轉換爲JSON格式
vop_url = 'http://vop.baidu.com/server_api' # 語音識別的API
voice_res = requests.post(vop_url, data=data, headers=headers) # 發送語音識別請求
api_data = voice_res.text # 得到語音識別文字返回結果
text_data = json.loads(api_data)['result']
print(api_data) # 打印輸出總體返回結果
print(text_data) # 打印輸出語音識別的文字
複製代碼