python作为一门解释性语言,语法简洁,上手较快,且第三方库较多,可以让设计者更专注于其代码逻辑和功能的设计。本贴描述的学习线路共分为以下几个部分:
1.python语言入门
这部分总结笔者自身的python学习路线,由于网上python学习资料较多,本贴不再重复罗列,而是进行合理推荐,同时,笔者更注重python语言在实际工程项目中的应用,所以把一些常用的模块使用方法进行总结,以代码的形式简单阐述。
首先,推荐两个比较不错的python自学网站:
菜鸟教程:https://www.runoob.com/python3
w3school:https://www.w3school.com.cn/python/index.asp
个人感觉第一个菜鸟教程上讲解的比较简单也比较基础,容易上手,笔者当时是花了差不多三天时间简单入门。初学者建议使用sublime text3编辑器,一款轻量级但对python友好。
学习语言主要还是看应用,笔者参与过大大小小各种python项目应用,细心总结提炼出常用模块使用方法,模块相关问题的解决方法等,且者配有使用案例,在新的项目开发中只需简单调用作适当修改即可,比较省时省力,它们是(不断更新中):
argparse
getopt
ast
atexit
autogui
crawler
csv
gitpython
json
pickle
pyqt5
logger
matplotlib
numpy
mysql
pandas
pyinstaller
re
redis
scikit-learn
scipy
smtp
snownlp
zipfile
以csv模块为例,首先会讲解csv文件的基本读、写操作,同时还提供了常见的csv文件中文乱码问题的解决方案,这些都是笔者实际项目中遇到的问题,csv文件demo代码如下:
#! /usr/bin/python3
# -*- encoding:utf-8 -*-
'''
this is a csv module usage
'''
import csv
'''
关于CSV文件中文乱码的问题,一般我们喜欢用UTF-8来存储,这里一定要选择带bom格式的UTF-8
因为Excel在读取csv的时候是通过读取文件头上的bom来识别编码的,如果文件头无bom信息,则默认按照unicode编码读取。
而我们生成csv的平台不一定遵循微软的bom协议,导致如果输出非unicode编码的csv文件(例如utf-8),
并且没有生成bom信息的话,Excel自动按照unicode编码读取,就会出现乱码问题了。
'''
# 写文件:
csvfile = open('test.csv', 'w', encoding='GBK', newline='')
writer = csv.writer(csvfile)
# 写入头
writer.writerow(['序号', '角色', 'QQ昵称', '群昵称', 'QQ号', '性别', 'Q龄', '入群时间', '等级', '积分', '最后发言'])
# 写入内容
writer.writerow([43, "普通用户", "XXXX", "752138607", "男", 13, "2020-05-27 17:46:43",2,6,"2020-06-20 00:10:05"])
# 关闭文件
csvfile.close()
with open('test.csv', 'r', encoding='GBK') as csvfile:
reader = csv.reader(csvfile)
for row in reader:
print(row)
2.python应用
有了语言基础,就可以根据实际工作需要选择一个方向继续下去,笔者总结了python语言在数据采集(网络爬虫)、经典数据分析处理(分类、聚类、回归、降维)、机器学习(深度学习、强化学习)、自动化运维等领域的应用。
笔者最早涉及的是python爬虫领域,当时只是觉着好玩,研究不同类型网站的爬取方法,公众号文章、某群成员信息等,当时爬的最多的是妹子图网站(各位看官先不要着急,代码已入库,下面会给出路径),后来笔者由于职业规划,选择了人工智能方向,于是先后学习了数据分析、机器学习等相关知识,依稀记得当时学的机器学习必修课MNIST数字手写体识别教程,一位日本工程师写的《python深度学习-鱼书》,再到后来如tensorflow应用相关、与此同时,理论基础也要有,又顺次补充了《机器学习-西瓜书》、《统计学方法》等,一路走来,代码实践从未停止过,算法这东西还是要自己亲自实践一下,理解的才更深刻,于是形成目前作者整理的python资料库,我称之为workbench,即工作台的意思,平时项目开发也会基于这个工作台进行,它作为一个知识库,可以给我更多的参考,当然,我也在不断完善它。现在我把它分享给大伙,希望能帮助到更多朋友。目前该仓库有同步在gitee和github上,路径如下:
https://gitee.com/brainternet/workbench.git
https://github.com/brainternet/workbench.git
爬取煎蛋上妹子图的代码如下(仓库路径为workbenchmodulescrawlerjandan_spider_bs4
jandan_spider.py)
#! /usr/bin/python3
# -*- encoding:utf-8 -*-
import os
import sys
requirements = ['requests', 'beautifulsoup4', 'argparse']
site_packages = os.popen("pip list").read().split()
#print(site_packages)
for package in requirements:
if not package in site_packages:
cmd = r'pip install ' + package
print(cmd)
os.system(cmd)
#sys.exit()
import requests
from bs4 import BeautifulSoup
import argparse
import ast
import atexit
parser = argparse.ArgumentParser(description='Spider for jiandan.net')
parser.add_argument('--page', dest='page', action='store', default=5, type=int, help='max page number')
parser.add_argument('--dir', dest='dir', action='store', default='images', help='the dir where the image save')
args = parser.parse_args()
page = args.page
_dir = args.dir
if not os.path.exists(_dir):
os.mkdir(_dir)
headers = {'referer': 'http://jandan.net/',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0'}
image_cache = set()
if os.path.exists(".cache"):
with open('.cache', 'r') as f:
image_cache = ast.literal_eval(f.read(-1))
@atexit.register
def hook():
with open('.cache', 'w+') as f:
f.write(str(image_cache))
index = len(image_cache)
# 保存图片
def save_jpg(res_url):
global index
html = BeautifulSoup(requests.get(res_url, headers=headers).text, features="html.parser")
for link in html.find_all('a', {'class': 'view_img_link'}):
if link.get('href') not in image_cache:
with open(
'{}/{}.{}'.format(_dir, index, link.get('href')[len(link.get('href')) - 3: len(link.get('href'))]),
'wb') as jpg:
jpg.write(requests.get("http:" + link.get('href')).content)
image_cache.add(link.get('href'))
print("正在抓取第%s条数据" % index)
index += 1
if __name__ == '__main__':
url = 'http://jandan.net/ooxx'
for i in range(0, page):
save_jpg(url)
ahref = BeautifulSoup(requests.get(url, headers=headers).text, features="html.parser").find('a', {'class': 'previous-comment-page'})
if ahref is None:
print('no more page')
exit(0)
else:
url = "http:" + ahref.get('href')
大家可以尝试着运行一下,这里就不贴图了。
由于笔者个人时间和精力有限,虽然很用心地总结梳理,仍有疏漏之处,望各位看官谅解。