python基础-2
1.文件操作
mode的常用種類r w a rb wb ab ,帶b標識不用指定編碼格式全都是byte類型 ,用于非文本文件(圖 音 視頻)
r模式下僅讀取
w模式下當文件沒有可以創建 ,但是會覆蓋寫入
a模式下可以追加
readline() 讀取一行,不占用內存
readlines() 將文件所有行讀取放入一個list中
# 文件讀取f = open('json.txt',mode='r',encoding="utf-8") # 讀取文件編碼
print(f.readline())
print(f.readline()) # 從文件中讀取一行一行讀取
print(f.read()) # 將管道文件內容一次讀取出來
f.seek(0) # 移動光標 ,0到最開始位置 1光標當前位置 2文件尾部
print(f.read())
f.flush() # 清空管道
f.close() # 關閉管道
# 文件復制寫入
with open('json.txt', mode='rb') as f1,open('copy.txt', mode='wb') as f2: # with可以幫助做管道優化
for line in f1: # for循環按文件行循環
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), 當這個代碼塊結束的時候. 自動的關閉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.三種推導式
推導式是可以從一個數據序列構建另一個新的數據序列的結構體(三種:list dict set推導式)
list推導式? ? ? ? [表達式 for 循環 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循環 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 循環 if 條件} # 與列表推導式的擴號不同 ?
set1 = {x**x:2 for x in range(0, 10) if x < 9}?
3.閉包
閉包在python中 ,可以簡單理解為 ,內函數綁定外函數的局部變量 ,外函數返回內函數內存地址
# 匿名函數的閉包寫法fun = [lambda x: x*i for i in range(4)] # 典型閉包 ,外函數的i最后會是3,內函數lambda從外函數沒有定義i的值 ,最后生成列表都是函數
? for item in fun:
? print(item(1))
# def函數的閉包寫法
def func():
# 定義一個空列表
fun_lambda_list = []
# 循環
for i in range(4):
# 定義一個內函數,沒被調用也不會去拿i的值 ,所以返回值一直都是x*i
def lambda_(x):
# 返回x*i
return x * i
# 將內函數追加到列表中
fun_lambda_list.append(lambda_)
return fun_lambda_list #列表中有四個函數(一個都沒有執行[x*i,x*i,x*i,x*i]) ,當fun被調用的那一刻開始i被定格為3
# 將內函數中加入每次i的值就可以了,這樣獲得的函數列表就是[x*0,x*1,x*2,x*3] fun = [lambda x,i=i:x*i for i in range(4)]
?
4.模塊-包
內置標準模塊
random模塊
import randomprint(random.random()) # 隨機0-1的浮點
print(random.uniform(1, 3)) # 隨機1-3的浮點
print(random.randint(1, 10)) # 隨機取1-10的整數
print(random.randrange(1, 9, 2)) # 隨機取1-9之間的數步長為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] 匹配范圍內任意單個字符
# [^..] 匹配出去字符集中任意單個字符
# \d 匹配任意一個10機制數字
# \w 匹配任意字母數字
# \s 匹配任何空字符
# \b 匹配字符邊界
# () 分組 ,
# \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') # 執行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數據類型序列化為可傳輸的字符串 ,對方接受到后通過反序列化可獲得自己可讀語言數據類型
import json #用于網絡傳輸的dumps ,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)) #用于文件存儲數據的dump ,load list1 = [1, 2, 3, 4] f1 = open('json.txt', mode='w') # 打開一個文件,文件僅支持字符串寫入 json.dump(list1, f1) # dump方法可以將py數據類型和文件句柄當做參數傳入,做序列化 f1.close() f1 = open('json.txt', mode='r') ret = json.load(f1) # dump方法將文件中內容反序列化取出 print(ret, type(ret)) # 反序列化后數據類型和序列化之前一模一樣rsa模塊 & base64模塊
1.生成一組非對稱秘鑰對 ,該秘鑰對最大加密數據長度是128字節 ,其中11個自己加密使用 ,被加密數據僅有117
2.base64編碼的原因是因為網絡傳輸錯誤會降低
3.定義加密函數 ,將數據以117步長切割加密 ,放入列表 ,發送到對端
4.定義解密函數 ,將數據以128步長解密拼接 ,即可獲得原數據
5.調用rsa加密必須是byte的數據
import rsa import base64####生成一組秘鑰對#### pub_key_obj, priv_key_obj = rsa.newkeys(1024) # 最大加密value的字節數是 1024/8 - 11(自己用) = 117(可用加密字節)# 將對象轉換為字符串類型 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) ####數據加密#### 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 ####數據解密#### 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 ###調用 string = 'alex' * 100 ret = encrypt(string.encode('utf-8')) # 加密數據要求byte類型 print(ret) print(decrypt(ret).decode('utf-8')) # 數據encode編碼->加密 ->解密->decode解碼自定義模塊
自定義日志模塊
1.__init__方法定義logger對象 ,定義info ,error方法 ,實例化Logger類獲得單例模式的對象?
2.使用直接from? 文件 import logger 加載對象
3.調用 logger.info(日志即可)
import logging from conf import settingsclass Logger:def __init__(self, file_name, log_name, level=logging.INFO):# 定義使用文件介質存儲(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") # 為文件介質定義格式(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
?
轉載于:https://www.cnblogs.com/quguanwen/p/11158033.html
總結
以上是生活随笔為你收集整理的python基础-2的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQL Calendar Table
- 下一篇: 08.存储Cinder→4.Cinder