Python回忆基础篇——快速上手Python
1、文件处理操作
import包:sys(与当前程序之外的系统环境交互)、os、shutil
sys
if __name__ == '__main__': main(sys.argv)#外部交互最常用的
当然sys其余的模块也相当常用,例如path、platform、exit,分别是获取当前使用的平台、执行至主程序的末尾时,解释器会自动退出、 返回模块所使用的路径的作用。
下面来一个小小的程序,用于文件操作的处理
from os import path,listdir import sys import shutil from distutils import filelist from genericpath import isfile def search(root, target): fileList = [] items = listdir(root) for item in items: filepath = path.join(root, item) #判断是否是目录 if path.isdir(filepath): list = search(filepath, target) fileList = list + fileList #判断是否是文件 elif path.isfile(filepath): #判断扩展名 if filepath.split('.')[-1] == target: fileList.append(filepath) print(fileList) return fileList def moveFileToDest(files, dest): for file in files: #print(file)#移动文件 shutil.move(file,dest) print("moveFile") def main(argv): #输入三个参数 path = argv[1] target = argv[2] dest = argv[3] files = search(path, target) moveFileToDest(files, dest) if __name__ == '__main__': main(sys.argv)#sys.argv外部传递参数
外部只需在命令提示符内输入pythonpython **.py 搜索文件 文件后缀名 移动文件目录
,文件发生移动
2、文件读写
下面代码日常可用,再详细可参考易百教程,非常详细,省下查手册时间。
#只读;r+以附加读写方式打开文件,若文件不存在则报错,w+则自行创建一个 handle = open("word2.txt","r") #二进制打开 #handle = open("word2.txt","rb") #这段是每次都从开头写,只写模式;w+是可读写 handle = open("word2.txt","w") handle.write("12138") 也可以全部输出 #1 for line in handle: print(line,end='') #2 data = handle.readlines() print(data)
3、认识Excel自动化工具
import包:xlrd/xlwt(适用于老版本、老框架)、Openpyxl、XLUntils、xlwings、pandas
from openpyxl import Workbook,load_workbook wb = Workbook() # 在本地创建Excel工作簿 ws = wb.active # 激活worksheet w1 = wb.create_sheet("w1") # 在“wb”工作簿中新建一个名为"w1"的sheet,默认的位置为最后 w2 = wb.create_sheet("w2",0) # 创建新建名为"w2"的sheet,将位置设置0,最前面 wb.save("excel.xlsx")#保存工作簿
创建工作簿并不常用,导入工作簿更切合实际应用
from openpyxl import Workbook,load_workbook wb = load_workbook("excel/excel.xlsx")#导入excel ws = wb.active print(ws.title)#输出当前最活跃的sheet #接下来便是选取Sheet表 wslist = wb.worksheets #共有两个表格进行选取 ws1 = wslist[0] ws2 = wslist[1] #cell对表格进行修改 cell = ws1.cell(1,1,1) print(ws1.cell(2,1,2)) wb.save("excel.xlsx")
即目前活跃的表为Sheet
既然了解了表格修改,那表格内容怎么查看呢?
from openpyxl import Workbook,load_workbook wb = load_workbook("excel/excel.xlsx") wslist = wb.worksheets ws1 = wslist[0] ws2 = wslist[1] rows = ws1.rows for row in rows: for cell in row: print(cell.value)#按行输出
写入一个新的表格并保存会发生什么呢?建一个text.xlsx工作簿,里面加入
from openpyxl import Workbook,load_workbook wb = load_workbook("test.xlsx") wslist = wb.worksheets ws1 = wslist[0] ws2 = wslist[1] data1 = ws1["A1:A2"] print(data1) data2 = ws1["A3:D3"] print(data2) data = data1+data2 print(data) for i in range(len(data)): for j in range(len(data[i])): ws2.cell(i+1,j+1,data[i][j].value) wb.save("test2.xlsx") #((<Cell 'Sheet'.A1>,), (<Cell 'Sheet'.A2>,)) #((<Cell 'Sheet'.A3>, <Cell 'Sheet'.B3>, <Cell 'Sheet'.C3>, <Cell 'Sheet'.D3>),) #((<Cell 'Sheet'.A1>,), (<Cell 'Sheet'.A2>,), (<Cell 'Sheet'.A3>, <Cell 'Sheet'.B3>, <Cell 'Sheet'.C3>, <Cell 'Sheet'.D3>))
改动位置并保存到text2.xlsx中,这时text.xlsx的Sheet会保存到text2.xlsx的Sheet中(这个时候text.xlsx的Sheet1是空的)
同时会将改动位置保存到text2.xlsx的Sheet1中
(可以自行尝试按行、按列、按不同Sheet表叠加到空的Sheet中。)
4、网络原理(浅解)
物理层、数据链路层、网络层
传输层(普遍程序员介入的层)、表示层、应用层、会话层、应用层
(Python一般情况下工作于传输层之后,所以这次我么主要说说传输层,底层可在后期有一定基础后学习更容易,切忌贪多嚼不烂)
传输层:通俗地讲就是传输层提供了应用进程之间的端-端连接,既然是应用进程,那么必然需要在电脑中进行标识,用什么标识呢——端口。(经典三次握手、四次挥手就在这一层)
端口占有16位,其大小也就有65536个,是从0~65535.也就是一台计算机有65535个端口,主机之间的通讯,也就是应用进程之间的通讯。
常见端口:
https协议默认443端口
http默认80端口
8080:代理端口,同80端口一样,8080 端口常用于WWW代理服务,实现网页浏览。如果用了8080端口,访问网站或使用代理服务器时,需要在 IP 地址后面加上 :8080。安装Apache Tomcat服务后,默认服务端口为8080。(日后会经常用到。)
5、socket网络通信
对TCP/IP、UDP、Socket编程这些词你不会很陌生吧?随着新时代的发展,越来越多人接触网络,这些专业名词也逐渐被人熟知,这里就不过多解释这些专业名词了(不过大家搜索的时候可以相互对比着搜索,这样了解起来更清晰明了)。
我们直接上才艺,网络通信!网络通信!!既然是网络通信,那肯定得有网络和通信咯,那咱就来搞一个局域网聊天的小脚本。
#server.py import socket host = '127.0.0.1' port = 8082 #AF_INET,还有很多模式,自行手册查找 #通讯方法:数据流式通讯,可以发送文件图片 server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #创建的socket对象绑定到这个网卡上工作 server.bind((host, port)) server.listen(10) #接收连接,建立一个点对点的连接 client, addr = server.accept() from PyQt5 import QtCore,QtGui,QtWidgets #创建消息循环 while True: #一次性收多少字节 recvmsg = client.recv(1024) str = recvmsg.decode('utf-8') if str == 'q': break print("收到消息"+str) msg = input("回复:") client.send(msg.encode("utf-8"))
(注意:server.py脚本一定要先运行,然后再运行client.py脚本,先有服务器再有用户的哦,就像先有鸡还是先有蛋,科学来讲是先有鸡,但是你认为现有蛋也没错,我为什么再说这些😅 )
#client import socket host = '127.0.0.1' port = 8082 #AF_INET,还有很多模式 #通讯方法:数据流式通讯,可以发送文件图片 client = socket.socket(socket.AF_INET,socket.SOCK_STREAM) client.connect((host,port)) while True: sendmsg = input("发送:") if sendmsg == 'q': break #因为是流式数据,所以需要编码 client.send(sendmsg.encode('utf-8')) msg = client.recv(1024) print(msg.decode("utf-8")) client.close()
6、信息编码
信息编码(Information Coding)是为了方便信息的存储、检索和使用,在进行信息处理时赋予信息元素以代码的过程。即用不同的代码与各种信息中的基本单位组成部分建立一一对应的关系。信息编码必须标准、系统化,设计合理的编码系统是关系信息管理系统生命力的重要因素(摘自百度百科)。
学习Python肯定是要学习编码的,最起码几种平常可见的编码模式咱们得知道ASCII、ANSI、GBK、GB2312、UTF-8、GB18030和UNICODE等
这是我们经常见到的,比如你在一个网页右击检查->选择网络(选择Fetch/XHR更好找)->刷新网页->随机点开一个->content-encoding:便是编码格式。
编码格式对我们有什么影响呢?当你打开一个文本发现里面的字你完全不认识,甚至是一串xe7\x95\x8c乱码,这说明你打开方式不对,当然,不是说你不能双击打开的问题,而是打开的编码格式有问题。举个例子就可以轻松明白了,当你更改.doc为.txt时你会发现文档内容变化了。
上下区别便是编码解码在其中作怪
话不多说,上才艺,直观感受一下
str = "你好世界" #编码->二进制 str1 = str.encode("utf-8") print(str1) #解码->utf-8->文字 str2 = str1.decode("utf-8") print(str2) #b'\xe4\xbd\xa0\xe5\xa5\xbd\xe4\xb8\x96\xe7\x95\x8c' #你好世界
既然信息编码这么好玩,那我们是不是可以做一套属于自己信息,只有我们自己能破开这段编码。🎉🎉恭喜你,你也有大帝之姿啊,当年恺撒大帝也是这么想的,一种最早的加密技术应运而生。
#凯撒密码:明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。 #例如,当偏移量是4的时候,所有的字母A将被替换成E,B变成F,以此类推。 grapheme = "abcdefghigklmnopqrstuvwxyz" #加密函数 def encrypt(str, key): s = "" for c in str: if (grapheme.index(c) + key) > 24: s = s+ grapheme[grapheme.index(c) + key - 25] else: s = s + grapheme[grapheme.index(c) + key] #print(s) return s a = "abcdefghigklmnopqrstuvwxyz" d = encrypt(a,4) print(d) #结果:efghigklmkopqrstuvwxyabcde
7、Python加密解密(可选)
到最后咯😁,这一块内容属于选择性内容,因为未来用上的概率真的不大,对密码学有兴趣的可以了解一下。
AES加密,用的是第三方模块 pycryptodome
安装:pip install pycryptodome -i https://pypi.douban.com/simple
密码学是个很神秘的学术,晦涩难懂,但其安全性却格外重要,自己了解了解就行,很刑的!(顺道加一句,爬虫其实也很刑的🤣)这里不过多解释,如果有人好奇推荐一本书可以自行去淘宝购买:python密码学编程。
from Crypto.Cipher import AES from base64 import b64decode,b64encode BLOCK_SIZE = AES.block_size #不足BLOCK_SIZE的补位(s可能是含有中文,而中文字符utf-8占3个字节) pad = lambda s:s+(BLOCK_SIZE - (len(s.encode())) % BLOCK_SIZE)* \ chr(BLOCK_SIZE - len(s) % BLOCK_SIZE) #取出补位,ord用于获取ASCII给定字符的值 unpad = lambda s: s[:-ord(s[len(s) - 1:])] class AES_: def __init__(self,secret_key): self.key = secret_key#密钥 #self.offset = 'dMitHORyqbeYVE0o' #偏移量可以在new中添加,pycharm写上这个函数的时候会出现vi变量,使用即可,自行加入调试 def encrypt(self, text): ''' 先补位,在aes加密,然后再base64编码 :param text:需要加密的明文 :return: ''' #print(text) text = pad(text) text = pad(text).encode() cipher = AES.new(key=self.key.encode(),mode=AES.MODE_ECB) encrypted_text = cipher.encrypt(text) #print(text) #进行64位编码,返回得到加密后的bytes return b64encode(encrypted_text).decode('utf-8') def decrypt(self, encrypted_text): ''' 解密:偏移量位key[0:16];先base64解,在AES解密 :param encrypted_text:已加密的秘闻==密文 :return: ''' encrypted_text = b64decode(encrypted_text) cipjer = AES.new(key=self.key.encode(),mode=AES.MODE_ECB) decrypted_text = cipjer.decrypt(encrypted_text) return unpad(decrypted_text).decode('utf-8') aes = AES_("http://blog.csdn.net/qq_43604989")#32位key str = aes.encrypt("fsdfsdsdsdssssssssssssssssssssssssssss")#加密 print(str) print(aes.decrypt(str))#解密 #结果:6BGYivCsoqiGLTXE/DXBlYEGfYt+pp7INDpaxHnfriF6qRwUE85nYXnT3j1mXA/7bFO2VzeSLH+xT3pAhO9b0g== #fsdfsdsdsdssssssssssssssssssssssssssss
提示:以上是本篇文章正文内容,上面案例仅供参考
#Python#