20171024
①导入自定义的模块(如类),需要在当前类作导入类的引用声明,如self.tool = tool.Tool()
20171025
①正则表达式:两个<><>之间匹配不到的时候需要考虑换行符的存在,加上.*?即可。
②注意每行代码的缩进。
③中文编码问题:decode('utf-8') decode('gbk')
④文件读写:file=open(文件名,打开格式),file.write()
⑤格式化字符%%,输出%
⑥用于判断的逻辑变量,False True 和0 1 不同
20171026
①写入图片,urlopen,read,write。注意文件名为xxx.jpg
②下载图片的网络响应问题IOError: [Errno ftp error] [Errno 10060]
③os.makedirs创建文件目录,os.path.exists检查是否存在。
④python爬虫实战四心得:给定图片URL抓取图片下载到本地,可行。但比如一个mm的个人网址多个图片抓取就提示10060。
20171027
①尝试列表多个图片URL,抓取导入本地,3个,可行。
②淘女郎mm图片链接 + 上“https:”后,可以实现抓取。多个链接抓取图片实现。
③抓取新的模特的时候,发生错误,'NoneType' object has no attribute 'group'
④第一次尝试为重新执行抓取,因为有时候第一次就会弹出这个错误,有时候是第二次.etc
2017/11/03(之前第一次记录日记丢失,11/06补上)
①获取图片URL有问题,不再继续学习。转爬虫框架和高级工具(库)。
②requests库,requests.post\get\delate\head\options\,cookies,timeout,会话session持久,verify,proxies
③Beautiful Soup库,安装。导入from bs4 import BeautifulSoup。输出.prettify。标签\字符串\注释。
④遍历,直接子(children\contents)\所有子孙(descendants)\内容(strings)\父节点(parent)\s\
兄弟(next_sibling\previous_sibling)\s\next_element\previous
⑤搜索,findall\find\
⑥CSS选择器,标签\类名\ID\组合,注意同一节点中的组合中间不能加空格。
⑦开始学习Xpath,lxml。
2017/11/06
①装机图表,excel VBA函数实现自动更新进程点的颜色。
②在excel打开时自动执行VBA函数代码,目前仅能在thisworkbook下定义函数\直接写代码\新建模块定义函数,然后open事件中call。
③方法二。在对应的sheet的private sub worksheet_Activate代码下,不定义函数,直接写代码,
然后在open中调用sheet3.activate(随后\之前需要activate其他sheet才行)即可。
④条件格式的数据条表达进度百分比,直接“=”会出错。
解决方法:在thisworkbook下定义函数Sheets(3).Range("C16") = Sheets(3).Range("F20")
然后在open中call即可。
⑤冻结窗口的灵活变动。
⑥接着学习xpath语法和lxml解析库。
2017/11/07
①Xpath语法。
②节点关系,父\子\同胞\先辈\后代。
③选取节点。nodenamme(节点名称)、/(直接子元素)、//(所有元素)、.(
选取当前节点)、..(当前节点的父节点)、@(属性)。
④谓语,在[]中。
⑤*表示任意匹配。
⑥运算符。
①phantomjs工具,浏览器引擎。运行失败 can't open文件。
②Selenium,自动化测试工具,驱动浏览器/PhantomJS,支持python。
③用python写selenium去驱动phantomjs来模拟浏览器爬虫。
④关于浏览器driver的问题,重启/添加具体路径
webdriver.Chrome("C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe")
2017/11/08
①团建影片记录,寻找PPT模板/AE模板,知乎资源海量。
2017/11/09
①合同审批核准流程。询问IE孙木。
②AE模板制作团建影片,可以简单更换图片、文字。
③AE输出文件太大,AVI格式,需要下载media encoder。
④selenium模拟输入、搜索,封装。
⑤AE模板研究,能操作进程(一个模板分为几大进程)、文字(大小、格式、位置)、图片(更换、修改)、
背景音乐(添加到下方播放条)。
⑥第一个团建影片建立完成。
2017/11/10 周五
selenium总结
①获取 .find_element_by_id/name/tag_name/xpath
②输入 .send_keys()
③模拟点击 .send_keys("and some",Keys.ARROW_DOWN)
④清除文本 .clear()
⑤下拉选项卡 select_by_index/visible_text_value Select(driver.find_element_by_name("选项卡名称"))
取消 deselect
提交 .click()/submit()
⑥元素拖拽 ActionChains.drag_and_drop(element,target).perform()
⑦页面切换 .switch_to_window("windowName/framename.0.child")
⑧弹窗 driver.switch_to_alert()
⑨等待时间 WebDriverWait(driver,10).until()
driver.implicitly_wait()
PyQuery总结
①初始化 import后pq(代码/URL/文件)
②属性操作 p.attr("id","xx")
③遍历 .items
④网页请求 pq("url")
爬虫框架PySpider和Scrapy
PySpider
主要架构:scheduler(调度器),fetcher(抓取器),processor(脚本执行)
可灵活使用各种python库对页面进行解析
2017/11/13 周一
Scrapy学习
主要组件:引擎scrapy、调度器scheduler、下载器downloader、爬虫spiders、项目管道pipeline
下载器中间件、爬虫中间件、调度中间件。
过程: ①scrapy从scheduler取出url,封装成request请求,传给downloader
②downloader下载页面,封装成应答包response,传给spiders
③spiders解析response,若是item,交给pipeline
若是URL,交给scheduler
2017/11/14 周二
试运行PySpider,提示HTTP 599: SSL certificate problem: self signed certificate in certificate chain
解决方法:在crawl中加入忽略证书验证的参数,validate_cert=False。
2017/11/15 周三
①PySpider的运行 cmd启动,端口运行,打开 http://localhost:5000 ,进入PySpider的界面
②PySpider代码,较多新内容。
③多线程和多进程
多线程的缺点:拿到GIL的CPU才能运行线程,多个核竞争一个GIL导致线程颠簸,效率更低。(不同代码块交替执行)
多线程运行同一代码块,会出现线程不同步,比如12112。
改进:python的Queue模块,能够实现线程间的同步。
多进程:每个进程有各自独立的GIL。(不同代码块同时执行)
④多线程:直接利用函数创建多线程:
thread.start_new_thread(print_time, ("Thread-1", 2,))
thread.start_new_thread(print_time, ("Thread-2", 4,))
使用Threading模块创建线程,直接从threading.Thread继承,然后重写init方法和run方法
⑤线程同步:(类似GIL的用途),访问共享数据必须的锁,唯一,有锁才能访问。
2017/11/16 周四
多进程(python包:multiprocessing)
①多进程能够充分利用多核CPU的资源,单进程转并发执行。
Process([group [, target [, name [, args [, kwargs]]]]])
②多进程也会出现 “互斥”的现象,需要类似GIL的lock避免同时访问临界资源(如print)而出问题。
2017/11/17 周五
①Semaphore信号量,控制临界资源的数量
②Queue队列,用于进程间的通信。
③Pipe管道
④Pool进程池,分为阻塞和非阻塞。
ADSL
代理过程:每拨号一次,IP更换。通过动态域名解析和端口映射,SSH连接。
爬虫第一次总结:
先是简单了解爬虫这个概念,入门爬虫的获取网页代码是urllib和urllib2,Request/urlopen
入门匹配是正则表达式(.*?)
了解cookie的用途
之后学习了入门的几个例子,获取贴吧内容,只看楼主,忽略图片,去掉多余的HTML符号,输入一次弹出一楼帖子
写入本地文件夹,获取帖子标题,添加分隔符。
接着学习图片链接的打开,urlopen/read/write即可,目录的新建和检测。
然后接触爬虫的高级库和工具,主要有Requests库/Beautiful Soup库/Xpath语法、lxml库/PhantomJS浏览器引擎/
Selenium库,用于页面交互/
PyQuery库
最后学习了两个爬虫框架,Scrapy和PySpider。
①PySpider上手简单,操作更加简单,配有WEB界面,集成了phantonjs。
②Scrapy自定义程度较高,适合学习研究。
2017/11/20 周一
①食谱PPT排列logo像素。
②学习VBA写条件格式。
③PS图像像素处理。
2017/11/21 周二
①excel VBA cells(x,y) x代表行,y代表列。
②VBA中语法不同于excel,类似一般的程序语言。
③尝试修改excel条件格式,使得整数变红,找不到解决方法。直接输入整数替换可以变色。
2017/11/21 周三
爬虫入门经验学习
①python基本功:list/dict/切片/if/for/while/文件读写操作
②网页的基本知识:基本的HTML语言知识,href等
网站的发包和守包概念
动态网页JS知识
③分析语言:正则表达式
XPATH(bookstore//book),抓取框架化,能轻松寻找指定的元素,适合复杂页面
Beautifulsoup美丽汤模块,遍历、解析,适合简单页面
④高效的辅助工具:F12开发者工具
抓包工具httpfox
Xpath Checker火狐插件,xpath测试工具
正则表达式测试工具http://tool.oschina.net/regex/
⑤模块:urllib
urllib2
requests(负责连接网络,处理http协议)
⑥爬虫框架:scrapy
⑦动态页面:selenium
phantomJS(不显示网页的selenium)
⑧反爬虫策略验证码:PIL
opencv
pybrain
打码平台
⑨数据库:mysql
mongodb
sqllite
⑩数据分析:numpy,类似matlab的模块
pandas,基于numpy的数据分析模块
进阶技术:多线程
多进程
分布式
程序员宅基地爬虫入门总结
①URL:统一资源定位符,http,ftp,file等
URI:统一资源标识符,web资源,如HTML,图像,视频,程序等
URL是URI的子类。
2017/11/23 周四
①urllib2,获取网页用Request
发送data,可以编码urllib.urlencode,然后post/get,两者区别在于添加的位置不同
Headers设置,模拟浏览器
②http获取异常和状态码
HTTPError是URLError的子类
HTTPError状态码分为5种类型:200/201/202/204表示请求成功
300/301/302/304表示重定向等
400非法请求/401未授权/403禁止/404没有找到
5XX服务器出现错误
两种测试Error方法:先except HTTPError再except URLError,(先确定发生error的具体状态码,再确定大体上的reason)
(父类的异常先写到子类异常的后面,如果子类捕捉不到,则到父类)
except URLError,if hasattr(e,'code')hasattr属性对e进行判断
④opener与handler
urllib2的两个方法:geturl获取重定向的url,info返回页面情况
Openers和Handlers
⑤urllib2的技巧
proxy/timeout/header/redirect/cookie/put/referer
Scrapy爬虫框架中文介绍
看不懂,哈哈
2017/11/24 周五
用爬虫能干嘛
1.爬取数据,进行市场调研和商业分析。
爬取知乎优质答案,为你筛选出各话题下最优质的内容。
抓取房产网站买卖信息,分析房价变化趋势、做不同区域的房价分析。
爬取招聘网站各类职位信息,分析各行业人才需求情况及薪资水平。
2.作为机器学习、数据挖掘的原始数据。
比如你要做一个推荐系统,那么你可以去爬取更多维度的数据,做出更好的模型。
3.爬取优质的资源:图片、文本、视频
爬取知乎钓鱼贴\图片网站,获得福利图片。
学习过程:
1.了解爬虫的基本原理及过程
发送请求——获得页面——解析页面——抽取并储存内容
2.Requests+Xpath 实现通用爬虫套路
对于异步加载的网站,可以学习浏览器抓包分析真实请求或者学习Selenium来实现自动化
3.了解非结构化数据的存储
文档形式,存在 本地 or 数据库
text/csv
爬取的数据要进行预处理,去掉多余的空格\标签\换行符
4.学习scrapy,搭建工程化爬虫
便捷地构建request
强大的 selector 能够方便地解析 response
超高的性能,可以将爬虫工程化、模块化
5.学习数据库知识,应对大规模数据存储与提取
MongoDB
可以利用PyMongo,更方便地在Python中操作MongoDB
数据如何入库、如何进行提取
6.掌握各种技巧,应对特殊网站的反爬措施
反爬:被网站封IP、各种奇怪的验证码、userAgent访问限制、各种动态加载、异步加载等等。
技巧:访问频率控制、使用代理IP池、抓包、验证码的OCR处理等等。
7.分布式爬虫,实现大规模并发采集,提升效率
Scrapy + MongoDB + Redis 利用多线程的原理让多个爬虫同时工作
Redis 则用来存储要爬取的网页队列
xpath语法适合通用,按F12检查列出的标签列表就能写xpath,
比bs4好的一个地方在于:不用一层层检查元素代码
获取网页后需要使用lxml的etree库,etree.HTML()初始化
①//获取所有
②/获取子元素
③//@class获取属性
④对比,//@class=“xxx”返回true or false
⑤//*[@class=“xxx”] 获取属性为xxx的元素
⑥//xx/text获取xx标签的text内容
⑦xpath得到的结果是list,[xxx,xxx,...]
⑧此外,xpath搜索到的元素是list生成器,<Element span at 0x26744e0>
需要作字符串转换,etree.tostring()
学习该段爬虫经验:
①代码开头需要表明编码:# -*- coding:utf-8 -*-
②输出编码问题,输出u'xxx',u'xxx',...等时,可以for逐项输出即可。
③遇到乱码问题,xx.decode('gbk'),不适用于对象为list,只能是str类型
UTF-8:国际编码,包含全球字符
GBK:中国编码,包含全部中文字符
2017/11/17 周一
①爬到的数据存在本地,在写入前,对于每一条评论str(for循环),需要i.encode('utf-8'),
才能write到文件。
②数据前后加上换行符:\n i="\n"+i+"\n"
2017/11/28 周二
①Requests比python自带的urllib/urllib2 更高一阶
正则表达式
常用符号
.:匹配任意字符,换行符\n除外, 类似一个占位符
*:匹配前一个字符0次或无限次
?:匹配前一个字符0次或1次
+:匹配前一个字符1词或无限次
.*:贪心算法,能找到多少是多少
.*?:非贪心算法
\d:匹配数字
[abc]:abc任意一个
{m,n}:匹配前一个字符m到n次
| :匹配|左右任意一个
(.*?) :输出符合条件的,将()里结果返回
scrapy框架学习
①在任意目录下shift右击打开命令窗口,创建项目
②item定义爬取的数据,spider定义初始URL,针对后续链接的规则,从页面中提取数据。
③尝试输出,没有结果
2017/11/29 周三
DOE试验设计 minitab软件学习 课程
2017/11/30 周四
minitab和DOE试验 动手操作
专利idea:曝光机一次曝光四片,UM透镜成本问题
2017/12/1 周五
hardram marking
2017/12/04 周一
周会、曝光机分束器设计、daily meeting会议
2017/12/05 周二
2017/12/06 周三
canon marking
2017/12/07 周四
写专利
2017/12/08 周五
应届生异常单检验
工作学习阶段总结
曝光机学习报告
2017/12/11 周一
2017/12/29 周五
重新开始学习python的scrapy框架。
2018/01/02 周二
scrapy框架
爬之后进行取
XPath 非常强大
在scrapy中提供 XPathSelector 类
2018/01/03 周三
操作xpath,先导入selector类,from scrapy.selector import Selector
用路径表达式抓取,存放到字典item中,
item['title'] = site.xpath('a/text()').extract()
然后return items
最后导出为JSON文件,scrapy crawl dmoz -o items.json -t json
①-o 后面是导出文件名,-t 后面是导出类型。
②extract():返回一个unicode字符串,为选中的数据,re()类似,提取真实的原文数据。
.re()方法返回unicode字符串的列表,无法构造嵌套式的 .re() 调用
xpath()和css()可以,所以extract和re作类比。
xpath()和css()返回一系列的selectors(如果不止一个),表示一系列节点
比如多个title
以上的四个基本方法可以避免每次从response中提取数据生成selector的麻烦。
③获取属性 /@href 和匹配属性 [@href=""]
④框架尝试自定义的网站获取,成功后修改失败,新建project再次成功,初步估计是行距的问题。
⑤使用xpath表达式,print指定内容输出成功。
⑥导出空白,估计是编码格式问题。
2018/01/04 周四
①open 文件后再次修改为print,提示unexpected indent,
找到原因:编辑软件Notepad++有问题,导致行距缩进不一样。
②嵌套selector
③多次浏览,每次有不同的理解。
④目前进度:已能够print在命令行中,接下来需要write到文件中。
2018/01/05 周五
①相对XPaths:即嵌套的选择器中,一开始使用.xpath('//div'),
后续使用divs.xpath('//p')的效果不是//div//p,而是所有的p
解决方法:加点前缀xpath('.//p')
或者提取所有直系结果xpath('p')
②命令行工具、item、spiders、selectors、item loaders
③scrapy shell终端试运行失败
④item Pipeline、Feed exports、Link Extractors、Logging、数据收集、发送email、Telnet终端、Web Service
常见问题、调试Debugging
2018/01/09 周二
①图片管道ImagesPineline/scrapy bench性能测试/暂停、恢复爬虫/架构概览
②Downloader 中间件和Spider中间件
③扩展extensions/核心API
④requests/response请求与响应
⑤设置Setting/信号Signals/异常Exceptions
简单看完一遍,很多概念不懂,需要找实例逐渐深入学习。
继续捣鼓 scrapy的write问题
2018/01/10 周三
①对比CSDN两个例子,能够输出到JSON,需进一步分析。
②修改例子(五)的xpath表达式后,能输出中文到JSON文件。(因为原网页已变化)
与之前不能输出的差异地方:pipeline、setting、编码encode
③没有write输出原因是语法错误!!!
④spider must return request,baseitem,dict or none,got list in
输出错误几个注意的点:选择器Selector不能输出
return与yield有区别,return在返回执行结果同时中断程序执行。
yield不了就for循环yield,因为不能yield一个生成器
具体原因要看命令行!!!
⑤接下来是pipeline和setting的熟悉
pipeline的写入可以在spider中实现,注意不能直接输出list或者selector,只能是
string或者buffer
** 之前没输出的问题:没有看命令行
item要注意导入以及在使用前定义好
⑥使用item输出!
导入并定义好item
赋值给item
line = json.dumps(dict(item))
式中dict() 函数用于创建一个字典。返回一个字典。
dumps是将dict转化成str格式
然后write(line)即可
总结:学会看命令行非常重要!
2018/01/11 周四
自动多网页爬虫 核心是CrawlSpider,主要方法是rules
** shell尚未能够运行
①Spider是爬虫的基类,从网页获取link继续爬取用CrawlSpider类
最大的不同:多了一个rules参数,它包含了一个或多个Rule对象
classscrapy.contrib.linkextractors.sgml.SgmlLinkExtractor
(
allow=(),deny=(),allow_domains=(),deny_domains=(),deny_extensions=None,
restrict_xpaths=(),tags=('a','area'),attrs=('href'),canonicalize=True,
unique=True,process_value=None
)
allow:满足括号中“正则表达式”的值会被提取,如果为空,则全部匹配。
deny:与这个正则表达式(或正则表达式列表)不匹配的URL一定不提取。
allow_domains:会被提取的链接的domains。
deny_domains:一定不会被提取链接的domains。
restrict_xpaths:使用xpath表达式,和allow共同作用过滤链接。
范例 rules = [
Rule(SgmlLinkExtractor(allow=('/u012150179/article/details'),
restrict_xpaths=('//li[@class="next_article"]')),
callback='parse_item',
follow=True)
]
②防止被ban的几大措施:
1. 设置download_delay download_delay = 2
2. 禁止cookies 在settings.py中设置COOKIES_ENABLES=False
3. 使用user agent池 建立user agent池爬取前随机获取,并在setting禁止默认
4. 使用IP池
5. 分布式爬取
③目前能继续获取下一网页的内容进行爬取,yield Request(url, callback=self.parse)
方法二: 利用crawlspider更快捷。
④熟悉shell中
⑤item、pipeline和setting的熟悉
换行符\r\n与\n有区别
\n是换行,英文是New line,表示使光标到行首
\r是回车,英文是Carriage return,表示使光标下移一格
\r\n表示回车换行
items.py:定义item字典 name=Field()
pipelines.py:分别定义函数,创建打开文件、对item处理和写入文件
Item Pipeline负责处理被spider提取出来的item。
典型的处理有清理、 验证及持久化(例如存取到数据库中)
def __init__(self):
self.file = codecs.open('xx',mode='wb',encoding='utf-8')
def process_item(self,item,spider):
line = json.dumps(dict(item))+'\n'
self.file.write(line.decode("unicode_escape))
return item
settings.py:配置文件,主要是至执行对spider的配置
* 一些容易被改变的配置参数可以放在spider类的编写中,
而几乎在爬虫运行过程中不改变的参数在settings.py中进行配置。
比如设置cookies_enabled=False,以防被ban
设置启动的pipeline类和启动顺序
设置要用到字典ITEM_PIPELINES = {
'CSDNBlog.pipelines.CsdnblogPipeline':300
}
其中,key为要启动的pipeline类,value为启动顺序,默认为0-1000。
设置spider所在的路径,SPIDER_MODULES = ['xx.spiders']
⑥shell能运行,少了sel,直接用response即可。
⑦遗留问题:多网页自动爬取输出item key顺序问题。发现原因:dumps函数导致
scrapy入门教程:project的命名问题,命名dmoz,ab之类的project运行提示没有items,
而tutorial则没问题
2018/01/12 周五
遗留问题二:早上又运行了一遍,命名tutorials运行没有问题了。。。
尝试ab,也没有问题,但dmoz项目还是提示没有item
查网页:爬虫的名字跟项目的名字一样,导致最终导入的时候出错
然而修改还是报错。
终于找到原因:spider目录下的.py文件的名字跟项目的名字不能相同!
爬虫指spider目录下的.py文件,项目指spider的识别名称name!
然而以前的有相同的情况也可以运行。
初步认定是project名也是dmoz的原因
①保存数据到文件的编码问题
write(data.decode("unicode_escape"))
import codecs也可以实现
②shell终端:熟悉各个命名的作用
request:最近获取到的页面的Request对象
response:最近获取到的页面的Response对象
fetch:根据给定的url或request更新response对象
③目前进度:如何下载并保存图片,学习爬虫的实例。
2018/01/15 周一
①学习回顾excel的vlookup和数据透视表
VLOOKUP(lookup_value,table_array,col_index_num,range_lookup)
Lookup_value为需要在数据表第一列中进行查找的数值
Table_array为需要在其中查找数据的数据表。
col_index_num为table_array 中查找数据的数据列序号。
Range_lookup为一逻辑值,指明函数 VLOOKUP 查找时是精确匹配,还是近似匹配。如果为false或0 ,则返回精确匹配
数据透视表:插入,添加字段到下方区域,修改字段名称,修改行列标签名称。
扩展:创建组、计算字段
最后修改单元格格式与表格格式即可。
②爬虫运用scrapy的具体例子学习
2018/01/16 周二
①scrapy具体实例,xpath路径问题:避免两个//使用,属于嵌套使用的问题,
或者添加点前缀。
②实例没输出,没提示错误。不使用scrapy框架,而是用PyCharm和urllib库来复习爬虫。
对应xpath的用法:from lxml import etree
html = etree.parse()
sel = html.xpath('//li')
结果没输出
③熟悉中文编码问题
2018/01/17 周三
①中文编码知识:
ASCII字符集:American Standard Code for Information Interchange美国信息交换标准码
用8bit来表示一个字符,总共可以表示256个字符。
英文字母再加一些其他标点字符之类的也不会超过256个,故只支持英文。
GB2312:是对 ASCII 的中文扩展。占两个字节。
一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字。
前面的一个字节(高字节)从0xA1用到0xF7,后面一个字节(低字节)从0xA1到0xFE,
支持6700+汉子。
GBK 标准:GB2312扩展之后的编码方案,之后由于多民族的语言系统,GBK 编码扩充为 GB18030 编码。
Unicode:2-4个字节(16bit)来表示字符,是一个字符集,已经收录136690个字符,并还在一直不断扩张中。
第一步:Unicode是用0至最大值之间的数字来表示所有字符.其中0至127这128个数字表示的字符仍然跟ASCII完全一样.
第二步:怎么把0至最大值这些数字转化成01串保存到计算机中和进行传输。
于是出现了UTF(unicode transformation format),一种编码规则。
有UTF-8:使用1、2、3、4个字节表示所有字符;优先使用1个字符、无法满足则使增加一个字节,最多4个字节。英文占1个字节、欧洲语系占2个、东亚占3个,其它及特殊字符占4个
UTF-16:使用2、4个字节表示所有字符;优先使用2个字节,否则使用4个字节表示。
UTF-32:使用4个字节表示所有字符;
在py2中,有两种字符串类型:str类型和unicode类型,str存字节数据,unicode存unicode数据;
在py3中,也有两种数据类型,str和bytes; str类型存unicode数据,bytes类型存bytes数据
无论py2,还是py3,与明文直接对应的就是unicode数据,打印unicode数据就会显示相应的明文(包括英文和中文)
存到磁盘上的数据是bytes,离计算机更近的数据。
比如
编辑器
当我们保存的的时候,hello.py文件就以pycharm默认的编码方式保存到了磁盘;
关闭文件后再打开,pycharm就再以默认的编码方式对该文件打开后读到的内容进行解码,
转成unicode到内存我们就看到了我们的明文;
解释器
在运行的时候,先解码成unicode,这个过程和编辑器是一样的(解码的时候不是加载到内存,而是在解释器的运行环境内,作string编码),
再译成C代码再转成二进制的数据流,CPU执行数据流后得到结果内容,
然后将内容加载到内存中,被使用的编辑软件显示出来。
解码了的文本只存在运行环境中,如果你需要打印/保存/输出给数据库/网络传递(加载到内存),就又需要一次编码过程
python的编码分为编辑器和解释器。
解释器:py2默认ASCII码,py3默认的utf8
所以,py2有个问题, 它的默认编码是ASCII,想写中文,就必须声明文件头的coding为gbk or utf-8,
声明之后,python2解释器仅以文件头声明的编码去解释你的代码(unicode)并通过CPU执行,
执行结果(声明的utf-8)加载到内存后,并不会主动帮你转为unicode,而py3则会主动转换。
(原因就是默认的编码方式不同,py3是utf8,传达到内存的时候类似编辑器角色,会自动转码unicode)。
也就是说,py2的声明文件编码是utf-8,加载到内存里,你的变量字符串就也是utf-8,
解释的编码方式不同于编辑的编码方式,py2的默认编码是ASCII,在编辑的时候不能将utf8转unicode,会保持utf8。
意味着,你以utf-8编码的文件,在windows的显示软件(如cmd,默认编码方式gbk)会乱码。
2018/1/18 周四
①python给我们提供了一个包codecs进行文件的读取,这个包中的open()函数可以指定编码的类型:
import codecs
f = codecs.open('text.text','r+',encoding='utf-8')
#必须事先知道文件的编码格式,这里文件编码是使用的utf-8
content = f.read()
#如果open时使用的encoding和文件本身的encoding不一致的话,那么这里将会产生错误
f.write('你想要写入的信息')
f.close()
②>>> s
'\xe8\xb7\xaf\xe9\xa3\x9e' #utf-8 (比如CPU运行后的结果)
>>> s.decode('utf-8') (如果解释器默认的编码规则为utf-8,则会自动执行这一步)
u'\u8def\u98de' #unicode 在unicode编码表里对应的位置
>>> print(s.decode('utf-8')) (pirnt的时候输出前要根据显示软件的编码规则对unicode进行编码)
路飞 #unicode 格式的字符
常见编码错误的原因有:
Python解释器的默认编码
Python源文件文件编码
Terminal使用的编码
操作系统的语言设置
2018/01/20 周六
①excel vba函数
range()函数:表示单元格range("A1")而不是range("ij")
表示连续区域range("a1:b4")
表示不连续区域range("a1:b2,c3:b4")
表示行和列range("1:1").select
range("A65536").End(xlUp).Row:表示A列数据区域最后一行的行号。
如果被选中单元格为空,则一直向上走到第一个非空单元格;
如果被选中单元格为非空,则向上走到最后一个非空单元格。
Range("a1").CurrentRegion返回包含指定单元格的当前区域,以空行和空列作外边界。
UBound:Visual Basic 中的一个函数,用来返回数组或元素相应维度的最大值。
2018/01/22 周一
①excel 选取至最后一行:Ctrl + shift + end
②信息不对称,闷声赚大钱。
信息对称的利润透明的行业,只能赚辛苦钱罢了。
③python入门——python基本爬虫——相关库和框架爬虫
python的基础
①元组:不能修改,只能count、index
2018/01/24 周三
①对excel数据的引用直接Sheets("总数据").Range("D" & number)
②if中没有==,一个=即可
③excel 的 VBA,用F8进行debug
④字典的定义:Dim dic As Object和Set dic = CreateObject("Scripting.Dictionary")
2018/01/25 周四
①If Not dic.exists(TagName) Then
判断excel VBA中是否存在key,有则返回true
InStr()也可判断
②字典的用法:Add方法: object.Add (key, item)
Exists方法:object.Exists(key)
Keys方法: object.Keys( ),返回一个数组包含了一个 Dictionary 对象中的全部现有的关键字
Items方法: object.Items( ),包含了一个 Dictionary 对象中的所有项目。
Remove方法:object.Remove(key)清除一个关键字,项目对。
RemoveAll方法:object.RemoveAll( )清除所有的关键字,项目对。
Key属性: object.Key(key) = newkey
Item属性: object.Item(key)[=newitem]
③运行时错误457:该关键字已经与该集合的一个元素相关联
原因:dic.Add "TagName", "TotalTime" 双引号有问题。去掉即可。
④Range("b2:c4").Resize(1, 1)重新定义区域,第一个1表示行,第二个表示列。
如果省略该参数。则该区域中的列数保持不变。
⑤输出到单元格时,明确字典item的维度和长度,进行行列数的resize
⑥VBA画图:设置XY轴,设置轴称,待进一步学习。
2018/01/26 周五
①VBA画图:Sheets("报表").Shapes.AddChart2(201, xlColumnClustered).Select 添加chart
ActiveChart.SeriesCollection.NewSeries 必须的语句,新建系列必须
ActiveChart.FullSeriesCollection(1).Values = "=报表!$A$2:$G$2" 指定Y轴数据
ActiveChart.FullSeriesCollection(1).XValues = "=报表!$A$1:$G$1" 指定X轴数据
其中 chart的类型由xlColumnClustered(柱形图)指定,201可删(有201的时候,addchart后可加上2)。
xlLine 折线图
xlPie 饼图
xlXYScatter 散点图
select(.chart也可)的角色很重要。
用 Shapes 集合的 AddChart 方法会传回Shape对象。
Shape对象并沒有SetSourceData方法可用,所以会出错。
若新增的Shape对象被选取,且该对象是透过AddChart方法产生,则ActiveChart会抓到该对象子层的Chart对 象,如此就可使用Chart对象的SetSourceData方法。
添加标题项:定义hastitle后赋值axistitle.txt即可
②两组数据的字典存放和画图问题
定义一个数组arr进行存放和更新,然后再赋值数组给字典
dic.Item(TagName) = arr
关于多维字典输出到单元格:一般先提取items给一个数组,数组的每一项再赋值给另一个数组,多个循环输出给新数组的元素直接resize输出单元格。
或者,转置输出,resize单元格的大小即可
③同一个chart不同的图表
字典值的运算问题
2018/01/27 周六
①同一个chart不同的图表:利用录制宏,制作组合图表即可。
字典值的运算问题:定义数组赋值给item,更新时先取出到数组,进行运算,然后再赋值给字典item
2018/01/28 周日
① PDF转EXCEL,先解密然后转换,在线网页。
② excel函数:rows()返回区域的行数 row()返回单元格所在行数
countif(range,criteria)对指定区域中符合指定条件的单元格计数
③cells与range()行列位置不同
④单元格.Interior.ColorIndex颜色值
⑤用数字表示行列只能用Cells()
⑥日期的间距与天数加减1的关系
2018/01/29 周一
请假
2018/01/30 周二
看python的基础知识介绍
①列表
切片(取)/追加append/插入insert/修改/删除del/扩展extend/拷贝copy/统计count/排序sort/位置index(第一个)
②元组(不可修改)
count/index
③字符串操作
.find('')查找,第一个
④字典
增加/修改/删除pop del popitem/查找'' in 、get或者key(不存在会报错)/嵌套
2018/02/06 周二
字符编码问题
①在python2中,有两种字符串类型:str类型和unicode类型;str类型存字节数据,unicode类型存unicode数据
在python3中,也有两种数据类型:str类型和bytes类型; str类型存unicode数据,bytse类型存bytes数据
3与py2比只是换了一下名字而已。在程序运行时存在内存地址的数据类型,要具体分析对应的字符串类型的名字。
②unicode转换成字节数据,需要编码规则。
2018/02/07 周三
对于编码问题,搞明白,字符串str是什么编码,看str是bytes字节还是unicode数据
字节bytes: 计算机数据的表示。
字符unicode:英文字符“abc”,或者中文字符“你我他”。
解码了的文本(unicode)只存在运行环境中,而文件或者网页是字节流bytes的。
2018/02/08 周四
文件开头的编码声明:代表解释这个代码的程序 以什么编码格式 把这段代码读入到内存,
因为到了内存里,这段代码其实是以bytes二进制格式存的,
即使是2进制流,也可以按不同的编码格式转成2进制流。
bytes(封装过的二进制格式) = 不同类型的编码规则
bytes(封装过的二进制格式) = 可存入内存
bytes(未封装过的二进制格式)= 硬盘储存
python为了让你能对数据进行操作而在内存级别又帮你做了一层封装
区分该python版本的str是什么类型,unicode 还是 bytes,在该文本程序里,定义的str就是以程序右下方的
编码格式,转换成二进制格式bytes,然后存入内存中。
bytes类型的str输入时就转换了,而unicode的str则在存入内存时(比如保存文件)转换。
而python解释器运行代码的时候,如果不在文件头声明格式,会以python该版本默认的编码格式去处理这段代码。
python2里的str就是bytes, py3里的str是unicode
①函数的概念:函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可
形参和实参的区别
局部变量和全局变量
匿名函数lambda x:x**2,[1,5,7,4,8]
函数式编程:把运算过程尽量写成一系列嵌套的函数(数学中的函数)调用
高阶函数:一个函数就可以接收另一个函数作为参数
内置函数
②迭代器&生成器
列表生成式:a = [i+1 for i in range(10)]
生成器:generator 把一个列表生成式的[]改成()
把print(b)改为yield b
迭代器:Iterable对象:可作用于for循环的对象
Iterator: 可以被next()函数调用并不断返回下一个值的对象称为迭代器
Iterable转为Iterator:iter()函数
在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。
2018/02/10 周六
新模块——验证模块的添加:装饰器
①定义新函数 def login()
②把需要验证的函数名func当做一个参数传给 验证模块
login(america)
③不改变原调用方式
america = login(america)
america()
或者,在你要装饰的函数上面加上@login
④不触发函数的执行,只需要在这个login里面再定义一层函数
def login(func): #把要执行的模块从这里传进来
def inner():#再定义一层函数
pass
return inner#用户调用login时,只会返回inner的内存地址,下次再调用时加上()才会执行inner函数
⑤此外,要传参数时,在inner()加个参数,调用函数的时候会调用inner,把参数传进去。
login()内也可加参数
2018/02/11 周日
软件目录结构规范
1.bin/: 存放项目的一些可执行文件,当然你可以起名script/之类的也行。
2.foo/: 存放项目的所有源代码。(1) 源代码中的所有模块、包都应该放在此目录。不要置于顶层目录。(2) 其子目录tests/存放单元测试代码; (3) 程序的入口最好命名为main.py。
3.docs/: 存放一些文档。
4.setup.py: 安装、部署、打包的脚本。
5.requirements.txt: 存放软件依赖的外部Python包列表。
6.README: 项目说明文件。
2018/02/14-2018/02/19 回家过年
2018/02/20 周二
@函数名 是python的一种语法糖
①执行w1函数,并将 @w1 下面的 函数 作为w1函数的参数,即:@w1 等价于 w1(f1)
②将执行完的 w1 函数返回值赋值给@w1下面的函数的函数名
正则表达式几个常用的格式
①(re):匹配括号内的表达式,也表示一个组
②[...]:匹配其中任意一个
③\d:匹配一个数字字符,等价于 [0-9] \S:匹配任何非空白字符,\w:匹配包括下划线的任何单词字符
④re{n}:精确匹配n个前面表达式。
{n}
重复n次
{n,}
重复n次或更多次
{n,m}
重复n到m次
⑤re{n,m}:匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式
⑥\.:正常情况下.是可以匹配除\n外所有的字符,\转义之后让他失去原有的功能,只匹配一个.
⑦r"":表示原生字符串,不需加转义字符\
⑧ * 重复零次或更多次
+
重复一次或更多次
?
重复零次或一次
⑨'(?P<name>...)':分组匹配,组名为name,用于分组输出m.group('name')
对于分组匹配,.group()=.group(0) 组数从1开始
2018/02/21 周三
常用模块学习
time & datetime模块
random模块
①chr()返回数字对应的字符
②str()转为字符串
OS模块
提供对操作系统进行调用的接口
sys模块
shutil 模块
高级的文件、文件夹、压缩包 处理模块
json & pickle 模块
①json,用于字符串(所有程序语言都认识的) 和 python数据类型间进行转换
②pickle,用于python特有的类型 和 python的数据类型间进行转换
shelve 模块
将内存数据通过文件持久化的模块
xml处理模块
PyYAML模块
处理ymal文档格式
ConfigParser模块
用于生成和修改常见配置文档
hashlib模块
用于加密相关的操作
Subprocess模块
logging模块
五个日记级别
debug()详细信息,只有在诊断时才有意义
info() 确认事情按计划进行
warning() 出现了一些意外或将会出现问题,软件仍如期运行
error() 由于更严重问题导致一些功能不能执行
critical() 程序不能继续运行
四个主要类
logger:提供了应用程序可以直接使用的接口;
handler:将(logger创建的)日志记录发送到合适的目的输出;
filter:提供了细度设备来决定输出哪条日志记录;
formatter:决定日志记录的最终输出格式。
re模块
①re.match 从头开始匹配
②re.search 匹配包含
③re.findall 把所有匹配到的字符放到以列表中的元素返回
④re.splitall 以匹配到的字符当做列表分隔符
⑤re.sub 匹配字符并替换
面向对象学习
面向过程编程(Procedural Programming)
思路:程序一开始的大问题,分解成很多个小问题或子过程,在执行的过程再继续分解直到简单范围内解决。
面向对象编程
①Class 类
一个类即是对一类拥有相同属性的对象的抽象、蓝图、原型。
在类中定义了这些对象的都具备的属性(variables(data))、共同的方法
②Object 对象
一个对象即是一个类的实例化后实例,一个类必须经过实例化后方可在程序中调用,
一个类可以实例化多个对象,每个对象亦可以有不同的属性,就像人类是指所有人,
每个人是指具体的对象,人与人之前有共性,亦有不同
③Encapsulation 封装
在类中对数据的赋值、内部调用对外部用户是透明的,这使类变成了一个胶囊或容器,
里面包含着类的数据和方法
④Inheritance 继承
一个类可以派生出子类,在这个父类里定义的属性、方法自动被子类继承
⑤Polymorphism 多态
多态是面向对象的重要特性,简单点说:“一个接口,多种实现”,指一个基类中派生出了不同的子类,
且每个子类在继承了同样的方法名的同时又对父类的方法做了不同的实现,
这就是同一种事物表现出的多种形态。
2018/02/22 周四
面向对象编程介绍
引入——编程原则①写重复代码是非常不好的低级行为 ——函数的出现能解决重复代码的问题,然而OOP的类和方法使程序更加容易扩展和易更改
②你写的代码需要经常变更
类的语法
①实例化前,类本身已经存在内存里
②实例化时,先在内存开辟一块空间d,将地址和赋值参数传给类Dog
python会自动把这个实例本身d通过self参数传进类里
③class Role(object): class是定义类的语法,Role是类名,(object)是新式类的写法
④__init__()叫做初始化方法(或构造方法) def在类中称为方法。
⑤__init__中的第一个参数self把刚开辟的变量d传进去,从而使得赋值参数与刚开辟的变量关联起来。
总结: 定义的类体现了一个特性:封装。
使用构造方法__init__()将内容封装到某个具体对象中,然后通过对象直接或者self间接获取被封装的内容。比如
2018/02/23 周五
面向对象的特性:
封装
把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
继承
继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
①继承的过程,就是从一般到特殊的过程。
②继承概念的实现方式主要有2类:实现继承、接口继承。
实现继承:使用基类的属性和方法而无需额外编码的能力;
接口继承:仅使用属性和方法的名称、但是子类必须提供实现的能力(子类重构爹类方法);
③OO开发范式大致为:
划分对象→抽象类→将类组织成为层次化结构(继承和合成) →用类与实例进行设计和实现几个阶段。
例子学习
在考虑使用继承时,两个类之间的关系应该是“属于”关系。(父类定义的一般属性要能用于子类)
抽象类仅定义将由子类创建的一般属性和方法。子类可添加新的子属性。
2018/02/24 周六
封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);
它们的目的都是为了——代码重用
而多态则是为了实现另一个目的——接口重用!
多态的作用,就是为了类在继承和派生的时候,保证使用“家谱”中任一类的实例的某一属性时的正确调用。
将方法统一,改变了方法的使用方法
2018/02/27 周二
领域模型——面向对象设计利器
从领域模型开始,我们就开始了面向对象的分析和设计过程,可以说,领域模型是完成从需求分析到面向 对象设计的一座桥梁。
①领域建模的方法概括一下就是“找名词”! 从需求模型中找,具 体来说就是从用例中找。
②领域建模的三字经方法:找名词、加属性、连关系。
2018/03/03 周六 第一天夜班
面向对象编程进阶
1.经典类vs新式类
2.抽象接口
3.静态方法
①通过@staticmethod把方法变为静态方法
②静态方法是不可以访问实例变量或类变量
③与类唯一的关联就是需要通过类名来调用这个方法
调用时实例化静态方法:
①. 调用时主动传递实例本身给eat方法,即d.eat(d)
②. 在eat方法中去掉self参数,但这也意味着,在eat中不能通过self.调用实例中的其它变量了
4.类方法
通过@classmethod装饰器实现,只能访问类变量,不能访问实例变量。
5.属性方法
①通过@property把一个方法变成一个静态属性
②调用方法时,不加()即可
③与静态变量的作用区别:将一系列方法后得到的结果变为属性值,不能通过简单定义变量得到。
④属性方法:通过@flight_status.setter装饰器再装饰一下,写一个新方法, 对这个属性进行更改。
@flight_status.deleter, 是允许可以将这个属性删除
6.类的特殊成员方法
① __doc__ 表示类的描述信息
② __module__ 表示当前操作的对象在那个模块
__class__ 表示当前操作的对象的类是什么
③ __init__ 构造方法,通过类创建对象时,自动触发执行
④ __del__析构方法,此方法一般无须定义
⑤ __call__ 对象后面加括号,触发执行。对象() 或者 类()()
⑥ __dict__ 查看类或对象中的所有成员
⑦ __str__ 如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值
⑧ __getitem__、__setitem__、__delitem__用于索引操作,如字典。以上分别表示获取、设置、删除数据
⑨ __new__ \ __metaclass__
f对象是Foo类的一个实例,Foo类对象是 type 类的一个实例
Foo类对象 是通过type类的构造方法创建
类的生成 调用 顺序依次是 __new__ --> __init__ --> __call__
⑩反射:通过字符串映射或修改程序运行时的状态、属性、方法, 有以下4个方法
2018/03/04 周日
1.Socket编程进阶
①socket概念
socket本质上就是在2台网络互通的电脑之间,架设一个通道,两台电脑通过这个通道来实现数据的互相传递。
建立一个socket必须至少有2端, 一个服务端,一个客户端, 服务端被动等待并接收请求,客户端主动发起请求, 连接建立之后,双方可以互发数据。
2018/03/05 周一
进程、线程、协程篇
1.操作系统发展史
①手工操作(无操作系统):将对应于程序和数据的已穿孔的纸带(或卡片)装入输入机,然后启动输入机把程序和数据输入计算机内存,接着通过控制台开关启动程序针对数据运行;计算完毕,打印机输出计算结果;用户取走结果并卸下纸带(或卡片)后,才让下一个用户上机。
②批处理系统:加载在计算机上的一个系统软件,在它的控制下,计算机能够自动地、成批地处理一个或多个用户的作业(这作业包括程序、数据和命令)。
③联机批处理系统:作业的输入/输出由CPU来处理。成批地读入、输出。
④脱机批处理系统:增加一台不与主机直接相连而专门用于与输入/输出设备打交道的卫星机。
⑤多道程序系统:指允许多个程序同时进入内存并允许它们交替在CPU中运行。单处理机系统中多道程序
⑥多道批处理系统:(简称:批处理系统)系统内可同时容纳多个作业,不允许用户与其作业发生交互作用。
⑦分时系统:把处理机的运行时间分成很短的时间片,按时间片轮流把处理机分配给各联机作业使用。
⑧实时系统:即系统能够及时响应随机发生的外部事件,并在严格的时间范围内完成对该事件的处理。
2.进程与线程
程序是指令的集合,它是进程运行的静态描述文本;
进程是程序的一次执行活动,属于动态概念。
线程是进程的细分,执行进程总事件下很多不同类别的事件。
3.Python GIL(Global Interpreter Lock)
无论你启多少个线程,你有多少个cpu, Python在执行的时候会淡定的在同一时刻只允许一个线程运行。
4.线程的调用方式:
直接调用
继承式调用
Join & Daemon:守护线程
线程锁(互斥锁Mutex)
①用户级的lock与GIL的区别:加入GIL主要的原因是为了降低程序的开发的复杂度,
你自己的程序 里的线程和 py解释器自己的线程是并发运行的,lock可以解决程序线程的先后,而GIL解决解释器的线程先后。
RLock(递归锁):在一个大锁中还要再包含子锁
Semaphore(信号量):互斥锁 同时只允许一个线程更改数据,而Semaphore是同时允许一定数量的线程更改数据
Timer:设定时间后运行
Events:实现两个或多个线程间的交互,红绿灯的例子、员工进公司门要刷卡。
5.queue队列:在多线程中要求数据安全修改时,特别有效。
6.生产者消费者模型:该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度。
①生产者就是生产数据的线程,消费者就是消费数据的线程。
②生产者消费者模式是通过一个容器(缓冲区)来解决生产者和消费者的强耦合问题。
7.多进程multiprocessing
①进程间通讯:不同进程间内存是不共享的,要想实现两个进程间的数据交换,可以用以下方法:
Queues
Pipes
Managers
进程同步
②进程池:进程池内部维护一个进程序列,当使用时,则去进程池中获取一个进程,如果进程池序列中没有可供使用的进进程,那么程序就会等待,直到进程池中有可用进程为止。
进程池中有两个方法:
apply
apply_async
2018/03/09 周五
协程
协程,又称微线程,纤程。英文名Coroutine。协程是一种用户态的轻量级线程。
协程拥有自己的寄存器上下文和栈。重入时,进入上一次离开时所处逻辑流的位置。
2018/03/10 周六
1.数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,
RDBMS即关系数据库管理系统(Relational Database Management System)
Mysql是最流行的关系型数据库管理系统
2.orm英文全称object relational mapping,就是对象映射关系程序
通过orm将编程语言的对象模型和数据库的关系模型建立映射关系,
在使用编程语言对数据库进行操作的时候,可以直接使用编程语言的对象模型进行操作
2018/03/11 周日
1.协程
Gevent:并发同步或异步编程
gevent.joinall 函数:阻塞当前流程,并执行所有给定的greenlet。
执行流程只会在所有greenlet执行完后才会继续向下走。
协程与进程、线程在服务器处理模型中的比较:
(1)每收到一个请求,创建一个新的进程,来处理该请求;
(2)每收到一个请求,创建一个新的线程,来处理该请求;
(3)每收到一个请求,放入一个事件列表,让主进程通过非阻塞I/O方式来处理请求
①创建新的进程的开销比较大,所以,会导致服务器性能比较差,但实现比较简单。
②要涉及到线程的同步,有可能会面临死锁等问题。
③在写应用程序代码时,逻辑比前面两种都复杂。
结论:一般普遍认为第(3)种方式是大多数网络服务器采用的方式
2.编程范式:单线程、多线程以及事件驱动编程模型
①单线程同步模型:程序不必要的等待,降低了运行速度
②多线程版本:程序员必须写代码来保护共享资源,防止其被多个线程同时访问。
③事件驱动版本:3个任务交错执行,但仍然在一个单独的线程控制中。
当处理I/O或者其他昂贵的操作时,注册一个回调到事件循环中,然后当I/O操作完成时继续执行。
事件驱动编程,可以联系到 协程的gevent非阻塞I/O,或者 异步I/O
3.关于I/O 的介绍
①用户空间与内核空间
②进程切换:
(1)保存处理机上下文,包括程序计数器和其他寄存器。
(2)更新PCB信息。
(3)把进程的PCB移入相应的队列,如就绪、在某事件阻塞等队列。
(4)选择另一个进程执行,并更新其PCB。
(5)更新内存管理的数据结构。
(6)恢复处理机上下文。
进程控制块(Processing Control Block):操作系统核心中一种数据结构,主要表示进程状态。
存放着操作系统用于描述进程情况及控制进程运行所需的全部信息
③进程的阻塞:
正在执行的进程,由于期待的某些事件未发生,如请求系统资源失败、等待某种操作的完成、新数据尚未到达或无新工作做等,
则由系统自动执行阻塞原语(Block),使自己由运行状态变为阻塞状态。
④文件描述符fd:
它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。
⑤缓存 I/O (大多数文件系统的默认 I/O 操作)
数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间。
4.IO模式:
- 阻塞 I/O(blocking IO)
- 非阻塞 I/O(nonblocking IO)
- I/O 多路复用( IO multiplexing)
- 信号驱动 I/O( signal driven IO)
- 异步 I/O(asynchronous IO)
IO执行的两个阶段:准备数据、拷贝数据
①阻塞 I/O:准备数据和拷贝数据 两个阶段都会block直至完成
②非阻塞 I/O:准备数据阶段不block,用户进程需要不断的主动询问kernel数据好了没有
③I/O 多路复用:
用户进程调用了select/poll/epoll函数,那么整个进程会被block。
kernel会“监视”所有select负责的socket,当任何一个socket中的数据准备好了,select就会返回。
用户进程再调用read操作,将数据从kernel拷贝到用户进程。
优点:通过一种机制(select,poll,epoll都是IO多路复用的机制。)
一个进程能同时等待多个文件描述符,而这些文件描述符(套接字描述符)其中的任意一个进入读就绪状态,
select()函数就可以返回。
④异步 I/O:
两个阶段都不block,I/O操作完成后,kernel会给用户进程发送一个signal,告知read操作完成了。
synchronous IO和asynchronous IO的区别:
synchronous IO做”IO operation”的时候会将process阻塞。
如blocking IO,non-blocking IO,IO multiplexing
non-blocking IO和asynchronous IO的区别:
在non-blocking IO中,虽然进程大部分时间都不会被block,但仍然要求进程去主动的check,
并当数据准备完成后,也需进程主动再次调用recvfrom来将数据拷贝到用户内存。
而asynchronous IO则完全不同。它就像是用户进程将整个IO操作交给了他人(kernel)完成,
然后他人做完后发信号通知。在此期间,用户进程不需要去检查IO操作的状态,也不需要主动的去拷贝数据。
5.I/O 多路复用之select、poll、epoll详解
select,poll,epoll都是IO多路复用的机制。I/O多路复用就是通过一种机制,
一个进程可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。
①select:调用后select函数会阻塞,直到有描述副就绪(有数据 可读、可写、或者有except),
或者超时(timeout指定等待时间,如果立即返回设为null即可),函数返回。
当select函数返回后,可以 通过遍历fdset,来找到就绪的描述符。
②poll:不同于select使用三个位图来表示三个fdset的方式,poll使用一个 pollfd的指针实现。
③epoll:select和poll的增强版本
**到此,联系协程的gevent,通过gevent实现单线程下的多socket并发,对比select单进程下,多并发socket。
2018/03/12 周一
下个目标:mysql数据库、socket编程
1. 运维堡垒机开发
①作用:权限控制和用户行为审计
常用算法学习
1.算法:解题方案的准确而完整的描述,是一系列解决问题的清晰指令。
①有穷性(Finiteness):算法的有穷性是指算法必须能在执行有限个步骤之后终止;
②确切性(Definiteness):算法的每一步骤必须有确切的定义;
③输入项(Input):一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输 入是指算法本身定出了初始条件;
④输出项(Output):一个算法有一个或多个输出,以反映对输入数据加工后的结果。没 有输出的算法是毫无意义的;
⑤可行性(Effectiveness):算法中执行的任何计算步骤都是可以被分解为基本的可执行 的操作步,即每个计算步都可以在有限时间内完成(也称之为有效性);
⑥高效性(High efficiency):执行速度快,占用资源少;
⑦健壮性(Robustness):对数据响应正确。
2.常用排序
①冒泡排序(Bubble Sort):这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,故名。
②选择排序:在不断缩小的范围内选出最小值放在前面。
③插入排序(Insertion Sort):将列表分为2部分,左边为排序好的部分,右边为未排序的部分,循环整个列表,每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止。
④快速排序(quick sort):首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面
⑤二叉树:边的上端节点称为父节点,下端称为子节点。
⑥堆排序:堆分为最大堆和最小堆,其实就是完全二叉树。最大堆要求节点的元素都要大于其孩子,最小堆要求节点元素都小于其左右孩子,两者对左右孩子的大小关系不做任何要求,
⑦希尔排序(shell sort):插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。不断缩小增量的间隔组成的元素进行大小排序,最后一次直接插入排序。
2018/03/15 周四
常用设计模式学习
设计模式:代码设计经验的总结,创建型、结构型和行为型3大类
①创建型模式:对对象的创建进行研究。
简单工厂模式(Simple Factory);
工厂方法模式(Factory Method);
抽象工厂模式(Abstract Factory);
创建者模式(Builder);
原型模式(Prototype);
单例模式(Singleton)。
②结构型模式:对象的组成以及对象之间的依赖关系。
外观模式(Facade);
适配器模式(Adapter);
代理模式(Proxy);
装饰模式(Decorator);
桥模式(Bridge);
组合模式(Composite);
享元模式(Flyweight)
③行为型模式:在对象的结构和对象的创建问题都解决了之后,就剩下对象的行为问题了。
模板方法模式(Template Method);
观察者模式(Observer);
状态模式(State);
策略模式(Strategy);
职责链模式(Chain of Responsibility);
命令模式(Command);
访问者模式(Visitor);
调停者模式(Mediator);
备忘录模式(Memento);
迭代器模式(Iterator);
解释器模式(Interpreter)。
2.设计模式的六大原则
①开闭原则(Open Close Principle)
对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码。
所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类。
②里氏代换原则(Liskov Substitution Principle)
面向对象设计的基本原则之一。即任何基类可以出现的地方,子类一定可以出现。
LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。
里氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。
而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。
3、依赖倒转原则(Dependence Inversion Principle)
这个是开闭原则的基础,具体内容:是对接口编程,依赖于抽象而不依赖于具体。
4、接口隔离原则(Interface Segregation Principle)
这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。还是一个降低类之间的耦合度的意思,
从这儿我们看出,其实设计模式就是一个软件的设计思想,从大型软件架构出发,为了升级和维护方便。
所以上文中多次出现:降低依赖,降低耦合。
5、迪米特法则(最少知道原则)(Demeter Principle)
一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。
6、合成复用原则(Composite Reuse Principle)
原则是尽量使用合成/聚合的方式,而不是使用继承。
2018/03/16 周五
设计三大类模式
2018/03/17 周六
一. 创建型模式
1.工厂模式
意图:定义一个用于创建对象的接口,让子类决定实例化哪一个类。
①简单工厂模式:一个接口类负责决定创建哪个ShapeFactory的子类,即一个工厂。
总结:创建好多个产品的类后,写一个接口类对用哪个产品的类进行逻辑判断。
②工厂方法模式:对每一个产品都有相应的工厂,客户端判断使用哪个接口(工厂)。
把简单工厂抽象为一个Factory类(可以是抽象类和接口),制定了一些规范,具体的生产由其子类工厂完成。
总结:写一个接口类,然后再写继承的子类,子类里的方法对应不同的产品类
③抽象工厂模式:工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则需要面对多个产品等级结构。
两个重要的概念:产品族和产品等级。
特点:使用同一个工厂等级结构来对付这些相同或者极为相似的产品等级结构。即一个工厂创建一族产品。
功能:为一系列相关对象或相互依赖的对象创建一个接口。切换产品族的时候,切换工厂即可。
客户端使用抽象工厂来创建需要的对象,而根本就不知道具体的实现是谁,客户端只是面向产品的接口编程而已。
总结:同一等级结构的产品有一个总类,对应不同族写不同的子类继承。写好多个等级结构后,再写一个总工厂类,
不同族继承不同的子工厂类,子工厂类里创建该族的一族产品。
最后写一个抽象工厂类,执行创建的动作。输入不同族产品即可创建不同族。
2.建造者模式
意图:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
基本思想:某类产品的构建由很多复杂组件组成;(类比一族产品)
这些组件中的某些细节不同,构建出的产品表象会略有不同;(类比不同族的工厂)
通过一个指挥者按照产品的创建步骤来一步步执行产品的创建;(类比工厂的创建过程)
当需要创建不同的产品时,只需要派生一个具体的建造者,重写相应的组件构建方法即可。(切换工厂)
总结:写一个基类,子类继承时细节不同,再写一个指挥者的类,执行创建。
3.单例模式
意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
总结:只有唯一的一个实例,后者会覆盖前面的。通过cls._instance绑定,唯一化实例
二.结构型模式
1.适配器模式:
意图:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
应用场景:希望复用一些现存的类,但是接口又与复用环境要求不一致。
总结:新写一个类,类的方法指向现存的类的方法,即可转换。
2.桥接模式:
概述:某些类型由于自身的逻辑,它具有两个或多个维度的变化,
意图:将抽象部分与实现部分分离,使它们都可以独立的变化。
效果及实现要点:
①Bridge模式使用“对象间的组合关系”解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度来变化。
②所谓抽象和实现沿着各自维度的变化,即“子类化”它们,得到各个子类之后,便可以任意它们,从而获得不同路上的不同汽车。
③Bridge模式有时候类似于多继承方案,但是多继承方案往往违背了类的单一职责原则(即一个类只有一个变化的原因),复用性比较差。Bridge模式是比多继承方案更好的解决方法。
④Bridge模式的应用一般在“两个非常强的变化维度”。注意的是,有时候即使有两个变化的维度,但是某个方向的变化维度并不剧烈——换言之两个变化不会导致纵横交错的结果,并不一定要使用Bridge模式。
总结:自由组配不同对象与不同实现,每种组合都有可能实现。这点与创建型模式——抽象工厂不同,抽象工厂只能创建一族的产品。
3.组合模式
意图:将对象组合成树形结构以表示“部分-整体”的层次结构。用户对单个对象和组合对象的使用具有一致性。
用途:比如总店和分店,在总店购买时,积分也一样累加在分店卡上。
总结:写总店的对象的类时,写一个储存列表的方法,在实例时把分店加到里面,在写刷卡方法时,循环列表取出刷卡。
总店刷卡时,即可累加积分到分店上。从而单个对象(总店)和组合对象(总店和分店)使用(刷卡积分)一致。
4.外观模式
意图:定义了一个高层接口,为子系统中的一组接口提供一个一致的界面,这个接口使得这一子系统更加容易使用。
概述:Facade 可以提供一个简单的缺省视图(用于接口),需要定制(改写继承)则越过facade层。
不同层之间建立外观模式,定义各自的facade接口,作为子系统中每层的入口点,它们仅通过facade进行通讯。
总结:为多层次的子类的不同层各写一个方法,归在一个总类下。
5.享元模式
意图:运用共享技术有效地支持大量细粒度的对象。
概述:
①抽象享元角色(Flyweight):
此角色是所有的具体享元类的超类,为这些类规定出需要实现的公共接口或抽象类。
那些需要外部状态(External State)的操作可以通过方法的参数传入。
抽象享元的接口使得享元变得可能,但是并不强制子类实行共享,因此并非所有的享元对象都是可以共享的。
②具体享元(ConcreteFlyweight)角色:
实现抽象享元角色所规定的接口。如果有内部状态的话,必须负责为内部状态提供存储空间。
享元对象的内部状态必须与对象所处的周围环境无关,从而使得享元对象可以在系统内共享。
有时候具体享元角色又叫做单纯具体享元角色,因为复合享元角色是由单纯具体享元角色通过复合而成的。
③复合享元(UnsharableFlyweight)角色:
复合享元角色所代表的对象是不可以共享的,但是一个复合享元对象可以分解成为多个本身是单纯享元对象的组合。
复合享元角色又称做不可共享的享元对象。这个角色一般很少使用。
④享元工厂(FlyweightFactoiy)角色:
本角色负责创建和管理享元角色。本角色必须保证享元对象可以被系统适当地共享。
当一个客户端对象请求一个享元对象的时候,享元工厂角色需要检查系统中是否已经有一个符合要求的享元对象,
如果已经有了,享元工厂角色就应当提供这个已有的享元对象;如果系统中没有一个适当的享元对象的话,
享元工厂角色就应当创建一个新的合适的享元对象。
⑤客户端(Client)角色:
本角色还需要自行存储所有享元对象的外部状态。
⑥内部状态与外部状态:
在享元对象内部并且不会随着环境改变而改变的共享部分,可以称之为享元对象的内部状态,
反之随着环境改变而改变的,不可共享的状态称之为外部状态。
总结:写一个抽象基类(抽象享元),再继承子类(具体享元),实例化子类时(享元工厂)处理一下(删除相同实例的外部状态)。
那么可以用相对较少的共享对象取代很多组对象。
6.代理模式
意图:为其他对象提供一种代理以控制对这个对象的访问。
主要解决:在直接访问对象时带来的问题。如买火车票,路远不去火车站买,去代售点买即可。
总结:写一个代理类,其方法指向被代理的类的方法。
缺点:增加了一层代理,请求处理时可能会速度变慢。
使用场景:
①远程代理。
②虚拟代理。
③Copy-on-Write 代理。
④保护(Protect or Access)代理。
⑤Cache代理。
⑥防火墙(Firewall)代理。
⑦同步化(Synchronization)代理。
⑧智能引用(Smart Reference)代理。
三. 行为型模式
1.模板方法模式
概述:一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现。
意图:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中(重写)。行为(次数,数量)由父类控制,子类实现。
何时使用:一些方法通用,却在每一个子类都重新写了这一方法。
总结:在父类中写好全部方法(次序、数量),子类继承时重写部分方法,通过覆盖某些步骤,
使得相同的算法框架可以有不同的执行结果。
2.责任链模式
意图:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。
将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
总结:写一个基类,基类中要有从一个对象转下一个对象的方法,def successor(self,successor):
self._successor = successor
该方法的功能就是把另一个对象通过successor()传递进来(进这个对象类中)。
在需要传下去时,写else self._successor.handle(request)即可。
最后一个对象不需要传递。
实例化时要把链子通过successor串起来。
3.观察者模式 又名发布-订阅(Publish/Subscribe)模式
意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。
总结:写一个基类,包含基本的添加、解除、通知等需要的方法,其中通知方法遍历使用被观察者类的被通知方法;
然后写一个继承的观察者类,里面包括传入信息,执行通知方法的方法;
再写几个被观察者类,有被通知方法;
最后实例时,添加被观察者到观察者的列表中,输入msg即可触发通知方法。
4.策略模式
意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换(即可随时更换)。
如何解决:将这些算法封装成一个一个的类,任意地替换。
关键代码:实现同一个接口。
总结:原本要更换算法的话,需要重新实例,要想同一个实例,需要在类里面定义一个重新指向算法的方法。
先写好几个算法,写接口时,除了有执行算法的方法,还需有重新指向另一个算法的方法,
更换时输入算法类的名字即可更换。
2018/03/18 周日
python库安装问题
①cmd的pip install 库名:如果有两个版本的python,可能会安装在默认的版本上。
②pycharm里的添加库:注意当前选择的是哪个版本。
word文档分隔符的添加
①边框—下框线,可以分割文字,效果不错。
数据库操作
①sqlalchemy库
②ORM框架-Django models
③navicat操作数据库
2018/03/21 周三
navicat for mysql安装和破解
①使用补丁和生成license破解,注意要全程断网,从安装开始。
SQL语法学习
1.SQL select
①SQL 语句对大小写不敏感。SELECT 等效于 select。
②星号(*)是选取所有列的快捷方式。SELECT * FROM Persons选取所有列
2.SQL SELECT DISTINCT 语句
SELECT DISTINCT Company FROM Orders ,仅仅列出不同(distinct)的值。
3.SQL WHERE 子句
SELECT 列名称 FROM 表名称 WHERE 列 运算符 值
有条件地从表中选取数据,SQL使用单引号来环绕文本值(大部分数据库系统也接受双引号)。
如果是数值,请不要使用引号。
4.SQL AND & OR 运算符
AND 和 OR 运算符用于基于一个以上的条件对记录进行过滤。
5.SQL ORDER BY 子句
ORDER BY + 列名 语句用于对结果集进行排序。
6.SQL INSERT INTO 语句
①INSERT INTO 表名称 VALUES (值1, 值2,....) 在现有表数据之下加入值
②INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)
SQL UPDATE 语句
UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值 用于修改表中的数据。
SQL DELETE 语句:
DELETE FROM 表名称 WHERE 列名称 = 值 DELETE 语句用于删除表中的行。
SQL TOP 子句
SELECT TOP number|percent column_name(s) FROM table_name 用于规定要返回的指定行的数目。
SQL LIKE 操作符
用于在 WHERE 子句中搜索列中的指定模式。
SELECT column_name(s) FROM table_name WHERE column_name LIKE pattern('N%'\'%g')
2018/03/22 周四
1.SQL的通配符
百分号%
替代一个或多个字符
下划线_
仅替代一个字符
[charlist]
字符列中的任何单一字符
[^charlist]\[!charlist] 不在字符列中的任何单一字符
2.Alias语法,为表指定简单的别名,可以写的简单点
为列指定别名,可以更换结果集的列名
3.Join
用于从多个表中匹配主键相同的指定列的内容
①JOIN: 如果表中有至少一个匹配,则返回行 = INNER JOIN ,可以理解为交集
②LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
③RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
④FULL JOIN: 只要其中一个表中存在匹配,就返回行
mysql 并不直接支持full join,left join union right join解决
4. Union
在第一个表的指定列下合并第二个表
5.Constraints约束条件
限制表中某列的加入类型
NOT NULL 不接受NULL值
UNIQUE 唯一约束
PRIMARY KEY 主键,一个表一个
FOREIGN KEY 外键,另一个表中的主键
CHECK 限制值的范围
DEFAULT 默认值
6.MYSQL与SQL Server / Oracle / MS Access的区别
创建表中列的时候mysql会把列的约束条件写在最后,而其他则会在定义列时写上constraints
7.CREATE INDEX
索引分单列索引和组合索引。
唯一索引。
主键是唯一的单列。
语句用于在表中创建索引,用于搜索。CREATE INDEX index_name ON table_name (column_name)
修改索引名称:ALTER TABLE tbl_name RENAME INDEX old_index_name TO new_index_name
8.删除索引、表和数据库。
删除索引:DROP INDEX index_name
删除表:DROP TABLE 表名称
删除数据库:DROP DATABASE 数据库名称
只删除表的内容:TRUNCATE TABLE 表名称
删除表中的列:ALTER TABLE table_name DROP COLUMN column_name
更改表中的列类型:ALTER TABLE table_name modify column_name datatype
ALTER TABLE table_name CHANGE i j datatype;
删除表:DELETE FROM table_name
更改表中的列数值:UPDATE table_name SET column1=value, column2=value,...WHERE some_column=some_value
在alter命令中使用add、drop等,删除主键时只需指定PRIMARY KEY,但在删除索引时,你必须知道索引名。
9. INSERT INTO Persons (FirstName,LastName) VALUES ('Bill','Gates')
插入新值
区别:SELECT column_name(s) INTO newtable [IN externaldb] FROM table1
从一个表复制信息到另一个表
10.auto-increment
每次加入新记录时,定义的列会递增
定义了主键就不用auto-increment。
11.VIEW(视图)
基于 SQL 语句的结果集的可视化的表。view可看作一个存储数据的表
删除:drop view 名字
12.SQL NULL 值
NULL 值是遗漏的未知数据。
默认地,表的列可以存放 NULL 值。
处理NULL使用IS NULL和IS NOT NULL运算符。
二:SQL函数
在 SQL 中,基本的函数类型和种类有若干种。函数的基本类型是:
①Aggregate 函数:合计函数
②Scalar 函数 :单一函数
1.Avg():返回数值列的平均值。NULL 值不包括在计算中。
2.Count() :返回匹配指定条件的行数。NULL 不计入,可添加条件distinct
3.First() :返回指定的字段中第一个记录的值。可使用order by。
4.Last() :回指定的字段中最后一个记录的值。
5.Max() :返回一列中的最大值。NULL 值不包括在计算中。也可用于文本列,以获得按字母顺序排列的最高或最低值。
6.Min():最小值
7.Sum() :求和
8.Group BY:搭配合计函数,根据一个或多个列对结果集进行分组(使用合计函数)。
即合计函数以group by后面的值为类别分别使用函数。
*9.Having与Where的区别:
①Where是约束声明,约束来自数据库的数据,Where是在结果返回之前起作用的,Where中不能使用聚合函数。
②Having过滤声明,是在查询返回结果集以后对查询结果进行的过滤操作,在Having中可以使用聚合函数。
HAVING SUM(OrderPrice)<2000
10.UCASE():把字段的值转换为大写。
11.LCASE():把字段的值转换为小写。
12.Mid(column_name,start[,length]):于从文本字段中提取字符。默认从1开始。
13.Len():返回文本字段中值的长度。
14.Round(column_name,decimals):把数值字段舍入为decimals指定的小数位数。
15.Now():返回当前的日期和时间。
16.Format():对字段的显示进行格式化。如 FORMAT(Now(),'YYYY-MM-DD')
2018/03/23 周五
MYSQL学习
ORM(对象映射关系程序)与RDBMS(关系型数据库管理系统)
1.从cmd启动mysql:输入mysql -u root -p
navicat管理mysql命令行:右键-命令行界面
2.mysql的一些常用命令:use 数据库名
show databases
show tables
show column from 数据表
create
drop
show index from 数据表
3.mysql的数据类型
tinyint :小整数值
smallint :大整数值
mediumint :大整数值
int\interger:大整数值
bigint :极大整数值
float :单精度浮点数值
double :双精度浮点数值
decimal :依赖输入参数的小数值
日期和时间类型:
date :日期值YYYY-MM-DD
time :时间值HH:MM:SS
year :年份YYYY
datetime :日期时间YYYY-MM-DD HH:MM:SS
timestamp:时间戳 YYYYMMDD HHMMSS
字符串类型:
char :定长字符串
varchar :变长字符串
tinyblob :不超过 255 个字符的二进制字符串
tinytext :短文本字符串
blob :进制形式的长文本数据
text :长文本数据
mediumblob:二进制形式的中等长度文本数据
mediumtext:中等长度文本数据
longblob :二进制形式的极大文本数据
longtext :极大文本数据
一般日期和数据类型都有指定的字节大小,而字符串类型的大小可变。
4.数据库的命令
offset + 数字:开始位置偏移
limit + 数字:返回的数目
在group by后面接with rollup,对数据进行汇总
5.事务
定义:执行操作时,相关的信息也要操作,构成事务
①在MySQL中只有使用了Innodb数据库引擎的数据库或表才支持事务
②事务处理可以用来维护数据库的完整性,保证成批的SQL语句要么全部执行,要么全部不执行
③事务用来管理insert,update,delete语句
事务是必须满足4个条件(ACID): Atomicity(原子性)、Consistency(稳定性)、Isolation(隔离性)、Durability(可靠性)
①原子性:一组事务,要么成功;要么撤回。
②稳定性: 有非法数据(外键约束之类),事务撤回。
③隔离性:事务独立运行。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。事务的100%隔离,需要牺牲速度。
④可靠性:软、硬件崩溃后,InnoDB数据表驱动会利用日志文件重构修改。
可靠性和高速度不可兼得, innodb_flush_log_at_trx_commit选项 决定什么时候吧事务保存到日志里。
ORM对象映射关系程序
意义:在使用编程语言对数据库进行操作的时候可以直接使用编程语言的对象模型进行操作就可以了,而不用sql语言。
1.两个版本的python使用cmd中的pip安装库,都要安装一次
①cmd中输入的python能打开python,故两个版本的python的exe在添加路径到环境变量后,
要分别命名为python2和python3,以后cmd中直接输入相对代码启动不同版本。
②使用pip install时指定python版本,不指定会安装默认的版本。
③python3.6有些库不支持。
2018/03/21 周六
SQL语言是操作数据库的,在python中用ORM来操作数据库。
ORM中常用的一个框架 SQLAlchemy 与数据API进行交流的时候,根据配置文件不同,调用不同的API,如常用的pymysql。
engine = create_engine("mysql+pymysql://root:long0486@localhost/helloworld",
encoding='utf-8', echo=True)
关于python不同版本与pip安装问题,尝试3.6.2和3.5.4两个版本,提示pip的版本或者缺失文件
最后卸载了python3,只剩python2。Python2能使用目前的sql库,暂不安装python3
继续学习ORM的sqlalchemy。
2018/03/27 周二
安装库的时候提示make sure the pip version时,可能是库与python版本不兼容。
ORM与SQLAlchemy
一.sqlalchemy基本使用
1.表的创建
①生成基类
②继承基类,写一个表名、列名的类
③Base.metadata.create_all(engine) 创建表结构
2.数据的创建
①创建与数据库的会话session class
②生成session实例
③生成要创建的数据对象
④Session.add()把要创建的数据对象添加到session
⑤Session.commit() 现此才统一提交,创建数据
3.数据修改与查询
query.filter
4.外键关联
ForeignKey()
* relationship() 允许你在user表里通过backref字段反向查出所有它在addresses表里的关联项
比如一本书,查出书的所有作者
5.多对多关系
①引入中间表,创建两列外键,记录另外两个表中的主键。
中间表会自动创建多条记录来连接另外两个表。
②删除书的作者与直接删除作者的区别
book.author.remove(author)和s.delete(author)
二.堡垒机实例
①if __name__ =='__main__'
作用:__name__ 是当前模块名,当模块被直接运行时模块名为 __main__ 。这句话的意思就是,
当模块被直接运行时,以下代码块将被运行,当模块是被导入时,代码块不被运行。
②def __repr__(self):
return "<User(name='%s', password='%s')>" % (
self.name, self.password)
能让本来显示的内存对象地址变得可读。
堡垒机的建立:
①创建好表
②创建对话实例化,创建数据并关联
③提交数据,通过条件赋值输出
三.简单计算器的例子
四.It's time for Django
组成:模型(models)、模板(template)、视图(views),而控制器(controller)则由框架自行处理。
Django也使用了ORM框架来连接数据库。
2018/03/28 周三
一.SQL处理excel数据
①优点:比excel的VBA分析数据简单、快捷、易懂
②步骤:excel数据--现有连接--浏览更多
③命令文本:select + 列名\函数 + from + 数据来源 + group by 要统计的列名(比如6年级二班的总培训时长)
条件where like ''
二.Python版本的选择--3.5.x
三.职位--数据分析
数据分析要点:
好的指标应该是比率或比例
好的分析应该对比或关联。
统计知识学习
包括均值、中位数、标准差、方差、概率、假设检验、显著性、总体和抽样等概念。