python基礎之 序列化,os,sys,random,hashlib

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個縮進
json示例

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運維相關
#和文件夾相關
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)是建立時間(詳細信息參見平臺的文檔)。 
os模塊經常使用

 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]這兩種方法去掉換行。
sys模塊應用

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()
os,sys模塊例子
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)
os.walk()
"""
打印最經常使用的十條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 等價於修改字典的值
'''
打印最經常使用的十條linux命令

 

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

相關文章
相關標籤/搜索