模块(sys/os/序列化模块)
?sys 模塊:
?sys.path? 返回模塊的搜索路徑,初始化時使用pythonpath環境變量的值
sys.modules ? 返回所有在當前這個python程序中導入的模塊的
sys.exit ? 退出程序
sys.argv ? 返回一個列表 列表的第一個元素是執行這個文件的時候,寫在python后面的第一個值, 之后的元素是在執行python的啟動的時候可以寫多個值.都會依次添加到列表中
?
os 模塊:和操作系統進行交互的
工作目錄相關:
?os.getcwd() 在那執行文件就獲取當前文件地址
例:
import osprint(os.getcwd()) ==>F:\面向對象\180808
?os.chdir(新地址) 修改當前文件目錄,相當于 shell下cd?
例:
import osprint(os.getcwd())
os.chdir(r"F:\面向對象\180807")
print(os.getcwd())
結果:
F:\面向對象\180808
F:\面向對象\180807
?os.curdir 返回當前目錄? 結果: .
os.pardir 獲取當前目錄的父級目錄字符串名? 結果: ..
?
創建文件/文件夾和刪除文件/文件夾相關:
os.makedirs(文件名1/文件名2) 可生成多層遞歸目錄
os.removedirs(文件1/文件2) 若目錄為空,則刪除,并遞歸到上一級目錄,如若也為空,則刪除,一次類推
os.mkdir(文件名) 生成單級目錄 ,相當于shell中mkdir dirname
os.rmdir(文件名) 刪除單級目錄,若目錄不為空則無法刪除,報錯;相當于shell中rmdir dirname
os.listdir(文件名) 列出指定目錄下的所有文件和子目錄,包括隱藏文件,并以列表方式打印
os.remove(文件名) 刪除文件
os.rename(oldname,newname) 重命名文件名
?
和操作系統差異相關:
os.stat(路徑) ? 獲取文件/目錄信息
os.sep ? 輸出操作系統特定的路徑分隔符, win下為"\\",Linux下為"/"
os.linesep 輸出當前平臺使用的行終止符, win下為"\t\n",Linux下為"\n"
os.pathsep 輸出用于分割文件路徑的字符串, win下為";",Linux下為":"
os.name? 輸出字符串指示當前使用平臺,? win下為"nt",Linux下為"posix"
?
使用pyth來和操作系統命令交互:
os.system("base command") 運行shell命令,直接顯示
os.popen("base command").read() 運行shell命令,獲取執行結果
?
查看環境變量:
os.environ? 獲取系統環境變量
?
os.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.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[,path3[,...]]]) ? 將多個路徑組合后返回,第一個絕對路徑之前的參數將被忽略
os.path.getatime(path) 返回path所指向的文件或者目錄的最后訪問時間
os.path.getmtime(path) 返回path所指向的文件或者目錄的最后修改時間
os.path.getsize(path) 返回path的大小
?
例:獲取文件的路徑
import osprint(__file__)
print(os.path.dirname(__file__))
print(os.path.dirname(os.path.dirname(__file__)))
結果:
F:/面向對象/180808/課堂練習.py
F:/面向對象/180808
F:/面向對象
?
序列化模塊:json pickle shelve
序列化:將原本的字典、列表等內容轉換成一個字符串的過程就叫做序列化.?
序列化的目的:1.把內容寫入文件;2.網絡傳輸數據
json模塊:
json. dumps(dict)? 將字典轉化成字符串
例:
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) 將字符串轉化成字典
例:
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(句柄)? 從文件中讀取并轉化成字符串
例:
import jsonwith open("json_dumps",mode="r",encoding="utf-8")as f:
print(json.load(f)) ==>{'a': 1, 'b': 2, 'c': 3}
json能處理的數據類型有限,限制比較多?
限制:
1.json格式中字典的key必須是字符串數據類型
2.如果是數字為key,那么dump之后會強轉成字符串數據類型
3.對元組做value的字典會把元組強制轉換成列表
4.json不支持元組做key會報錯
5.json處理文件中的字符串必須是雙引號
6.能多次dump數據到文件中但不能load出來 多次寫入數據到文件中用dumps從文件中讀出數據用loads
7.json中集合不能使用dump/dumps方法
8.json中dumps元組類型會將元組強轉成列表再轉化成字符串
例: 中文格式的寫入文件中的編碼ensure_ascii
import jsondic = {"abc":1,"country":'中國'}
ret = json.dumps(dic,ensure_ascii=False)
print(ret) ==>{"abc": 1, "country": "中國"}
sort_keys對字典的key的首字母做排序
indent設置縮進
separators根據標點符號來換行
ensure_ascii 顯示中文
例:
import jsondic = {"name":'小白','age':'18','hobby':["聽歌",'畫畫']}
ret = json.dumps(dic,sort_keys=True,indent=4,separators=(",",":"),ensure_ascii=False)
print(ret)
結果:
{
??? "age":"18",
??? "hobby":[
??????? "聽歌",
??????? "畫畫"
??? ],
??? "name":"小白"
}
json的其他參數是為了用戶看著更方便,但是會相對浪費時間
?
?pickle模塊: 與文件相關模式:rb,wb
pickle支持幾乎所有的對象的序列化
pickle.dumps的結果是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}
一個類的對象也可用pickle.dumps存儲起來
例:
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支持幾乎所有對象序列化? 對象的序列化需要這個對象對應的類在內存中
例:對于多次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
結果:
{'k1': 'v1'}
{'k2': 'v2'}
{'k3': 'v3'}
?
shelve模塊:
對于shelve模塊如果寫定一個文件并且改動比較少,讀文件的操作比較多,且大部分讀取都需要基于某個key來獲得對應的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模塊:
定義:能把一個字符串數據類型的變量轉換成一個定長的密文的字符串,字符串里的每一個字符都是一個十六進制的數字 且字符串到密文不可逆
對于相同的字符串用相同的算法相同的手段去進行摘要獲得的值總是相同的
md5和sha1都是算法它們兩個相互獨立.
對于同一個字符串不管這個字符串有多長,只要是相同,無論在任何環境下,多少次執行在任何語言中使用相同的算法相同手段得到的結果永遠是相同的;反之,只要不是相同的字符串,得到的結果一定不同
md5 32位字符,每個字符都是十六進制
sha1 40位字符,每個字符都是十六進制
例: 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算法相對簡單,比較普及? sha1算法相對復雜,計算速度也慢但是安全性更高,因為用的人少.
為了避免撞庫問題我們需要對密碼進行動態加鹽
例:?
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)
結果:
>>>>>你好
>>>>>123
36473306e94d8d0f8dc4af5d4d9e17cc
例: 文件是否一致的校驗
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模塊:
定義:有一種固定格式的配置文件.有一個對應的模塊去幫你做這個文件的字符串處理
配置文件后綴.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)
結果: [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.日志格式的規范
2.操作的簡化
3.日志的分級管理
logging不能做的事:不能自動生成要打印的內容 ??
需要自己在開發的時候定好,哪些地方需要打印,打印的內容是什么,內容的級別
logging模塊的使用方法:
1.普通配置形, 簡單的,可定制化差
2.對象配置,復雜的,可定制化強
例:
import logginglogging.basicConfig(level=logging.DEBUG) #不寫level默認答應警告以上的所有內容
logging.debug("debug message") #調試
logging.info("info message") #基礎信息
logging.warning("warning message")#警告
logging.error("error message") #錯誤
logging.critical("critical message") #嚴重錯誤
結果:
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") #調試
logging.info("info message") #基礎信息
logging.warning("warning message")#警告
logging.error("error message") #錯誤
logging.critical("critical message") #嚴重錯誤
在屏幕上輸出不用打印filename
寫入文件要在baicconfig中寫入文件名
basicconfig不能將一個logging信息即輸出到屏幕上又輸入到文件中
例:?將一個logging信息即輸出到屏幕上又輸入到文件中
import logginglogger = logging.getLogger()
fh = logging.FileHandler('test.log',encoding='utf-8') # 創建一個handler,用于寫入日志文件
ch = logging.StreamHandler() # 再創建一個handler,用于輸出到控制臺
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') #創建一個日志輸出格式
logger.setLevel(logging.DEBUG) #設置輸出內容級別
fh.setFormatter(formatter) #文件管理操作符綁定一個格式
ch.setFormatter(formatter) #屏幕管理操作符綁定一個格式
logger.addHandler(fh) #logger對象可以添加多個fh和ch對象
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')
轉載于:https://www.cnblogs.com/wangjian941118/p/9476056.html
總結
以上是生活随笔為你收集整理的模块(sys/os/序列化模块)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: POJ 1276 Cash Machin
- 下一篇: Shell 简单的java微服务jar