目录

前言

本博客仅仅记录我学习使用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. Unicode原理和互转中文

    代码点Unicode标准的本意很简单:希望给世界上每一种文字系统的每一个字符,都分配一个唯一的整数,这些整数叫做代码点(Code Points). 代码空间所有的代码点构成一个代码空间(Code Sp ...

  2. Python中str()与repr()函数的区别——repr() 的输出追求明确性,除了对象内容,还需要展示出对象的数据类型信息,适合开发和调试阶段使用

    Python中str()与repr()函数的区别 from:https://www.jianshu.com/p/2a41315ca47e 在 Python 中要将某一类型的变量或者常量转换为字符串对象 ...

  3. 微信小程序~上拉加载onReachBottom

    代码: //页面上拉触底事件的处理函数 onReachBottom(e) { console.log("底部")// 滚动到页面执行 该 方法 wx.showToast({ tit ...

  4. 编程小白入门分享一:git的最基本使用

    git简介 引用了网上的一张图,这张图清晰表达git的架构.workspace是工作区,可以用编辑器直接编辑其中的文件:Index/Stage是暂存区,编辑后的文件可以添加到(add)暂存区:Repo ...

  5. Yii集成PHPWord

    一.安装 1.下载composer curl -sS https://getcomposer.org/installer | php 将composer.phar文件移动到bin目录以便全局使用com ...

  6. Python实现描述性统计

    该篇笔记由木东居士提供学习小组.资料 描述性统计的概念很好理解,在日常工作中我们也经常会遇到需要使用描述性统计来表述的问题.以下,我们将使用Python实现一系列的描述性统计内容. 有关python环 ...

  7. tensorflow API _ 5 (tensorflow.summary)

    tensorflow的可视化是使用summary和tensorboard合作完成的. 基本用法 首先明确一点,summary也是op. 输出网络结构 with tf.Session() as sess ...

  8. python的zip()函数

    zip() 函数用于将可迭代对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象. 如果各个可迭代对象的元素个数不一致,则返回的对象长度与最短的可迭代对象相同. 利用 * 号 ...

  9. Access数据库连接封装类

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...

  10. robot framework的使用方法

    1.后台代码: 目录结构: 测试代码:Arithmetic.py 2.开始编写用例 直接在eclipse上新建一个txt文件即可,或者是通过ride编写用例. (1).首先在eclipse上新建目录T ...