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


2021-01-16鱼鱼