日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

模块(sys/os/序列化模块)

發(fā)布時(shí)間:2023/12/1 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 模块(sys/os/序列化模块) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?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 os
print(os.getcwd()) ==>F:\面向?qū)ο骪180808

?os.chdir(新地址) 修改當(dāng)前文件目錄,相當(dāng)于 shell下cd?

例:

import os
print(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 os
print(__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 json
dic = {"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 json
str_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 json
dic = {"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 json
with 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 json
dic = {"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 json
dic = {"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 pickle
dic = {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 pickle
class 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 pickle
class 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 pickle
with 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 shelve
f = 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 hashlib
s = "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 hashlib
s = "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 hashlib
username = 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 hashlib
md5_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 configparser
config = 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 logging
logging.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 logging
logging.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 logging
logger = 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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。