模块(sys/os/序列化模块)
?sys 模塊:
?sys.path? 返回模塊的搜索路徑,初始化時(shí)使用pythonpath環(huán)境變量的值
sys.modules ? 返回所有在當(dāng)前這個(gè)python程序中導(dǎo)入的模塊的
sys.exit ? 退出程序
sys.argv ? 返回一個(gè)列表 列表的第一個(gè)元素是執(zhí)行這個(gè)文件的時(shí)候,寫在python后面的第一個(gè)值, 之后的元素是在執(zhí)行python的啟動(dòng)的時(shí)候可以寫多個(gè)值.都會(huì)依次添加到列表中
?
os 模塊:和操作系統(tǒng)進(jìn)行交互的
工作目錄相關(guān):
?os.getcwd() 在那執(zhí)行文件就獲取當(dāng)前文件地址
例:
import osprint(os.getcwd()) ==>F:\面向?qū)ο骪180808
?os.chdir(新地址) 修改當(dāng)前文件目錄,相當(dāng)于 shell下cd?
例:
import osprint(os.getcwd())
os.chdir(r"F:\面向?qū)ο骪180807")
print(os.getcwd())
結(jié)果:
F:\面向?qū)ο骪180808
F:\面向?qū)ο骪180807
?os.curdir 返回當(dāng)前目錄? 結(jié)果: .
os.pardir 獲取當(dāng)前目錄的父級(jí)目錄字符串名? 結(jié)果: ..
?
創(chuàng)建文件/文件夾和刪除文件/文件夾相關(guān):
os.makedirs(文件名1/文件名2) 可生成多層遞歸目錄
os.removedirs(文件1/文件2) 若目錄為空,則刪除,并遞歸到上一級(jí)目錄,如若也為空,則刪除,一次類推
os.mkdir(文件名) 生成單級(jí)目錄 ,相當(dāng)于shell中mkdir dirname
os.rmdir(文件名) 刪除單級(jí)目錄,若目錄不為空則無法刪除,報(bào)錯(cuò);相當(dāng)于shell中rmdir dirname
os.listdir(文件名) 列出指定目錄下的所有文件和子目錄,包括隱藏文件,并以列表方式打印
os.remove(文件名) 刪除文件
os.rename(oldname,newname) 重命名文件名
?
和操作系統(tǒng)差異相關(guān):
os.stat(路徑) ? 獲取文件/目錄信息
os.sep ? 輸出操作系統(tǒng)特定的路徑分隔符, win下為"\\",Linux下為"/"
os.linesep 輸出當(dāng)前平臺(tái)使用的行終止符, win下為"\t\n",Linux下為"\n"
os.pathsep 輸出用于分割文件路徑的字符串, win下為";",Linux下為":"
os.name? 輸出字符串指示當(dāng)前使用平臺(tái),? win下為"nt",Linux下為"posix"
?
使用pyth來和操作系統(tǒng)命令交互:
os.system("base command") 運(yùn)行shell命令,直接顯示
os.popen("base command").read() 運(yùn)行shell命令,獲取執(zhí)行結(jié)果
?
查看環(huán)境變量:
os.environ? 獲取系統(tǒng)環(huán)境變量
?
os.path
os.path.abspath(path) 返回path規(guī)范化的絕對(duì)路徑 os.path.split(path) 將path分割目錄和文件名二元組返回
os.path.dirname(path) 返回path的目錄,其實(shí)就是os.path.split(path)的第一個(gè)元素 os.path.basename(path)返回path最后文件名.如果path以"/"或"\"結(jié)尾,那么就會(huì)返回空值
os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False
os.path.isabs(path) 如果path是絕對(duì)路徑,返回True
os.path.isfile(path) 如果path是一個(gè)存在的文件,返回True,否則返回False
os.path.isdir(path) 如果path是一個(gè)存在的目錄,返回True,否則返回False
os.path.join(path1[,path2[,path3[,...]]]) ? 將多個(gè)路徑組合后返回,第一個(gè)絕對(duì)路徑之前的參數(shù)將被忽略
os.path.getatime(path) 返回path所指向的文件或者目錄的最后訪問時(shí)間
os.path.getmtime(path) 返回path所指向的文件或者目錄的最后修改時(shí)間
os.path.getsize(path) 返回path的大小
?
例:獲取文件的路徑
import osprint(__file__)
print(os.path.dirname(__file__))
print(os.path.dirname(os.path.dirname(__file__)))
結(jié)果:
F:/面向?qū)ο?180808/課堂練習(xí).py
F:/面向?qū)ο?180808
F:/面向?qū)ο?
?
序列化模塊:json pickle shelve
序列化:將原本的字典、列表等內(nèi)容轉(zhuǎn)換成一個(gè)字符串的過程就叫做序列化.?
序列化的目的:1.把內(nèi)容寫入文件;2.網(wǎng)絡(luò)傳輸數(shù)據(jù)
json模塊:
json. dumps(dict)? 將字典轉(zhuǎn)化成字符串
例:
import jsondic = {"a":1,"b":2,"c":3}
str_dic = json.dumps(dic)
print(str_dic,type(str_dic)) ==>{"a": 1, "b": 2, "c": 3} <class 'str'>
?json.loads(str) 將字符串轉(zhuǎn)化成字典
例:
import jsonstr_dic = '{"a": 1, "b": 2, "c": 3}'
dic = json.loads(str_dic)
print(dic,type(dic)) ==>{'a': 1, 'b': 2, 'c': 3} <class 'dict'>
json.dump(dict) ?將字典寫成字符串寫入文件
例:
import jsondic = {"a":1,"b":2,"c":3}
with open("json_dumps",mode="w",encoding="utf-8")as f:
json.dump(dic,f)
?json.load(句柄)? 從文件中讀取并轉(zhuǎn)化成字符串
例:
import jsonwith open("json_dumps",mode="r",encoding="utf-8")as f:
print(json.load(f)) ==>{'a': 1, 'b': 2, 'c': 3}
json能處理的數(shù)據(jù)類型有限,限制比較多?
限制:
1.json格式中字典的key必須是字符串?dāng)?shù)據(jù)類型
2.如果是數(shù)字為key,那么dump之后會(huì)強(qiáng)轉(zhuǎn)成字符串?dāng)?shù)據(jù)類型
3.對(duì)元組做value的字典會(huì)把元組強(qiáng)制轉(zhuǎn)換成列表
4.json不支持元組做key會(huì)報(bào)錯(cuò)
5.json處理文件中的字符串必須是雙引號(hào)
6.能多次dump數(shù)據(jù)到文件中但不能load出來 多次寫入數(shù)據(jù)到文件中用dumps從文件中讀出數(shù)據(jù)用loads
7.json中集合不能使用dump/dumps方法
8.json中dumps元組類型會(huì)將元組強(qiáng)轉(zhuǎn)成列表再轉(zhuǎn)化成字符串
例: 中文格式的寫入文件中的編碼ensure_ascii
import jsondic = {"abc":1,"country":'中國(guó)'}
ret = json.dumps(dic,ensure_ascii=False)
print(ret) ==>{"abc": 1, "country": "中國(guó)"}
sort_keys對(duì)字典的key的首字母做排序
indent設(shè)置縮進(jìn)
separators根據(jù)標(biāo)點(diǎn)符號(hào)來換行
ensure_ascii 顯示中文
例:
import jsondic = {"name":'小白','age':'18','hobby':["聽歌",'畫畫']}
ret = json.dumps(dic,sort_keys=True,indent=4,separators=(",",":"),ensure_ascii=False)
print(ret)
結(jié)果:
{
??? "age":"18",
??? "hobby":[
??????? "聽歌",
??????? "畫畫"
??? ],
??? "name":"小白"
}
json的其他參數(shù)是為了用戶看著更方便,但是會(huì)相對(duì)浪費(fèi)時(shí)間
?
?pickle模塊: 與文件相關(guān)模式:rb,wb
pickle支持幾乎所有的對(duì)象的序列化
pickle.dumps的結(jié)果是bytes類型
例:
import pickledic = {1:(2,3,4),('a','b'):4}
pic_dic = pickle.dumps(dic)
print(pic_dic) ==>b'\x80\x03}q\x00(K\x01K\x02K\x03K\x04\x87q\x01X\x01\x00\x00\x00aq\x02X\x01\x00\x00\x00bq\x03\x86q\x04K\x04u.' #bytes類型
new_dic = pickle.loads(pic_dic)
print(new_dic) ==>{1: (2, 3, 4), ('a', 'b'): 4}
一個(gè)類的對(duì)象也可用pickle.dumps存儲(chǔ)起來
例:
import pickleclass Student:
def __init__(self,name,age):
self.name = name
self.age = age
one_person = Student("小白",18)
ret = pickle.dumps(one_person)
print(ret)
new_person = pickle.loads(ret)
print(new_person.name) ==>小白
print(new_person.age) ==>18
例:寫入文件
import pickleclass Student:
def __init__(self,name,age):
self.name = name
self.age = age
one_person = Student("小白",18)
with open("pickle_demo","wb")as f:
pickle.dump(one_person,f)
with open("pickle_demo","rb")as f1:
ret = pickle.load(f1)
print(ret.name,ret.age) ==>小白 18
pickle支持幾乎所有對(duì)象序列化? 對(duì)象的序列化需要這個(gè)對(duì)象對(duì)應(yīng)的類在內(nèi)存中
例:對(duì)于多次dump/load的操作做了良好的處理
import picklewith open("pickle_demo","wb")as f:
pickle.dump({"k1":"v1"},f)
pickle.dump({"k2":"v2"},f)
pickle.dump({"k3":"v3"},f)
with open("pickle_demo","rb")as f1:
while True:
try:
print(pickle.load(f1))
except EOFError:
break
結(jié)果:
{'k1': 'v1'}
{'k2': 'v2'}
{'k3': 'v3'}
?
shelve模塊:
對(duì)于shelve模塊如果寫定一個(gè)文件并且改動(dòng)比較少,讀文件的操作比較多,且大部分讀取都需要基于某個(gè)key來獲得對(duì)應(yīng)的value才用shelve
例:
import shelvef = shelve.open("text")
f["key"] = {"k1":(1,2,3),"k2":"v2"}
f.close()
f = shelve.open("text")
content = f["key"]
f.close()
print(content) ==>{'k1': (1, 2, 3), 'k2': 'v2'}
hashlib模塊:
定義:能把一個(gè)字符串?dāng)?shù)據(jù)類型的變量轉(zhuǎn)換成一個(gè)定長(zhǎng)的密文的字符串,字符串里的每一個(gè)字符都是一個(gè)十六進(jìn)制的數(shù)字 且字符串到密文不可逆
對(duì)于相同的字符串用相同的算法相同的手段去進(jìn)行摘要獲得的值總是相同的
md5和sha1都是算法它們兩個(gè)相互獨(dú)立.
對(duì)于同一個(gè)字符串不管這個(gè)字符串有多長(zhǎng),只要是相同,無論在任何環(huán)境下,多少次執(zhí)行在任何語言中使用相同的算法相同手段得到的結(jié)果永遠(yuǎn)是相同的;反之,只要不是相同的字符串,得到的結(jié)果一定不同
md5 32位字符,每個(gè)字符都是十六進(jìn)制
sha1 40位字符,每個(gè)字符都是十六進(jìn)制
例: md5
import hashlibs = "abcd"
md5_obj = hashlib.md5()
md5_obj.update(s.encode("utf-8"))
ret = md5_obj.hexdigest()
print(ret,len(ret),type(ret)) ==>e2fc714c4727ee9395f324cd2e7f331f 32 <class 'str'>
例: sha1
import hashlibs = "abcd"
sha1_obj = hashlib.sha1()
sha1_obj.update(s.encode("utf-8"))
ret = sha1_obj.hexdigest()
print(ret,len(ret),type(ret)) ==>81fe8bfe87576c3ecb22426f8e57847382917acf 40 <class 'str'>
md5比sha1快效率高
md5算法相對(duì)簡(jiǎn)單,比較普及? sha1算法相對(duì)復(fù)雜,計(jì)算速度也慢但是安全性更高,因?yàn)橛玫娜松?
為了避免撞庫問題我們需要對(duì)密碼進(jìn)行動(dòng)態(tài)加鹽
例:?
import hashlibusername = input(">>>>>")
password = input(">>>>>")
md5_obj = hashlib.md5(username.encode("utf-8"))
md5_obj.update(password.encode("utf-8"))
ret = md5_obj.hexdigest()
print(ret)
結(jié)果:
>>>>>你好
>>>>>123
36473306e94d8d0f8dc4af5d4d9e17cc
例: 文件是否一致的校驗(yàn)
import hashlibmd5_obj = hashlib.md5()
with open("hashlib_demo1","rb")as f:
md5_obj.update(f.read())
ret = md5_obj.hexdigest()
print(ret)
md5_obj = hashlib.md5()
with open("hashlib_demo2","rb")as f:
md5_obj.update(f.read())
ret1 = md5_obj.hexdigest()
print(ret1)
if ret == ret1:
print("True")
else:
print("False")
configparser模塊:
定義:有一種固定格式的配置文件.有一個(gè)對(duì)應(yīng)的模塊去幫你做這個(gè)文件的字符串處理
配置文件后綴.ini
生成配置文件格式:
例:
import configparserconfig = configparser.ConfigParser()
config["DEFAULT"] = {'ServerAliveInterval': '45',
'Compression': 'yes',
'CompressionLevel': '9',
'ForwardX11':'yes'
}
config['bitbucket.org'] = {'User':'hg'}
config['topsecret.server.com'] = {'Host Port':'50022','ForwardX11':'no'}
with open('example.ini', 'w') as configfile:
config.write(configfile)
結(jié)果: [DEFAULT] #section
serveraliveinterval = 45 #option
compression = yes #option
compressionlevel = 9 #option
forwardx11 = yes #option
[bitbucket.org] #section
user = hg #option
[topsecret.server.com] #setion
host port = 50022 #option
forwardx11 = no #option
logging模塊:
功能:
1.日志格式的規(guī)范
2.操作的簡(jiǎn)化
3.日志的分級(jí)管理
logging不能做的事:不能自動(dòng)生成要打印的內(nèi)容 ??
需要自己在開發(fā)的時(shí)候定好,哪些地方需要打印,打印的內(nèi)容是什么,內(nèi)容的級(jí)別
logging模塊的使用方法:
1.普通配置形, 簡(jiǎn)單的,可定制化差
2.對(duì)象配置,復(fù)雜的,可定制化強(qiáng)
例:
import logginglogging.basicConfig(level=logging.DEBUG) #不寫level默認(rèn)答應(yīng)警告以上的所有內(nèi)容
logging.debug("debug message") #調(diào)試
logging.info("info message") #基礎(chǔ)信息
logging.warning("warning message")#警告
logging.error("error message") #錯(cuò)誤
logging.critical("critical message") #嚴(yán)重錯(cuò)誤
結(jié)果:
DEBUG:root:debug message
INFO:root:info message
WARNING:root:warning message
ERROR:root:error message
CRITICAL:root:critical message
例:
import logginglogging.basicConfig(level=logging.DEBUG,
format = '%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
datefmt="%a,%d %b %Y %H:%M:%S",
filename="logging_demo")
logging.debug("debug message") #調(diào)試
logging.info("info message") #基礎(chǔ)信息
logging.warning("warning message")#警告
logging.error("error message") #錯(cuò)誤
logging.critical("critical message") #嚴(yán)重錯(cuò)誤
在屏幕上輸出不用打印filename
寫入文件要在baicconfig中寫入文件名
basicconfig不能將一個(gè)logging信息即輸出到屏幕上又輸入到文件中
例:?將一個(gè)logging信息即輸出到屏幕上又輸入到文件中
import logginglogger = logging.getLogger()
fh = logging.FileHandler('test.log',encoding='utf-8') # 創(chuàng)建一個(gè)handler,用于寫入日志文件
ch = logging.StreamHandler() # 再創(chuàng)建一個(gè)handler,用于輸出到控制臺(tái)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') #創(chuàng)建一個(gè)日志輸出格式
logger.setLevel(logging.DEBUG) #設(shè)置輸出內(nèi)容級(jí)別
fh.setFormatter(formatter) #文件管理操作符綁定一個(gè)格式
ch.setFormatter(formatter) #屏幕管理操作符綁定一個(gè)格式
logger.addHandler(fh) #logger對(duì)象可以添加多個(gè)fh和ch對(duì)象
logger.addHandler(ch)
logger.debug('logger debug message')
logger.info('logger info message')
logger.warning('logger warning message')
logger.error('logger error message')
logger.critical('logger critical message')
轉(zhuǎn)載于:https://www.cnblogs.com/wangjian941118/p/9476056.html
總結(jié)
以上是生活随笔為你收集整理的模块(sys/os/序列化模块)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: POJ 1276 Cash Machin
- 下一篇: Shell 简单的java微服务jar