1.序列化html
定義:
JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。簡單地說,JSON 能夠將 JavaScript 對象中表示的一組數據轉換爲字符串,而後就
能夠在函數之間輕鬆地傳遞這個字符串,或者在異步應用程序中將字符串從 Web 客戶機傳遞給服務器端程序。這個字符串看起來有點兒古怪,可是JavaScript很容易
解釋它,並且 JSON 能夠表示比"名稱 / 值對"更復雜的結構。
特色:
json:JavaScript 對象表示法(JavaScript Object Notation)。
json:是存儲和交換文本信息的語法。相似 XML。
json:比 XML 更小、更快,更易解析。
json是通用語言,沒有環境區分
python中的json
1.導入模塊:import json
2.將字典對象轉成字符串
dic = {'1':2}
s = json.dumps(dic)
print(repr(s),typr(s))
3.將字典轉成字符串
str1 = "{\"1\":2}"
s = json.loads(str1)
print(s,type(s)
4.將字典轉成字符串寫入文件
json.dump({'1':4},open('a'),'w',encoding='utf-8')
5.將文件中的字符串轉成字典
json.load(open('a','r',encoding='utf-8'))
拓展:快速轉化json字符串爲json對象(linux系統中) $ echo '{"links":[{"name":"Google","url":"http://www.google.com"},{"name":"Baidu","url":"http://www.baidu.com"}]}' | python -m json.tool
注意:json支持的數據類型較少,甚至連集合都不支持
import json data = {'username':['李華','二愣子'],'sex':'male','age':16} json_dic2 = json.dumps(data,sort_keys=True,indent=2,separators=(',',':'),ensure_ascii=False) print(json_dic2) #separators=(',',':') 將,轉成: #ensure_ascii=False 不使用ascii對中文編碼 #sort_keys=True 按照字母的ascii的編碼大小排序 #indent=2 空2個縮進
2.picklenode
pickle是python內部獨有的序列化方法,只是在python語言中有效,不通用,可是在python中的序列化速度,由於其讀取二進制流
import pickle #導入模塊
print(pickle.dumps({'1':4})) #將對象轉換成相似二進制的東西(字節)
print(pickle.loads(b'\x80\x03}q\x00X\x01\x00\x00\x001q\x01K\x04s.')) #將二進制(字節)轉成字典
pickle.dump({'2':4},open('b','wb')) #將字典轉成字節寫入文件
d = pickle.load(open('b','rb')) #將文件中的字節轉換成字典
print(d)
總結:
loads json裏的將字符串轉換成字典 pickle 將字節轉換成字典
dumps json裏的將字典轉換成字符串 pickle 將字典轉換成字節
load json裏的將文件中的字符串轉換成字典 pickle 將文件中的字節轉換成字典
dump json裏的將字典轉換字符串寫入到文件中,pickle 將字典轉換成字節寫入到文件中
注意:在文件中的字符串類型的字典的鍵值必須是雙引號{"1":2}
支持的數據類型較多,甚至支持類的實例化的對象和一些複雜的數據類型!
3.shelve(文件+字典操做)python
import shelve f = shelve.open('c',writeback=True) #建立文件 # writeback = True 回寫 f['name'] = 'tmac' ['age'] = 18 print(f['name'],f['age']) f['name'] = ['kobe','admin'] print(f['name']) for i in f: print(i) #獲取到全部的鍵
print(i[item]) #獲取全部的值
序列化總結linux
什麼是序列化?把其餘類型轉化成str/bytes的過程就是序列化 反序列化:把str/bytes轉化成其餘類型
Json pickle shelve Json 全部語言通用 能處理的數據類型有限(list\dict\數字\str) Pickle python 語言專用 能處理幾乎全部的數據類型 場景用途:文件存儲網絡傳輸
4.random面試
import random print(random.random()) #獲取到的0-1之間的小數?將小數的前兩位怎麼取值那? 面試題,能體現出基礎 print(random.randint(1,10)) #獲取a-b之間的隨機數(b包含a和b) print(random.randrange(1,3)) #獲取1-3之間的隨機數,可是不包含3 print(random.randrange(1,21,2)) #獲取1-21之間的隨機奇數,可是不包含21 print(random.choice([1,2,3,4,5,6,7])) #從可迭代對象裏面隨機 print(random.choice("sdfwefw")) #從可迭代對象裏面隨機選(沒有索引的就會報錯,好比字典,集合等無序的可迭代對象) print(random.choices("sdfwefw",k=2)) #從可迭代對象裏面隨機選則兩個,可是有重複(沒有索引的就會報錯,好比字典,集合等無序的可迭代對象) print(random.sample("sdfwefw",k=2)) #從可迭代對象裏面選擇兩個不一樣的 print(random.uniform(10, 20)) #生成小數 print(round(a,2)) #保留兩位小數 print('%.2f'%a) #########簡陋版驗證碼########### import random U=(chr(random.randrange(65,91))) #獲取65-91之間的ascii碼值 大寫 l=(chr(random.randrange(97,123))) #獲取97-123之間的ascii碼值 小寫 n= random.randrange(0,10) #獲取兩個數字 n2 =random.randrange(0,10) print(U,l,n,n2,sep="")
5.os模塊算法
python標準庫中的os模塊對操做系統的api進行了封裝,而且使用同一個api接口來管理不一樣的操做系統的相同功能。
os模塊包含與操做系統的系統環境,系統變量,系統文件,用戶數據庫以及權限進行交換的函數,主要用來和操做系統作交互
python標準庫中的os模塊對操做系統的api進行了封裝,而且使用同一個api接口來管理不一樣的操做系統的相同功能。 os模塊包含與操做系統的系統環境,系統變量,系統文件,用戶數據庫以及權限進行交換的函數 2.1 os模塊 os模塊中包含兩個比較經常使用的函數 os.getcwd() #獲取當前絕對路徑 os.listdir() #列出當前目錄下的文件和文件夾 2.2 os.path詳解(用來對文件和文件路徑進行管理) 拆分路徑 os.path.split() #返回一個二元組,包含文件路徑和文件名 os.path.dirname() #返回文件的路徑 os.path.basename() #返回文件名 os.path.splitext() #返回一個去處擴展名部分和擴展名的二元組 import os path = "/root/p0st/h/error.log" print(os.path.split(path)) --->('/root/p0st/h', 'error.log') print(os.path.dirname(path)) --->/root/p0st/h print(os.path.basename(path)) --->error.log print(os.path.splitext(path)) --->('/root/p0st/h/error', '.log') 構建路徑 os.path.expanduser('~')#返回當前輸入用戶的家目錄,必須得加~或~adm等指定用戶 os.path.abspath() #返回文件或路徑的絕對路徑 os.path.path() #根據不一樣的操做系統,使用不一樣的路徑分隔符拼接路徑 import os print(os.path.expanduser('~adm')) --->/var/adm print(os.path.abspath('456')) --->E:\oldboy\python 20\456 print(os.path.join(os.path.expanduser('~'),'123','456.txt')) --->/var/adm/123/456.txt 判斷一個路徑是否爲絕對路徑 import os os.path.isabs(os.path.join(os.path.expanduser('~adm'),'123','456.txt')) --->True 查看當前文件名字須要使用__file__這個特殊變量:當前代碼所在的源文件 import os path = os.path.abspath(__file__) print(path) --->/var/adm/123/456.py print(os.path.abspath(os.path.join(os.path.dirname(path),os.path.pardir))) -->/var 獲取文件屬性和判斷文件類型 import os path= os.path.abspath(__file__) print(os.path.getatime(path)) #獲取當前文件的訪問時間 print(os.path.getctime(path)) #獲取當前文件的建立時間 print(os.path.getmtime(path)) #獲取當前文件的修改時間 print(os.path.getsize(path)) #獲取當前文件的大小 print(os.path.exists(path)) #判斷當前路徑是否存在 print(os.path.isfile(path)) #參數所指的路徑存在,而且是一個文件 print(os.path.isdir(path)) #參數所所指的路徑存在,而且是一個目錄 print(os.path.islink(path)) #。。。。。。。而且是一個連接 print(os.path.ismount(path)) #。。。。。。。而且是一個掛載點 使用os模塊管理文件和目錄 os.remove(path)/unlink(path): 刪除path所指的文件 os.rmdir(path)/removedirs(path) : 刪除path所指向的目錄,該文件夾必須爲空,不然報錯。 os.mkdir(path):建立一個文件夾 os.rename('olddir','newdir'):修改一個文件夾的名字 使用os模塊來修改和判斷文件權限 os.chmod(filename,0777) #修改文件權限 os.access(filename,os.R_OK)#判斷文件權限---> os.R_OK:是否可讀, os.W_OK:是否可寫, os.X_OK:是否可執行
#和文件夾相關 os.makedirs('dirname1/dirname2') 可生成多層遞歸目錄 os.removedirs('dirname1') 若目錄爲空,則刪除,並遞歸到上一級目錄,如若也爲空,則刪除,依此類推 os.mkdir('dirname') 生成單級目錄;至關於shell中mkdir dirname os.rmdir('dirname') 刪除單級空目錄,若目錄不爲空則沒法刪除,報錯;至關於shell中rmdir dirname os.listdir('dirname') 列出指定目錄下的全部文件和子目錄,包括隱藏文件,並以列表方式打印 # 和文件相關 os.remove() 刪除一個文件 os.rename("oldname","newname") 重命名文件/目錄 os.stat('path/filename') 獲取文件/目錄信息 # 和操做系統差別相關 os.sep 輸出操做系統特定的路徑分隔符,win下爲"\\",Linux下爲"/" os.linesep 輸出當前平臺使用的行終止符,win下爲"\r\n",Linux下爲"\n" os.pathsep 輸出用於分割文件路徑的字符串 win下爲;,Linux下爲: os.name 輸出字符串指示當前使用平臺。win->'nt'; Linux->'posix' # 和執行系統命令相關 os.system("bash command") 運行shell命令,直接顯示 os.popen("bash command).read() 運行shell命令,獲取執行結果 os.environ 獲取系統環境變量 #path系列,和路徑相關 os.path.abspath(path) 返回path規範化的絕對路徑 os.path.split(path) 將path分割成目錄和文件名二元組返回 os.path.dirname(path) 返回path的目錄。其實就是os.path.split(path)的第一個元素 os.path.basename(path) 返回path最後的文件名。如何path以/或\結尾,那麼就會返回空值,即os.path.split(path)的第二個元素。 os.path.exists(path) 若是path存在,返回True;若是path不存在,返回False os.path.isabs(path) 若是path是絕對路徑,返回True os.path.isfile(path) 若是path是一個存在的文件,返回True。不然返回False os.path.isdir(path) 若是path是一個存在的目錄,則返回True。不然返回False os.path.join(path1[, path2[, ...]]) 將多個路徑組合後返回,第一個絕對路徑以前的參數將被忽略 os.path.getatime(path) 返回path所指向的文件或者目錄的最後訪問時間 os.path.getmtime(path) 返回path所指向的文件或者目錄的最後修改時間 os.path.getsize(path) 返回path的大小<br></em> #其餘應用 os.getcwd() 獲取當前工做目錄,即當前python腳本工做的目錄路徑 os.chdir("dirname") 改變當前腳本工做目錄;至關於shell下cd os.curdir 返回當前目錄: ('.') os.pardir 獲取當前目錄的父目錄字符串名:('..') 注意:os.stat('path/filename') 獲取文件/目錄信息 的結構說明 stat 結構: st_mode: inode 保護模式 st_ino: inode 節點號。 st_dev: inode 駐留的設備。 st_nlink: inode 的連接數。 st_uid: 全部者的用戶ID。 st_gid: 全部者的組ID。 st_size: 普通文件以字節爲單位的大小;包含等待某些特殊文件的數據。 st_atime: 上次訪問的時間。 st_mtime: 最後一次修改的時間。 st_ctime: 由操做系統報告的"ctime"。在某些系統上(如Unix)是最新的元數據更改的時間,在其它系統上(如Windows)是建立時間(詳細信息參見平臺的文檔)。
6.sys模塊shell
sys模塊提供對解釋器使用或維護的一些變量的訪問,以及與解釋器強烈交互的函數。它始終可用
1.基本 print(sys.path) # 添加自定義模塊路徑和解釋器的工做目錄 # ****** print(sys.version) # 獲取解釋的版本號 print(sys.platform) #獲取當前操做系統的平臺位數 print(sys.exit(1)) #退出並返回1 2.sys.argv sys.argv(): sys.argv:是sys庫下面的列表,該列表保存了全部的命令行參數,其中下標爲0的元素是執行文件的名字,其他的參數已字符串的形式保存在該列表中 此列表能夠從終端接收無數個參數,而存放在列表當中,若是沒有第一個參數的話,程序會報錯,而沒法執行,因此在argv中添加一個空元素,當python json.py test.txt有參數的時候,test.txt就成了argv的第一個元素 在Python標準庫sys中有三個文件描述符分別是: stdin(標準輸入 0,指的是經過<或者|來傳遞數據), stdout(標準輸出 1), stderr(標準錯誤 2)。 經過標準輸入結合管道,就不須要經過open()函數來打開文件了。 1.使用sys庫中的stdin讀取內容(linux中的標準輸入) windows 建立 tes_sys_stdin.py文件 import sys name = sys.stdin.readline() print (name) linux: 建立 test_sys_stdin.py文件 import sys for line in sys.stdin(): print (line) 執行test_sys_stdin.py文件: cat /etc/passwd | python test_sys_stdin.py python test_sys_stdin.py < /etc/passwd 也能夠經過stdin.readlines()函數將標準輸入的內容讀取到一個列表裏面 sys.stdin.readline( )會將標準輸入所有獲取,包括末尾的'\n',所以用len計算長度時是把換行符'\n'算進去了的,可是input( )獲取輸入時返回的結果是不包含末尾的換行符'\n'的。 所以若是在平時使用sys.stdin.readline( )獲取輸入的話,不要忘了去掉末尾的換行符. 能夠用strip( )函數(sys.stdin.readline( ).strip('\n'))或sys.stdin.readline( )[:-1]這兩種方法去掉換行。
other數據庫
""" 經過命令行讀取文件名稱,若是文件存在,則查看是否能執行,不能的話修改權限爲777,若是可執行的話就打印輸出文件內容,若是文件不在,則提示文不存在 """ # _*_ encoding:utf-8 _*_ import os import sys sys.argv.append('') file_name = sys.argv[1] def read_file(): if not os.path.isfile(file_name): raise SystemExit(file_name + " 文件不存在") elif os.access(file_name,os.X_OK): with open(file_name) as info: print(info.read()) else: os.chmod(file_name,0777) print("已修改成0777") if __name__ == '__main__': read_file()
import os ''' root 所指的是當前正在遍歷的這個文件夾的自己的地址 dirs 是一個 list ,內容是該文件夾中全部的目錄的名字(不包括子目錄) files 一樣是 list , 內容是該文件夾中全部的文件(不包括子目錄) topdown --可選,爲 True,則優先遍歷 top 目錄,不然優先遍歷 top 的子目錄(默認爲開啓)。若是 topdown 參數爲 True,walk 會遍歷top文件夾,與top 文件夾中每個子目錄。 onerror -- 可選,須要一個 callable 對象,當 walk 須要異常時,會調用。 followlinks -- 可選,若是爲 True,則會遍歷目錄下的快捷方式(linux 下是軟鏈接 symbolic link )實際所指的目錄(默認關閉),若是爲 False,則優先遍歷 top 的子目錄。 ''' boot=0 for root, dirs, files in os.walk("E:\oldboy\python 20\day16\code", topdown=False): for name in files: boot +=os.path.getsize(name) print(name, os.path.getsize(name)) print(boot)
""" 打印最經常使用的十條linux命令 """ #_*_ encoding:utf-8 _*_ import os from collections import Counter c = Counter() with open(os.path.expanduser('~/.bash_history')) as cmd_info: for line in cmd_info: cmd = line.strip().split() if cmd: c[cmd[0]]+=1 print(c.most_common(10)) ''' Counter計數器是位了可以方便的統計數字,Counter是dict的子集,所以也可使用字典的方法 此類返回一個以元素爲key,以元素的個數爲值的字典 c[cmd[0]]+=1 等價於修改字典的值 '''
7.hashlib json
Python的hashlib提供了常見的摘要算法,如MD5,SHA1,SHA256,SHA512等等。 什麼是摘要算法呢?摘要算法又稱哈希算法、散列算法。它經過一個函數,把任意長度的數據轉換爲一個長度固定的數據串(一般用16進制的字符串表示)。 基本應用 import hashlib #導入hashlib模塊 md5 = hashlib.md5() #選擇一個要加密的方式 md5.update('123456'.encode('utf-8')) #將要加密的內容格使用選擇後的方法進行加密 print(md5.hexdigest()) #返回加密後的字符串 import hashlib md5 = hashlib.md5('鹽'.encode('utf-8')) # 選擇加密方式 加鹽 md5.update('admin'.encode('utf-8')) #將明文轉成字節而後進行加密 print(md5.hexdigest()) #生成密文
使用sha1等加密方式,只須要把上面MD5的名字換掉就ok
注意:在使用hashlib測試的時候,文件名字不能起名爲hashlib.py會報錯
爲何要寫encoding('utf-8')那?
由於其源碼默認爲字符串要爲bytes類型,因此要將字符串轉爲bytes類型的
print('123'.encode("utf-8"))
print(bytes('123',encoding='utf-8'))
print(b'123')
以上三種都是b'123'
註釋:
一、文件打開方式必定要是二進制方式,既打開文件時使用b模式,不然Hash計算是基於文本的那將獲得錯誤的文件Hash(網上看到有人說遇到Python的Hash計算錯誤在大可能是因爲這個緣由形成的)。
二、對於MD5若是須要16位(bytes)的值那麼調用對象的digest()而hexdigest()默認是32位(bytes),同理Sha1的digest()和hexdigest()分別產生20位(bytes)和40位(bytes)的hash值
返回系列windows