Python个人笔记
前言
本博客仅仅记录我学习使用Python期间遇到的一些问题,一些解决方案之类的,学习部分参考的廖雪峰的Python教程,学完之后做一个记录备忘
垃圾pip的下载速度
众多周知的原因,pip下载包的时候超级慢,慢到令人发指,所以使用国内的镜像会快很多,例如我要下载pillow,可以使用
pip install -i https://pypi.doubanio.com/simple/ pillow
在pip install -i https://pypi.doubanio.com/simple/ 后面加上要下载的包名就可以了,不要使用pip install pillow,慢的很
查看Python以及第三方包安装位置
查看Python的位置很简单,直接输入
where python
查看你现在安装的所有的包
pip list
一些第三方Python包一般都是通过pip下载的,查看这些包的位置以及其他信息可以使用
# 例子 pip show 包名
pip show googletrans
Python打包成exe
安装pyinstaller打包工具
pip install pyinstaller
打包
需要进入到你的Python文件所在的地方,执行,顺便再提一下,这个图标啊,好像必须是ico格式的,我用gif不行,再有,打包之后的exe图标还是没变化,你把exe移出来换个地方图标就正常显示了
#如果有图标的话可以执行
pyinstaller -F -i favicon.ico nhdz.py
#如果没有图标,可以不写
pyinstaller -F nhdz.py
打包报错
错误 :AttributeError: module 'win32ctypes.pywin32.win32api' has no attribute 'error'
原因是因为我的图片不是 .ico格式的,只要不是.ico格式的图片好像不能作为图标,然后我把jpg改成ico,事实证明只改格式是不行的,所以,如果没有ico的图,就不要图标了吧
selenium打包之后给别人使用需要安装驱动
事情是这样的,有一个网页需要每天自动签到,然后我就写了个自动签到的工具,就是Python调用Selenium,打包成exe给也需要签到的我的朋友
但是他一打开就闪退,我给他打了个log发现别人电脑上没有python环境,想要运行selenium驱动chrome,必须安装ChromeDriver
ChromeDriver的exe版下载地址,下载完之后把这个exe放到一个文件夹,可以是Chrome的安装文件夹,也可以是任意一个文件夹,不过我喜欢和Chrome放在一起,好找,然后这个exe是不能双击安装的,你需要做的就是打开环境变量,把这个ChromeDriver所在的目录加到Path环境变量里面,然后再次运行我写的签到exe就ok了
如果还是出现了Chrome闪退,那就是Chrome版本和ChromeDriver版本不一致,好好对一下
Python操作json
储存json
想把数据变成json还是很简单的,首先键值对,我使用的是dict字典,然后json化
Specifications = {}
for tr in table.find_elements_by_css_selector('tr'):
if tr.get_attribute('class'):
Specifications[tr.find_element_by_css_selector(
'.spec-name').text] = tr.find_element_by_css_selector('.spec-value').text
Specifications = json.dumps(Specifications)
Dict使用json.dumps就变成json字符串了,可以直接存储到数据库里面或者其他里面
读取json
从数据库读取json字符串
例如,我的json是这样的
{"ERRORCODE":"0","RESULT":[{"port":"45021","ip":"183.15.122.171"}]}
我可以这样读取
jsonobj = json.loads(str(r.text))
print(jsonobj)
print(jsonobj['RESULT'])
print(jsonobj['RESULT'][0]['ip'])
print(jsonobj['RESULT'][0]['port'])
如果多层就使用['XX']['XX']
如果json里面带有[] 那就使用[0]
从配置文件读取json
我需要一个配置文件,使用json是很方便的,所以我按照上面读取数据库json字符串的方式读取本地json文件,报错了,正确做法如下
with open(r"config.json",'r',encoding='utf-8') as f:
config = json.load(f)
print(config)
print(config['ConnectionString'])
print(config['ProductCategoryID'])
注意,使用的是load方法,不是loads,如果这里使用loads方法,会报错
中文问题
如果有中文json化的话,肯能会出现下图的问题
可以json化的时候这样写
ParameterDetails=json.dumps(ParameterDetails,ensure_ascii=False, indent=4)
这样有中文的json化之后也可以看中文
倒计时关闭程序
我写爬虫时,遇到网站无法访问的问题,就卡在那,动也不动,写try catch退出也不行,卡那了,没进try catch,所以我写了一个计时功能,10分钟后退出exe,Windows的计划任务定时启动exe
# 10秒钟退出exe
import sys
import time
time_begin=int(time.time())
if(int(time.time()) - time_begin) >=10: #这里的单位是秒
sys.exit()
Python递归之return None
代码如下
def judge_description( next):
if next > 0 :
if next > 3 :
return next
else:
next = next + 1
judge_description(next)
else:
return 0
print(judge_description(1))
返回结果应该是4才对,但是返回的却是None,我居然没有发现else那里没有写return,正确的写法应该是
def judge_description( next):
if next > 0 :
if next > 3 :
return next
else:
next = next + 1
return judge_description(next)
else:
return 0
print(judge_description(1))
多个not in的写法
我有多个条件需要判断,每一个都要满足不存在,我可以这样写
if a not in text and b not in text and....
这样写不好,五六个就已经很头疼了,可以使用all函数,如下
s=['6','8']
text='12345'
if all(t not in text for t in s):
print('ok')
清除字符串前后的空格
仅仅清除前后的空格,字符串内部的空格不会被清除
asd = ' asd asd '
asd = asd.strip()
asd的结果是asd asd
截取字符串
我想截取字符串如下
http://netdna-cdn.com/wp-content/uploads/2015/12/C4468-image.gif
我只想要uploads/2015/12/C4468-image.gif 这个部分,我原本想的是使用正则,可是大佬告诉我有更快的方法,就是使用截取
text = "http://netdna-cdn.com/wp-content/uploads/2015/12/C4468-image.gif"
print(text.index('uploads'))
sss=text[text.index('uploads'):]
aaa=sss.split('/')
print(aaa[0]+"--"+aaa[1]+aaa[2]+"---"+aaa[3])
讲解一下,首先text.index('uploads')是得到uploads的位置,然后根据这个位置我可以截取,通过[:]方式
text[text.index('uploads'):]就是从uploads开始截取到最后
然后就是split分割了,这个很简单
计算长度或者数量len()
只要是计算长度的,都可以使用len函数,计算数量的也可以使用len()函数,比如我查询了所有的a标签,我想知道a标签到底有多少个,我可以使用
pagelist = pages.find_elements_by_css_selector('a')
print(len(pagelist))
Python操作MongoDB
配置连接MongoDB
先安装PyMongo,然后代码很简单,只需要写几行代码就可以了
client = pymongo.MongoClient("mongodb://admin:test123@192.168.1.1:27017/")
db = client.database
collection = db.test
连接字符串里面是我的MongoDB的账号和密码,后面才是MongoDB的ip地址
插入数据
先定义一个集合,然后insert
message = {
'PartNumber': a.text,
'Address': a.get_attribute('href'),
'url': url
}
collection.insert_one(message)
查询数据
这里我分为两种情况,一种是查询一堆,也就是模糊查询
def get_address():
arr=[]
datalist = collectionAddress.find({'url': re.compile('char=0&popular=1')})
for data in datalist:
arr.append(data['Address'])
return arr
还有一个情况,就是我插入数据的时候,我想检测数据是否已经存在MongoDB数据库了,如果存在就不插入
arrs = get_address()
for url in arrs:
isexit = collectionData.find_one({'Address': url})
if isexit:
print('有数据')
else:
save_data(url)
这里要使用find_one,我使用find什么也查不出来
VS Code发布Python为exe
我之前爬虫都是直接F5运行,挂着VS Code爬取的,但是目前遇到了一个数据量很大而且很难爬的网站,决定多开几个爬虫的,同时爬取
先安装Python发布的库
pip install pyinstaller
打包exe的命令需要进入到你的python文件的目录,然后执行
pyinstaller -F data1.py
稍等片刻,就会生成exe
Python操作SqlServer
推荐查看官网的wiki文档:https://github.com/mkleehammer/pyodbc/wiki
导入库import pyodbc
这个库厉害了,不仅仅是SQLServer,Mysql,Oracle都是可以的,而且很好用
普通的写法
import pymongo
import re
import pyodbc
def insertsql(name,sex,age):#插入SQL数据库
conn = pyodbc.connect('DRIVER={SQL Server};SERVER=127.0.0.1,1433;DATABASE=test;UID=sa;PWD=test123')
try:
cursor = conn.cursor()
# cursor.execute('insert into Test(Name,Sex,Age) values(?,?,?)',(name,sex,age)) 插入
# cursor.execute('delete from Test where Name=?',(name)) 删除
cursor.execute('select * from Test where Name = ?',(name)) #查询
cursor.execute('update Test set Name=? where Name=?',('蜀云泉','许嵩')) #更新
# data=cursor.fetchone() 查询一个
data=cursor.fetchall()
print(data)
# conn.commit()# 插入和删除,更新数据的时候执行,查询不需要执行
print('成功')
except Exception as e:
print(str(e))
finally:
conn.close()
insertsql('许嵩','男',35)
超级爽的写法
pymongo用起来非常的舒服,就是下面的写法
cursor.execute("""
select * from Test where Name like '%许嵩%'
"""
)
如果想加参数传入可以这样
cursor.execute("""
select * from Test where Name like ?
""",'%许嵩%'
)
查询结果
你可能发现了,查询的结果是下面这样的
[(2, '许嵩', '男 ', 32), (3, '许嵩', '女 ', 33), (4, '许嵩', '男 ', 30), (6, '许嵩 ', '男 ', 35)]
有中括号,还有括号,其实可以这样得到想要的数据
cursor.execute("""
select Name,Sex,Age from Test where Name like '%许嵩%'
"""
)
datalist=cursor.fetchall()
for data in datalist:
print(data.Name)
print(data.Sex)
print(data.Age)
指名想要的列,然后就可以遍历输出了,结果如下
许嵩
男
32
许嵩
女
33
许嵩
男
30
许嵩
男
35
pyodbc操作SQLserver,获取刚插入数据的Id
这个是真的麻烦,我在数据库里面尝试这个语句是完全ok的
select ident_current('表名')
但是在python里面写了获取的时候根本获取的不是这样的,获取的是包含Decimal的一个什么类型
没办法,我无法解决,百度,Google了半天,官网也看了,还是没解决,我真是
Python个人笔记的更多相关文章
- Web Scraping with Python读书笔记及思考
Web Scraping with Python读书笔记 标签(空格分隔): web scraping ,python 做数据抓取一定一定要明确:抓取\解析数据不是目的,目的是对数据的利用 一般的数据 ...
- python学习笔记整理——字典
python学习笔记整理 数据结构--字典 无序的 {键:值} 对集合 用于查询的方法 len(d) Return the number of items in the dictionary d. 返 ...
- VS2013中Python学习笔记[Django Web的第一个网页]
前言 前面我简单介绍了Python的Hello World.看到有人问我搞搞Python的Web,一时兴起,就来试试看. 第一篇 VS2013中Python学习笔记[环境搭建] 简单介绍Python环 ...
- python学习笔记之module && package
个人总结: import module,module就是文件名,导入那个python文件 import package,package就是一个文件夹,导入的文件夹下有一个__init__.py的文件, ...
- python datetime笔记
python datetime笔记 http://mint-green.diandian.com/post/2011-09-09/4892024 获取当前时间,并通过字符串输出. 格式为:%Y-%m- ...
- python学习笔记(六)文件夹遍历,异常处理
python学习笔记(六) 文件夹遍历 1.递归遍历 import os allfile = [] def dirList(path): filelist = os.listdir(path) for ...
- python学习笔记--Django入门四 管理站点--二
接上一节 python学习笔记--Django入门四 管理站点 设置字段可选 编辑Book模块在email字段上加上blank=True,指定email字段为可选,代码如下: class Autho ...
- python学习笔记--Django入门0 安装dangjo
经过这几天的折腾,经历了Django的各种报错,翻译的内容虽然不错,但是与实际的版本有差别,会出现各种奇葩的错误.现在终于找到了解决方法:查看英文原版内容:http://djangobook.com/ ...
- python学习笔记(一)元组,序列,字典
python学习笔记(一)元组,序列,字典
- python自学笔记
python自学笔记 python自学笔记 1.输出 2.输入 3.零碎 4.数据结构 4.1 list 类比于java中的数组 4.2 tuple 元祖 5.条件判断和循环 5.1 条件判断 5.2 ...
随机推荐
- 日志聚合工具loki
目录 1.loki是什么 2.loki特点 3.loki组成 4.loki安装 4.1.添加helm的chart库 4.2.安装loki及promtail 4.3.安装grafana 5.配置和使用 ...
- Node.js GET/POST对应的url/query-string常用的方法介绍
<一>,在学node.js--GET/POST请求时,先看模块url和query-string的用法 1. 模块url用法,一般用于解析get请求. parse: [Function: u ...
- idea中自动deployment的步骤
- moviepy改进的想码
这个要比前一个厚实点. 更改视频亮度,增加字幕,去除音轨,淡入特效,转换,截取时间,控制位置,组合图框,合成多段, 嗯,很多都有了. from django.test import TestCase ...
- sql null+字符=null
哦,谢谢你,我还想问一个declare @temp varchar(10),@identity varchar(10),@sura varchar(10),@p int,@len int,@nod1 ...
- mybatis从入门到精通
https://www.cnblogs.com/zwwhnly/p/11104020.html
- 11 open source business models
https://www.zdnet.com/article/11-open-source-business-models/ Critics are always claiming open sourc ...
- 简述Python的深浅拷贝以及应用场景?
浅拷贝:copy.copy 深拷贝:copy.deepcopy 浅拷贝指仅仅拷贝数据集合的第一层数据,深拷贝指拷贝数据集合的所有层 主要应用在字符串,数字的 ...
- robot framework中如何为每个测试用例,测试集准备数据或销毁数据
Suite Setup:在这个测试集的所有测试用例开始测试之前运行(类似于junit的@BeforeClass) Suite Teardown:在这个测试集的所有测试用例结束之后运行(类似于junit ...
- 开源项目(4-2)手势识别-Keras/Theano/OpenCV实现的CNN手势识别
https://github.com/asingh33/CNNGestureRecognizer 我提供了两种捕获模式: 二进制模式:在这里我首先将图像转换为灰度,然后应用高斯模糊效果和自适应阈值滤波 ...