python基础-2
1.文件操作
mode的常用種類r w a rb wb ab ,帶b標識不用指定編碼格式全都是byte類型 ,用于非文本文件(圖 音 視頻)
r模式下僅讀取
w模式下當文件沒有可以創(chuàng)建 ,但是會覆蓋寫入
a模式下可以追加
readline() 讀取一行,不占用內(nèi)存
readlines() 將文件所有行讀取放入一個list中
# 文件讀取f = open('json.txt',mode='r',encoding="utf-8") # 讀取文件編碼
print(f.readline())
print(f.readline()) # 從文件中讀取一行一行讀取
print(f.read()) # 將管道文件內(nèi)容一次讀取出來
f.seek(0) # 移動光標 ,0到最開始位置 1光標當前位置 2文件尾部
print(f.read())
f.flush() # 清空管道
f.close() # 關(guān)閉管道
# 文件復制寫入
with open('json.txt', mode='rb') as f1,open('copy.txt', mode='wb') as f2: # with可以幫助做管道優(yōu)化
for line in f1: # for循環(huán)按文件行循環(huán)
f2.write(line)
# 文件修改(所有的編輯器都是如此)
# 文件修改的步驟: 1.文件修改僅將源文件讀出 2.變更操作寫入新文件 3.源文件刪除 4.新文件重命名
import os
with open("test1.txt", mode="r", encoding="utf-8") as f1, \
open("test1.txt_副本", mode="w", encoding="utf-8") as f2:
# 代碼塊(with), 當這個代碼塊結(jié)束的時候. 自動的關(guān)閉f1和f2
for line in f1:
s = line.replace("centos", "redhat")
f2.write(s)
os.remove("test1.txt")
os.rename("test1.txt_副本", "test1.txt")
?
2.三種推導式
推導式是可以從一個數(shù)據(jù)序列構(gòu)建另一個新的數(shù)據(jù)序列的結(jié)構(gòu)體(三種:list dict set推導式)
list推導式? ? ? ? [表達式 for 循環(huán) if 條件] #換成圓括號變生成器
#推導式list1 = [x*x for x in range(1,10)]
#普通 list1=[] for x in range(1,10):list1.append(x*x)
dict推導式? ? ?? {key:value for循環(huán) if判斷}
# 推導式dict1 = {x:x**x for x in range(0, 10) if x < 9}
# 普通
dict3={}
for k in range(0,10):
if k < 9:
dict3[k]=k**k # key values 互換
dict1 = {1: 'n1', 2: 'n2'}
dict2 = {v: k+1 for k, v in dict1.items()}
set推導式 {表達式 for 循環(huán) if 條件} # 與列表推導式的擴號不同 ?
set1 = {x**x:2 for x in range(0, 10) if x < 9}?
3.閉包
閉包在python中 ,可以簡單理解為 ,內(nèi)函數(shù)綁定外函數(shù)的局部變量 ,外函數(shù)返回內(nèi)函數(shù)內(nèi)存地址
# 匿名函數(shù)的閉包寫法fun = [lambda x: x*i for i in range(4)] # 典型閉包 ,外函數(shù)的i最后會是3,內(nèi)函數(shù)lambda從外函數(shù)沒有定義i的值 ,最后生成列表都是函數(shù)
? for item in fun:
? print(item(1))
# def函數(shù)的閉包寫法
def func():
# 定義一個空列表
fun_lambda_list = []
# 循環(huán)
for i in range(4):
# 定義一個內(nèi)函數(shù),沒被調(diào)用也不會去拿i的值 ,所以返回值一直都是x*i
def lambda_(x):
# 返回x*i
return x * i
# 將內(nèi)函數(shù)追加到列表中
fun_lambda_list.append(lambda_)
return fun_lambda_list #列表中有四個函數(shù)(一個都沒有執(zhí)行[x*i,x*i,x*i,x*i]) ,當fun被調(diào)用的那一刻開始i被定格為3
# 將內(nèi)函數(shù)中加入每次i的值就可以了,這樣獲得的函數(shù)列表就是[x*0,x*1,x*2,x*3] fun = [lambda x,i=i:x*i for i in range(4)]
?
4.模塊-包
內(nèi)置標準模塊
random模塊
import randomprint(random.random()) # 隨機0-1的浮點
print(random.uniform(1, 3)) # 隨機1-3的浮點
print(random.randint(1, 10)) # 隨機取1-10的整數(shù)
print(random.randrange(1, 9, 2)) # 隨機取1-9之間的數(shù)步長為2,不顧尾
print(random.choice([1, 2, 3, [2, 3]])) # 隨機選擇可迭代對象元素
print(random.sample([1, 2, 3, 4, 'hh'], 3)) # 列表任意X個元素組成新列表,這里X是3
time模塊
import timeprint(time.localtime()) #打印當前日期
print(time.time()) #打印時間戳 19701.1. 00:00:00的偏移量
print(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())) #格式化當前日期(format ,日期)
re模塊
正則
# . 匹配任意單個字符# ^ 匹配字符串起始部分
# $ 匹配字符串終止位置
# * 匹配前一個字符0或多次
# + 匹配前一個字符1次或多次
# ? 匹配前一個字符1次或0次
# {N} 匹配前一個字符N次
# {N,} 匹配前一個字符N次
# {M,N} 匹配前一個字符N,M次
# [...] 匹配任意字符集中單個字符
# [x-y] 匹配范圍內(nèi)任意單個字符
# [^..] 匹配出去字符集中任意單個字符
# \d 匹配任意一個10機制數(shù)字
# \w 匹配任意字母數(shù)字
# \s 匹配任何空字符
# \b 匹配字符邊界
# () 分組 ,
# \N 匹配保存的分組
# \ 轉(zhuǎn)義符
1.
2.
3.
4.
5.
re常用方法
re.match('正則表達式', 要匹配的字符串) #如果匹配成功返回一個對象 ,否則返回None?
os模塊
import osos.path.abspath('..') # 獲取父目錄絕對路徑
os.path.abspath('.') # 獲取當前絕對路徑 os.path.abspath(__file__) #獲取當前文件的路徑和文件名 dir1 = 'C:\\boruoboluomi\\a1\\b1\\a.txt'
os.path.dirname(os.path.dirname(os.path.abspath(dir1))) #dirname可以將路徑 一層一層脫掉
os.path.split(dir1) # 切割路徑 ,將路徑與文件分離
os.path.join('C:\\boruoboluomi\\a1\\b1', 'a.txt') # 拼接路徑 , 將路徑與文件拼接
os.path.exists(dir1) # 判斷該文件是否存在
os.remove('絕對路徑文件') # 刪除文件
os.system('ls /etc/profile') # 執(zhí)行shell命令 os.getcwd() # 獲取pwd當前絕對路徑
sys模塊
import sysprint(sys.modules) #查看解釋器運行時自動加載的所有模塊 print(sys.path) #查看第三方模塊的路徑 ,該路徑下的模塊都可以使用import導入使用,也可以使用sys.path.append()追加路徑
math模塊
import matht1 = 6.6
print(math.ceil(t1)) # 向上取整
print(math.floor(t1)) # 向下取整
print(math.pow(t1, 2)) # t1的2次方
print(math.fabs(t1)) # t1的絕對值
json模塊
序列化模塊 ,json可以將python數(shù)據(jù)類型序列化為可傳輸?shù)淖址?,對方接受到后通過反序列化可獲得自己可讀語言數(shù)據(jù)類型
import json #用于網(wǎng)絡(luò)傳輸?shù)膁umps ,loadsdic = {'name':'小咪','age':12,'sex':'公'} #定義一個字典dicret = json.dumps(dic) #序列化過程:將dic變成json格式的ret(特殊字符串)ret1 = json.loads(ret) #反序列化過程:將ret這個json格式反解成為ret1(還原為字典)print(ret,type(ret))print(ret1,type(ret1)) #用于文件存儲數(shù)據(jù)的dump ,load list1 = [1, 2, 3, 4] f1 = open('json.txt', mode='w') # 打開一個文件,文件僅支持字符串寫入 json.dump(list1, f1) # dump方法可以將py數(shù)據(jù)類型和文件句柄當做參數(shù)傳入,做序列化 f1.close() f1 = open('json.txt', mode='r') ret = json.load(f1) # dump方法將文件中內(nèi)容反序列化取出 print(ret, type(ret)) # 反序列化后數(shù)據(jù)類型和序列化之前一模一樣rsa模塊 & base64模塊
1.生成一組非對稱秘鑰對 ,該秘鑰對最大加密數(shù)據(jù)長度是128字節(jié) ,其中11個自己加密使用 ,被加密數(shù)據(jù)僅有117
2.base64編碼的原因是因為網(wǎng)絡(luò)傳輸錯誤會降低
3.定義加密函數(shù) ,將數(shù)據(jù)以117步長切割加密 ,放入列表 ,發(fā)送到對端
4.定義解密函數(shù) ,將數(shù)據(jù)以128步長解密拼接 ,即可獲得原數(shù)據(jù)
5.調(diào)用rsa加密必須是byte的數(shù)據(jù)
import rsa import base64####生成一組秘鑰對#### pub_key_obj, priv_key_obj = rsa.newkeys(1024) # 最大加密value的字節(jié)數(shù)是 1024/8 - 11(自己用) = 117(可用加密字節(jié))# 將對象轉(zhuǎn)換為字符串類型 pub_key_str = pub_key_obj.save_pkcs1() priv_key_str = priv_key_obj.save_pkcs1()# 再通過base64編碼 pub_key_code = base64.standard_b64encode(pub_key_str) priv_key_code = base64.standard_b64encode(priv_key_str) print(pub_key_code) print(priv_key_code) ####數(shù)據(jù)加密#### def encrypt(bytes_value): values_list = [] key_str = base64.standard_b64decode(pub_key_code) pk = rsa.PublicKey.load_pkcs1(key_str) length = len(bytes_value) for i in range(0, length, 117): val = rsa.encrypt(bytes_value[i: i + 117], pk) values_list.append(val) val = b''.join(values_list) return val ####數(shù)據(jù)解密#### def decrypt(value): values_list = [] key_str = base64.standard_b64decode(priv_key_code) pk = rsa.PrivateKey.load_pkcs1(key_str) length = len(value) for i in range(0, length, 128): val = rsa.decrypt(value[i: i + 128], pk) values_list.append(val) val = b''.join(values_list) # val = rsa.decrypt(value, pk) return val ###調(diào)用 string = 'alex' * 100 ret = encrypt(string.encode('utf-8')) # 加密數(shù)據(jù)要求byte類型 print(ret) print(decrypt(ret).decode('utf-8')) # 數(shù)據(jù)encode編碼->加密 ->解密->decode解碼自定義模塊
自定義日志模塊
1.__init__方法定義logger對象 ,定義info ,error方法 ,實例化Logger類獲得單例模式的對象?
2.使用直接from? 文件 import logger 加載對象
3.調(diào)用 logger.info(日志即可)
import logging from conf import settingsclass Logger:def __init__(self, file_name, log_name, level=logging.INFO):# 定義使用文件介質(zhì)存儲(FileHandler) ,該文件名和編碼格式file_handler = logging.FileHandler(file_name, encoding='utf-8')# 定義格式(Formatter)fmt = logging.Formatter(fmt="%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s") # 為文件介質(zhì)定義格式(setFormatter) file_handler.setFormatter(fmt) # 定義logger對象,給實例化的對象 ,定義日志對象名與最低顯示等級 self.logger = logging.Logger(log_name, level=level) self.logger.addHandler(file_handler) def info(self, msg): return self.logger.info(msg) def error(self, msg): return self.logger.error(msg) logger = Logger(settings.LOGGER_PATH, settings.LOGGER_NAME)包
包就是有__init__.py文件標識的文件夾
精準導入方式
from lib.disk. import Pack1Class #推薦使用
import Root.Pack1.Pack1Class
?
轉(zhuǎn)載于:https://www.cnblogs.com/quguanwen/p/11158033.html
總結(jié)
以上是生活随笔為你收集整理的python基础-2的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQL Calendar Table
- 下一篇: Professional IronPyt