目录

前言

本博客仅仅记录我学习使用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个人笔记的更多相关文章

  1. Web Scraping with Python读书笔记及思考

    Web Scraping with Python读书笔记 标签(空格分隔): web scraping ,python 做数据抓取一定一定要明确:抓取\解析数据不是目的,目的是对数据的利用 一般的数据 ...

  2. python学习笔记整理——字典

    python学习笔记整理 数据结构--字典 无序的 {键:值} 对集合 用于查询的方法 len(d) Return the number of items in the dictionary d. 返 ...

  3. VS2013中Python学习笔记[Django Web的第一个网页]

    前言 前面我简单介绍了Python的Hello World.看到有人问我搞搞Python的Web,一时兴起,就来试试看. 第一篇 VS2013中Python学习笔记[环境搭建] 简单介绍Python环 ...

  4. python学习笔记之module && package

    个人总结: import module,module就是文件名,导入那个python文件 import package,package就是一个文件夹,导入的文件夹下有一个__init__.py的文件, ...

  5. python datetime笔记

    python datetime笔记 http://mint-green.diandian.com/post/2011-09-09/4892024 获取当前时间,并通过字符串输出. 格式为:%Y-%m- ...

  6. python学习笔记(六)文件夹遍历,异常处理

    python学习笔记(六) 文件夹遍历 1.递归遍历 import os allfile = [] def dirList(path): filelist = os.listdir(path) for ...

  7. python学习笔记--Django入门四 管理站点--二

    接上一节  python学习笔记--Django入门四 管理站点 设置字段可选 编辑Book模块在email字段上加上blank=True,指定email字段为可选,代码如下: class Autho ...

  8. python学习笔记--Django入门0 安装dangjo

    经过这几天的折腾,经历了Django的各种报错,翻译的内容虽然不错,但是与实际的版本有差别,会出现各种奇葩的错误.现在终于找到了解决方法:查看英文原版内容:http://djangobook.com/ ...

  9. python学习笔记(一)元组,序列,字典

    python学习笔记(一)元组,序列,字典

  10. python自学笔记

    python自学笔记 python自学笔记 1.输出 2.输入 3.零碎 4.数据结构 4.1 list 类比于java中的数组 4.2 tuple 元祖 5.条件判断和循环 5.1 条件判断 5.2 ...

随机推荐

  1. 日志聚合工具loki

    目录 1.loki是什么 2.loki特点 3.loki组成 4.loki安装 4.1.添加helm的chart库 4.2.安装loki及promtail 4.3.安装grafana 5.配置和使用 ...

  2. Node.js GET/POST对应的url/query-string常用的方法介绍

    <一>,在学node.js--GET/POST请求时,先看模块url和query-string的用法 1. 模块url用法,一般用于解析get请求. parse: [Function: u ...

  3. idea中自动deployment的步骤

  4. moviepy改进的想码

    这个要比前一个厚实点. 更改视频亮度,增加字幕,去除音轨,淡入特效,转换,截取时间,控制位置,组合图框,合成多段, 嗯,很多都有了. from django.test import TestCase ...

  5. sql null+字符=null

    哦,谢谢你,我还想问一个declare @temp varchar(10),@identity varchar(10),@sura varchar(10),@p int,@len int,@nod1  ...

  6. mybatis从入门到精通

    https://www.cnblogs.com/zwwhnly/p/11104020.html

  7. 11 open source business models

    https://www.zdnet.com/article/11-open-source-business-models/ Critics are always claiming open sourc ...

  8. 简述Python的深浅拷贝以及应用场景?

    浅拷贝:copy.copy                       深拷贝:copy.deepcopy 浅拷贝指仅仅拷贝数据集合的第一层数据,深拷贝指拷贝数据集合的所有层 主要应用在字符串,数字的 ...

  9. robot framework中如何为每个测试用例,测试集准备数据或销毁数据

    Suite Setup:在这个测试集的所有测试用例开始测试之前运行(类似于junit的@BeforeClass) Suite Teardown:在这个测试集的所有测试用例结束之后运行(类似于junit ...

  10. 开源项目(4-2)手势识别-Keras/Theano/OpenCV实现的CNN手势识别

    https://github.com/asingh33/CNNGestureRecognizer 我提供了两种捕获模式: 二进制模式:在这里我首先将图像转换为灰度,然后应用高斯模糊效果和自适应阈值滤波 ...