cmd中查看第三方库
查看安装了哪些第三方库以及第三方库的版本:pip list
查看某个第三方库(例如 aiohttp):py -3 进入python环境,然后 import aiohttp
help(aiohttp) 或者dir(aiohttp)
Time计时
打印程序运行花的时长
start_using_list = time.perf_counter() # dosomething() end_using_list=time.perf_counter() print("time elapse using list: {}".format(end_using_list - start_using_list))
configparser模块(配置)
ConfigParser模块在python中是用来读取配置文件,配置文件的格式跟windows下的ini配置文件相似,可以包含一个或多个节(section),每个节可以有多个参数(键=值)。
注意:在python 3 中ConfigParser模块名已更名为configparser
生成configparser文件实例,example.ini
[DEFAULT]
serveraliveinterval
=
45
compression
=
yes
compressionlevel
=
9
forwardx11
=
yes
[bitbucket.org]
user
=
hg
[topsecret.server.com]
host port
=
50022
forwardx11
=
no
import configparser #配置文件 config = configparser.ConfigParser() """生成configparser配置文件 ,字典的形式""" """第一种写法""" config["DEFAULT"] = {'ServerAliveInterval': '45', 'Compression': 'yes', 'CompressionLevel': '9'} """第二种写法""" config['bitbucket.org'] = {} config['bitbucket.org']['User'] = 'hg' """第三种写法""" config['topsecret.server.com'] = {} topsecret = config['topsecret.server.com'] topsecret['Host Port'] = '50022' # mutates the parser topsecret['ForwardX11'] = 'no' # same here config['DEFAULT']['ForwardX11'] = 'yes' """写入后缀为.ini的文件""" with open('example.ini', 'w') as configfile: config.write(configfile)
读取configparser配置文件的实例
import configparser #配置文件 config = configparser.ConfigParser() config.read("example.ini") print("所有节点==>",config.sections()) print("包含实例范围默认值的词典==>",config.defaults()) for item in config["DEFAULT"]: print("循环节点topsecret.server.com下所有option==>",item) print("bitbucket.org节点下所有option的key,包括默认option==>",config.options("bitbucket.org")) print("输出元组,包括option的key和value",config.items('bitbucket.org')) print("bitbucket.org下user的值==>",config["bitbucket.org"]["user"]) #方式一 topsecret = config['bitbucket.org'] print("bitbucket.org下user的值==>",topsecret["user"]) #方式二 print("判断bitbucket.org节点是否存在==>",'bitbucket.org' in config) print("获取bitbucket.org下user的值==>",config.get("bitbucket.org","user")) print("获取option值为数字的:host port=",config.getint("topsecret.server.com","host port"))
运行结果:
所有节点
=
=
> [
'bitbucket.org'
,
'topsecret.server.com'
]
包含实例范围默认值的词典
=
=
> OrderedDict([(
'serveraliveinterval'
,
'45'
), (
'compression'
,
'yes'
), (
'compressionlevel'
,
'9'
), (
'forwardx11'
,
'yes'
)])
循环节点topsecret.server.com下所有option
=
=
> serveraliveinterval
循环节点topsecret.server.com下所有option
=
=
> compression
循环节点topsecret.server.com下所有option
=
=
> compressionlevel
循环节点topsecret.server.com下所有option
=
=
> forwardx11
bitbucket.org节点下所有option的key,包括默认option
=
=
> [
'user'
,
'serveraliveinterval'
,
'compression'
,
'compressionlevel'
,
'forwardx11'
]
输出元组,包括option的key和value [(
'serveraliveinterval'
,
'45'
), (
'compression'
,
'yes'
), (
'compressionlevel'
,
'9'
), (
'forwardx11'
,
'yes'
), (
'user'
,
'hg'
)]
bitbucket.org下user的值
=
=
> hg
bitbucket.org下user的值
=
=
> hg
判断bitbucket.org节点是否存在
=
=
>
True
获取bitbucket.org下user的值
=
=
> hg
获取option值为数字的:host port
=
50022
getopt模块
该模块是专门用来处理命令行参数的。因为有时候我们需要写一些脚本处理一些任务,这时候往往需要提供一些命令行参数,根据不同参数进行不同的处理,
在Python里的命令行参数是存储在sys.argv里,argv是一个列表,第一个元素为程序名称。
函数getopt(args, shortopts, longopts = [])
参数args一般是sys.argv[1:]
shortopts 短格式 (-)
longopts 长格式(--)
eg:命令行中输入:
python test.py -i 127.0.0.1 -p 80 55 66
python test.py --ip=127.0.0.1 --port=80 55 66
#!/usr/bin/env python # encoding: utf-8 ''' sys 是一个和 Python 解释器关系密切的标准库,它和帮助我们访问和 Python 解释器联系紧密的变量和函数。 os 模块代表了程序所在的操作系统,主要用于获取程序运行所在操作系统的相关信息。 cmd中执行 python cmdParameter.py -i 127.18.21.110 -p 3304 ''' import sys import getopt if __name__ == '__main__': # 获取运行 Python 程序的命令行参数。其中 sys.argv[0] 通常就是指该 Python 程序, # sys.argv[1] 代表为 Python 程序提供的第一个参数,sys.argv[2] 代表为 Python 程序提供的第二个参数……依此类推。 for item in sys.argv: print (item) # getopt模块使用 def usage(): print("Usage:%s [-h|-i|-p] args...." % sys.argv[0]) # 使用sys.argv[1:] 过滤掉第一个参数 # 返回中options为分析出的格式信息。args 为不属于格式信息的剩余的命令行参数。 # options 是一个两元组的列表。每个元素为:( 选项串, 附加参数) 。如果没有附加参数则为空串'' 。 try: options, args = getopt.getopt(sys.argv[1:], "hp:i:", ["help", "ip=", "port="]) except getopt.GetoptError: sys.exit() for name, value in options: if name in ("-h", "--help"): usage() if name in ("-i", "--ip"): print ('ip is----', value) if name in ("-p", "--port"): print ('port is----', value) #print(args)
1. 使用sys.argv[1:] 过滤掉第一个参数(它是执行脚本的名字,不应算作参数的一部分)。
2. 使用短格式分析串"ho:" 。当一个选项只是表示开关状态时,即后面不带附加参数时,在分析串中写入选项字符。当选项后面是带一个附加参数时,在分析串中写入选项字符同时后面加一个":" 号 。所以"ho:" 就表示"h" 是一个开关选项;"o:" 则表示后面应该带一个参数。
3. 使用长格式分析串列表:["help", "output="] 。长格式串也可以有开关状态,即后面不跟"=" 号。如果跟一个等号则表示后面还应有一个参数 。这个长格式表示"help" 是一个开关选项;"output=" 则表示后面应该带一个参数。
4. 调用getopt 函数。函数返回两个列表:opts 和args 。opts 为分析出的格式信息。args 为不属于格式信息的剩余的命令行参数。opts 是一个两元组的列表。每个元素为:( 选项串, 附加参数) 。如果没有附加参数则为空串'' 。
5. 整个过程使用异常来包含,这样当分析出错时,就可以打印出使用信息来通知用户如何使用这个程序。
Global的用法
在函数内部定义变量时,他们与函数外部具有相同名称的其他变量没有任何关系,即变量名称对于函数来说是局部的,这称为变量的作用域,示例如下:
def func_local(x): print 'x is', x x = 2 print 'Chanaged local x to',x x = 50 func_local(x) print 'x is still', x
执行结果:
x is 50 Chanaged local x to 2 x is still 50
如果想在函数内部改变函数外的变量值,用global语句完成
def func_global(): global y print 'y is', y y = 50 print 'Changed local y to', y y = 10 func_global() print 'Value of y is', y
执行结果:
y is 10 Changed local y to 50 Value of y is 50
若传入可变参数如list、set、dict,在函数内部对参数做出修改,参数本身发生变化,tuple、str不变。
更多参考:python中global的用法
文件操作
1、相对路径
“/”:表示根目录,在windows系统下表示某个盘的根目录,如“E:”;
“./”:表示当前目录;(表示当前目录时,也可以去掉“./”,直接写文件名或者下级目录)
“../”:表示上级目录。
2、读写文件的模式
with open('out.txt','w') as fout:
1、r 打开只读文件,该文件必须存在。
2、r+ 打开可读写的文件,该文件必须存在。
3、w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
4、w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
5、a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。
6、a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。
7、上述的形态字符串都可以再加一个b字符,如rb、w+b或ab+等组合,加入b 字符用来告诉函数库打开的文件为二进制文件,而非纯文字文件。不过在POSIX系统,包含Linux都会忽略该字符。
lxml
lxml是python的一个解析库,支持HTML和XML的解析,支持XPath解析方式,而且解析效率非常高
XPath,全称XML Path Language,即XML路径语言,它是一门在XML文档中查找信息的语言,它最初是用来搜寻XML文档的,但是它同样适用于HTML文档的搜索
XPath的选择功能十分强大,它提供了非常简明的路径选择表达式,另外,它还提供了超过100个内建函数,用于字符串、数值、时间的匹配以及节点、序列的处理等,几乎所有我们想要定位的节点,都可以用XPath来选择
库地址:Links for lxml
Request模块请求接口
想要发送一些编码为表单形式的数据——非常像一个 HTML 表单。要实现这个,只需简单地传递一个字典给 data 参数。你的数据字典在发出请求时会自动编码为表单形式:
payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.post("http://httpbin.org/post", data=payload)
1、调用webservice接口传递数据
r = requests.post(post_url, post_data)
其中
post_url= "http://"+ server_host + ":" + server_port + "/paking/PakingMgr.asmx"+”/”+”ReportData” post_data = {"rqString": json.dumps(data)}
因为ReportData()函数的参数名称是rqString
data={ "ID": "109", "PARKINGID": "15", "POSRL": 1, "POSINDEX": 1, "TIME": 1500353416, "PLATE": "", "OBUID": "6198b2d6" , "STATUS": 0, "POSX": 4.66, "POSY": 27.48 }
接口返回:r.text
POST一个多部分编码(Multipart-Encoded)【字符串和文件】的文件
Requests 使得上传多部分编码文件变得很简单:
2、调用webservice接口上传文件
r = requests.post(post_url, data=data, files=files)
其中
data={"filename": dataJson['PATH']} dataJson['PATH']= "lot_photo/2018-02-10/PARKING0013/65/3/1/1.jpg" files = {"file": open(filename, "rb")} filename = os.path.realpath(dataJson['PATH'])
with关键字
在实际的编码过程中,有时有一些任务,需要事先做一些设置,事后做一些清理,这时就需要python with出场了,with能够对这样的需求进行一个比较优雅的处理,最常用的例子就是对访问文件的处理。
#一般访问文件资源时我们会这样处理: f = open(r'c: est.txt', 'r') data = f.read() f.close() #以下的加强版本的写法: f = open(r'c: est.txt', 'r') try: data = f.read() finally: f.close()
一般的写法没有错,但是容易犯两个毛病:
1. 如果在读写时出现异常而忘了异常处理。
2. 忘了关闭文件句柄
加强版的写法就可以避免因读取文件时异常的发生而没有关闭问题的处理了。代码长了一些。
但使用with有更优雅的写法:【with表达式其实是try-finally的简写形式。但是又不是全相同】
with open(r'c: est.txt', 'r') as f: data = f.read()
说明:
with后面接的对象返回的结果赋值给f。此例当中open函数返回的文件对象(_io.TextIOWrappe)赋值给了f。
执行with这个结构之后。f会自动关闭。相当于自带了一个finally。
with会自已获取上下文件的异常信息。
with是如何做到的呢?
with后面返回的对象要求必须__enter__()和__exit__()这两个方法,而文件对象f刚好是有这两个方法的,故应用自如。
pytho中官方定义说明如下():
object.__enter__(self)
进入与此对象相关的运行时上下文。with语句将将此方法的返回值绑定到语句的AS子句中指定的目标(如果有设置的话)
object.__exit__(self, exc_type, exc_value, traceback)
退出与此对象相关的运行时上下文。参数描述导致上下文退出的异常。如果上下文运行时没有异常发生,那么三个参数都将置为None。
如果有异常发生,并且该方法希望抑制异常(即阻止它被传播),则它应该返回True。否则,异常将在退出该方法时正常处理。
请注意, __exit__()方法不应该重新抛出传入的异常,这是调用者的职责。
with应用场景
1、文件操作。2、进程线程之间互斥对象。3、支持上下文其他对象
内存管理与垃圾回收
Python有一个私有堆空间来保存所有的对象和数据结构,我们无法访问它,由解释器来管理它。
Python的内存管理主要有三种机制:引用计数机制,垃圾回收机制和内存池机制。
1、引用计数
python内部使用引用计数,来保持追踪内存中的对象,Python内部记录了对象有多少个引用,即引用计数,当对象被创建时就创建了一个引用计数,当对象不再需要时,这个对象的引用计数为0时,它被垃圾回收。
但是 循环引用会导致对象不被清除,内存泄漏,所以需要引入其他机制。
2、垃圾回收
当内存中有不再使用的部分时,垃圾收集器就会把他们清理掉。它会去检查那些引用计数为0的对象,然后清除其在内存的空间。当然除了引用计数为0的会被清除,还有一种情况也会被垃圾收集器清掉:当两个对象相互引用时,他们本身其他的引用已经为0了。
垃圾回收机制还有一个循环垃圾回收器, 确保释放循环引用对象(a引用b, b引用a, 导致其引用计数永远不为0)。
python垃圾回收机制采用的是引用计数
机制为主,标记-清除
和分代收集
两种机制为辅的策略。
标记-清除:是程序停下来,轮询遍历一遍所有指针,标记出这些指针引用的每个对象。用一串位值(010101)表示是否有引用,为0的对象会被清除。
分代收集:Python将内存根据对象的存活时间划分为不同的集合,每个集合称为一个代,Python将内存分为了3“代”,分别为年轻代(第0代)、中年代(第1代)、老年代(第2代),他们对应的是3个链表,它们的垃圾收集频率与对象的存活时间的增大而减小。
3、内存池机制
Python引入了一个内存池机制,用于管理对小块内存的申请和释放。
内存池概念
内存池的概念就是预先在内存中申请一定数量的,大小相等的内存块留作备用,当有新的内存需求时,就先从内存池中分配内存给这个需求,不够了之后再申请新的内存。这样做最显著的优势就是能够减少内存碎片,提升效率。内存池的实现方式有很多,性能和适用范围也不一样。
日志log
日志事件级别
级别 | 何时使用 |
---|---|
DEBUG | 细节信息,仅当诊断问题时适用。 |
INFO | 确认程序按预期运行 |
WARNING | 表明有已经或即将发生的意外(例如:磁盘空间不足)。程序仍按预期进行 |
ERROR | 由于严重的问题,程序的某些功能已经不能正常执行 |
CRITICAL | 严重的错误,表明程序已不能继续执行 |
默认的级别是 “WARNING“,意味着只会追踪该级别及以上的事件,除非更改日志配置。所追踪事件可以以不同形式处理。最简单的方式是输出到控制台。另一种常用的方式是写入磁盘文件。
basicConfig()设置
# -*- coding:utf-8 -*- import logging # 默认的warning级别,只输出warning以上的 # 使用basicConfig()来指定日志级别和相关信息 logging.basicConfig(level=logging.DEBUG #设置日志输出格式 # ,filename="demo.log" #log日志输出的文件位置和文件名 ,filename="./logs/demo.log" #log日志输出的文件位置和文件名 ,filemode="w" #文件的写入格式,w为重新写入文件,默认是追加 ,format="%(asctime)s - %(name)s - %(levelname)-9s - %(filename)-8s : %(lineno)s line - %(message)s" #日志输出的格式 # -8表示占位符,让输出左对齐,输出长度都为8位 ,datefmt="%Y-%m-%d %H:%M:%S" #时间输出的格式 ) logging.debug("This is DEBUG !!") logging.info("This is INFO !!") logging.warning("This is WARNING !!") logging.error("This is ERROR !!") logging.critical("This is CRITICAL !!") #在实际项目中,捕获异常的时候,如果使用logging.error(e),只提示指定的logging信息,不会出现 #为什么会错的信息,所以要使用logging.exception(e)去记录。 try: 3/0 except Exception as e: # logging.error(e) logging.exception(e)
更多参考:python日志:logging模块使用
报错
1、ImportError: cannot import name 'web'
在引入 from aiohttp import web的时候,运行报上面的错误。在尝试了将aiohttp重装等操作后,还是有问题。。后来发现自己创建的文件名是aiohttp.py,于是改掉。
系统会调用自己创建的aiohttp.py本身,而不是去调用系统的aiohttp库,导致一直报错。
究其原因就是:python程序的名字和自带模块重名,导致错误!!!
2、pandas.read_csv() 报错:Initializing from file failed
"""
python 3.6.1 环境下,read_csv 读入文件时,会出现OSError: Initializing from file failed错误。
如果文件路径中有中文,或者文件名为中文,就会报错 (没中文就不会有错误)。错误信息:
python3.6改了文件输入输出系统的默认编码,从"mbcs" 改为"UTF-8"。
想要改回来,可以这样:每次打开python/运行python代码都需要修改一次。
"""
import sys
print(sys.getfilesystemencoding())
sys._enablelegacywindowsfsencoding()
print(sys.getfilesystemencoding())
3、urllib.error.URLError: <urlopen error unknown url type: https>
在使用URLopen方法的时候,当目标网站使用的是自签名的证书时就会抛出这个错误,需要
import ssl
并加上如下一句:
#全局取消证书验证
ssl._create_default_https_context = ssl._create_unverified_context
4、POST data should be bytes, an iterable of bytes
原因:组装数据的时候 其中的data需要转为utf-8
解决方案:
# 组装POST方法的请求 #将代码request =urllib.request.Request(url, data, headers)
更改为 request = urllib.request.Request(url, data=urllib.parse.urlencode(data).encode(encoding='UTF8'), headers=headers)
更多参考 Python3 使用urllib 发送application/json格式的post请求
5、Python导入自定义模块ImportError: No module named 'xxx'问题
python在导入自定义模块的时候(类、函数所有以.py结尾的文件),出现"ImportError: No module named ‘xxx’"问题
分析:
由于导入的是自定义模块,主要是有两种原因:一个是自定义的模块名和python模块库里缓存的模块名重复了;另一个可能的原因是:相对路径和绝对路径的原因
import 工作原理
- Python首先查找sys.modules中的模块名称。这是预先导入的所有模块的缓存。
- 如果在模块缓存中没有找到该名称,Python将通过内置模块列表进行搜索。这些模块是和Python一起预先安装的,并且可以在Python标准库中找到。
- 如果在内置模块中仍没有找到该名称,那么Python在sys.path定义的目录列表中搜索它。此列表通常包括当前目录,首先搜索该目录。
1、模块重名,则不会进行到第三步,
执行:pip3 list 查看一下时候有和自定义模块同名的
2、路径错误
说明sys.path当中并不存在该路径,可以执行以下代码查看以下:
import sys
print(sys.path)
若不存在,则可以手动添加,eg:
import sys
sys.path.append('F:GiteePythonTestSpiderScrapyDemocnblogsScrapycnblogsScrapy')