Python语言作为“胶水语言”,简单易学,开发周期快,功能和扩展性强大,类库丰富。只依赖一门Java并不适用于所有情况,譬如快速开发一次性脚本(修复数据),通过使用Python效率更高,本篇文章旨在介绍本人快速入门Python的一些tips。注意,一些Python的基本语法在此不予介绍,推荐前往廖雪峰的博客查看,博客基于Python3.8版本。关于编译器等配置内容参考PyCharm帮助文档。
环境搭建和下载安装
从Python官网下载Python并安装,配置环境变量,安装PyCharm(这里 我们使用它作为IDE),这里略过。
依赖管理:Pip和Pipenv
pip是python的包管理与安装工具,当你安装python后,pip也会随之被安装。Pipenv是基于Pip的依赖包管理,通过pipfile管理python程序的依赖,有点类似maven。其他还有Virtualenv,此处先不讨论。
site-packages
简单介绍下site-packages,site-packages是python使用pip下载第三方模块的统一存档,在python代码中使用import时,site-packages的目录会成为其中一个被搜索的path。对,有点类似于maven的local仓库。
安装pipenv和配置源
在配置过python后,确认下已经能使用pip:
$ pip --version
pip默认的源为 https://pypi.org ,国内会比较慢甚至超时,可以切换成阿里的镜像源 http://mirrors.aliyun.com/pypi/simple ,直接在install时添加 -i [源地址]即可,也可以创建 用户目录/pip/pip.ini并配置:
[global] index-url = https://mirrors.aliyun.com/pypi/simple/ [install] trusted-host = https://mirrors.aliyun.com # trusted-host 此参数是为了避免麻烦,否则使用的时候可能会提示不受信任
随后便可通过pip安装pipenv:
$ pip install --user pipenv
--user是指为当前用户安装。
为项目配置使用pipenv
在安装Pipenv后,我们需要确认pipenv的位置,可以输入如下命令:
py -m site --user-site
cmd会返回site-packages的目录,一般是 用户目录\AppData\Roaming\Python\Python39\site-packages,将其中的site-packages替换为Scripts得到的目录下,即有可执行的pipenv.exe。当然为了让Pycharm自动检测到目录,也可以直接将Scripts目录设置为PATH环境变量。
直接通过Pycharm创建新项目,如下图,选择Python和上面得到的Pipenv excutable路径,点击Create创建
语法规则
捡些碰到的说。
module和类、方法定义
Python的代码写在.py扩展名的文件中,每一个.py文件就是一个module,文件名为模块名,他可以包含函数、类和变量和可执行代码。而引入module的方式也很简答,像Java一样使用import语句。我们引入的类库也是一个个模块。
Python语言可以是面向对象的,也可以是面向过程的。在Python中可以很轻松的定义一个类,譬如:
user.py
class User: """一个简单的类实例""" # id id = 0 # 用户名 name = "" # 组织编号 orgId = 0
类中也可以定义方法等。当我们引入此类并创建对象时,只要:
import user auser = user.User() auser.id = 1 auser.name = "小明"
像上文中使用auser作为变量确实不大雅观,但是直接将变量名取为user又会有冲突,这时可以对变量起别名:
import user as usermodule user = userusermoduleUser() user.id = 1 user.name = "小明"
其实之所以产生这种混淆,是因为module在实例化后(import后),其本身就是一个模块对象,用法同对象。
方法的定义也很简单,如下展示了一个简单的md5编码的方法:
def buildToken(seed, uid): key = seed + str(uid) md5 = hashlib.md5() md5.update(key.encode(encoding='utf-8')) token = md5.hexdigest() return token
f-string
在3.6版本有的新特性,可以非常方便的格式化一个字符串,算是新版本提供的一个很香的
word = 'python' print(f'hello,{word}') #>>> hello,python print(f'hello,{word.upper()}') #>>> hello,PYTHON print(f'1+2 is {1+2}') #>>> 1+2 is 3 #也可以用于多行字符串 print(f"""one two""") #也可以格式化数字,在此不详细赘述 print(f'{123:05}') #>>>00123
想了解比较全面的可以在这篇博客了解。
异常处理
异常处理也与Java类似,Python中大都是非检查异常。
一个简单的异常处理:
try: cursor.execute(sql) results = cursor.fetchall() for row in results: # except Exception as inst: conn.rollback() print(inst, "wrong") finally: print("close ") conn.close()
获取命令参数
若使用Python开发脚本,一般都会附加一些参数,我们可以很方便的获取命令参数数组:
main.py
import sys print('参数个数为:', len(sys.argv), '个参数。') print('参数列表:', str(sys.argv))
当我们执行"py main.py arg1"时,便会输出:
>>>参数个数为: 3 个参数。 >>>参数列表: ['main.py', 'arg1', 'arg2']
注意,第一个参数为文件本身。
一些示例
文件读取和时间格式化处理(处理Nginx日志文件)
想要统计文件,例如依赖nginx的access.log处理指定时间段内的502请求,nginx的日志大致格式如下,自左至右分别是 path 时间 状态码 ip 请求方法 参数:
/api/getUser 2021-01-08T10:38:37+08:00 200 172.201.156.21 GET id=215 /api/login 2021-01-08T10:38:39+08:00 500 172.201.156.21 POST -
需要读取文件和做时间格式化转换:
import time #指定开始时间,进行格式化strptime表示格式化字符串为时间 mktime表示转换为时间戳 startTime = time.mktime(time.strptime("2021-01-08 10:21:31", "%Y-%m-%d %H:%M:%S")) for line in file: i=i+1 logParams = line.split(" ") logTime = time.mktime(time.strptime(logParams[1], "%Y-%m-%dT%H:%M:%S+08:00")) if logTime > startTime and logParams[2] == "502": print(i, logTime) print(line, end='') file.close()
数据库访问和模拟请求
读取数据库的用户数据并模拟cookie请求系统
import pymysql import json import requests #从数据库中读取指定用户的信息 传入userId def getUser(uid): conn = pymysql.connect(host="localhost", user="root", passwd="123456", database="user") cursor = conn.cursor() sql = f'SELECT name,s_id FROM user WHERE id = {uid} ' try: cursor.execute(sql) results = cursor.fetchall() #执行并返回的rows for row in results: fullname = row[0] s_id = row[1] # 打印结果 print(f'查到用户:{fullname} {s_id}') # 进行md5编码生成cookie seed ='123456' key = seed + str(orgId) + str(uid) md5 = hashlib.md5() md5.update(key.encode(encoding='utf-8')) token = md5.hexdigest() cookie = f'uid={uid}; token={token}' print(f'构建cookie {cookie}') # 发起模拟请求 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36", "Cookie": cookie} #脱敏 data = {"uid":uid,"xxx":""} url="xxx" #打印结果 req = requests.post(url, data=data, headers=headers) print(req.status_code) response = json.loads(req.text) print(response) except Exception as inst: conn.rollback() print(inst, "wrong") finally: print("close connect") conn.close() file.close()
部署和执行
在本地通过使用IDE可以很轻松的运行一段Python程序,甚至可以不用配置环境。但是很多情况代码都需要在远端部署和执行,需要借助一些原生命令。
使用native pip/pipres
确保python环境正常,可以执行python和pip命令,并上传.py文件
编写依赖文件requirements.txt,其实我们可以直接使用pipres依照当前目录生成:
#安装pipres 可以根据当前项目的依赖生成以来稳健 pip install pipres #进入项目目录并生成依赖文件 pipreqs ./ --encoding=utf8 #目录下会生成一个requirements.txt 执行install安装依赖 pip install -r requirements.txt
执行程序,假设文件名为main.py:
py main.py
使用pipenv
确保python环境正常,可以执行python和pip命令,并上传.py文件
编写依赖文件Pipfile,并安装pipenv,Pipfile可参考上文的格式:
#安装pipenv pip install pipenv
进入Pipfile目录,并进入目录安装依赖至虚拟环境
pipenv install
进入pipenv项目环境并执行程序
pipenv shell py main.py