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 ...
随机推荐
- Everything 配置问题导致信息泄露复现
0x00 简介 Everything是一个私有的免费Windows桌面搜索引擎,可以在NTFS卷上快速地根据名称查找文件和目录. "Everything" 是 Windows 上一 ...
- ACAG 0x02-4 费解的开关
ACAG 0x02-4 费解的开关 对于这道题,我们不难发现如下性质: 每个位置之多被点击一次: 点击的先后顺序不影响结果: 若确定了第$1$行,则接下来可能的点击方案就只有$1$种.具体原因是:当第 ...
- xpath+多进程爬取网易云音乐热歌榜。
用到的工具,外链转换工具 网易云网站直接打开源代码里面并没有对应的歌曲信息,需要对url做处理, 查看网站源代码路径:发现把里面的#号去掉会显示所有内容, 右键打开的源代码路径:view-source ...
- js插件---videojs的使用
js插件---videojs的使用 一.总结 一句话总结: 网上有各种细致的现成的代码可以拿来用,没必要自己死专 1.video.js有两种初始化方式? 一种是在video的html标签之中 一种是使 ...
- GitLab CI runner can't connect to tcp://localhost:2375 in kubernetes
报错的.gitlab-ci.yml配置如下 image: docker:latest services: - docker:dind variables: DOCKER_HOST: tcp://loc ...
- The Open Source Business Model is Under Siege
https://www.influxdata.com/blog/the-open-source-database-business-model-is-under-siege/ A few weeks ...
- python完成加密参数sign计算并输出指定格式的字符串
加密规则: 1.固定加密字符串+字符串组合(key/value的形式,并通过aissc码排序), 2.通过sha1算法对排序后的字符串进行加密, 3.最终输出需要的参数sign 4.完成请求参数数据的 ...
- 经肝药酶CYP3A4代谢的药物对比记录
罗非昔布 罗非昔布,解热镇痛抗炎药,选择性环氧化酶-2(COX-2)抑制药,有研究表明,该类药可增加心脏病发作.卒中或其他严重后果概率,不良反应为,增加心肌梗死和心脏猝死的风险,现已撤市.经肝和肠壁细 ...
- S1_搭建分布式OpenStack集群_06 nova服务配置 (控制节点)
一.创建数据库(控制节点)创建数据库以及用户:# mysql -uroot -p12345678MariaDB [(none)]> CREATE DATABASE nova_api;MariaD ...
- CSS块元素、行内元素、行内块元素的转换
一.块元素转行内元素:display:inline 二.行内元素转块元素:display:block div{ display: inline; /*无效 width: 500px; height: ...