目录

前言

本博客仅仅记录我学习使用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了半天,官网也看了,还是没解决,我真是

最新文章

  1. 超千个节点OpenStack私有云案例(1):CERN 5000+ 计算节点私有云
  2. POI
  3. 访问服务端的HttpProxy
  4. 基于jquery的has()方法以及与find()方法以及filter()方法的区别详解
  5. JS新手易错点
  6. PropertyPlaceholderConfigurer的用法:
  7. Winform开发框架之权限管理系统改进的经验总结(1)-TreeListLookupEdit控件的使用
  8. Jquery 判断滚动条到达顶部或底部
  9. 《python基础教程》笔记之 字符串
  10. Spark技术内幕:Stage划分及提交源代码分析
  11. Go语言标准库_输入/输出
  12. 饮冰三年-人工智能-Python-28 企业官网(组合搜索)
  13. Centos7下安装Docker
  14. Java中所涉及到的设计模式小记
  15. 火车头采集器如何采集QQ群成员中的QQ号
  16. ubuntu 16.04 编译安装 trl8291cu系列 无线网卡驱动
  17. django 数据库配置 ,APP 迁移.模型基础
  18. Remove duplicates from array II
  19. clientX,screenX,pageX,offsetX的异同
  20. swift - label字体 倾斜,加粗

热门文章

  1. vscode编写html,常用快捷方式与插件
  2. Java调用Kotlin程序深度解析
  3. Strength(HDU6563+2018年吉林站+双指针瞎搞)
  4. 微信小程序转百度小程序代码
  5. danci4
  6. CPU 的三大架构 —— numa smp mpp
  7. hive中执行hql或建表语句时,抛出Display all 459 possibilities? (y or n)错误的解决方法
  8. django-用户中心订单页面
  9. gin+redis
  10. go选项模式