Python 模块

 


概念:

对于一个复杂的功能,为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式。
在Python中,一个.py文件就称之为一个模块(Module)。即一个文件被看作一个独立的模块,一个模块也可以被看做是一个文件 使用模块可以避免函数名和变量名冲突。相同名字的函数和变量完全可以分别存在不同的模块中,因此,我们自己在编写模块时,不必考虑名字会与其他模块冲突。但是也要注意,尽量不要与内置函数名字冲突。

模块分为三种

内置模块:如sys, os, subprocess, time, json 等等
自定义模块:自定义模块时要注意命名,不能和Python自带的模块名称冲突。例如,系统自带了sys模块,自己的模块就不可命名为sys.py,否则将无法导入系统自带的sys模块。
开源模块:公开的第三方模块, 如 https://pypi.python.org/pypi 。可以使用pip install 安装,类似于yum 安装软件

导入模块

在导入模块时只能使用模块名,而不是使用带有.py后缀的模块文件名

1.import语句,用于导入整个模块
import module1,module2 #建议一个import语句只导入一个模块
import module as module_newname #自定义模块别名
2.form ... import...语句,用于只导入指定模块的部分属性或模糊导入
from module import name1,name2
import和from import是赋值语句
import和from可执行语句,类似于def,因此,它们可以嵌套在if测试中,出现于def中等等
python执行到这些语句时才会对其进行解析,这意味着所有来自模块的属性仅在import语句执行后才能使用

import工作机制

import语句导入指定的模块时会执行3步骤
1.找到模块文件:在模块搜索路径下搜索模块文件
程序的主目录
pythonpath目录
标准链接库目录
2.编译成字节码:文件导入时会编译,因此顶层文件.pyc字节码文件在内部使用后会被丢弃,只有被导入的文件才会留下.pyc文件
3.执行模块的代码来创建其定义的对象:模块文件中的所有语句从头至尾依次执行,而此步骤中任何对变量名的赋值运算,都UI产生所得的模块文件的属性。
注:模块只在第一次导入时才会执行如上步骤,后续的导入操作只不过是提取内存中已加载的模块对象,reload()可用于重新加载模块。

包: 用于将一组模块归并到一个目录中,此目录即为包,目录名即为包名

包是一个有层次的文件目录结构,它定义了一个由模块和子包组成的Python应用执行环境
基于包,Python在执行模块导入时可以指定模块的导入路径 import pack1.pack2.mod1
每个包内都必须有__init__.py文件, __init__.py 可包含python代码,但通常为空,仅用于扮演包初始化、替目录产生模块命名空间以及使用目录导入时实现from*行为的角色
导入模块时根据sys.path作为基准,如果sys.path路径列表没有你想要的路径,可以通过sys.path.append('路径')添加。
import sys
import os
project_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(project_path)
内置变量__file__:表示当前的文件名
os.path.absath(path):返回path的绝对路径
os.path.dirname(path):返回path目录(去掉最后一层目录或文件)
一个模块文件可以直接执行或被导入
每个模块都有一个名为__name__的内置变量,此变量值会根据调用此模块的方式发生变化:
1. 如果此文件被作为模块导入,则__name__的值为模块名称
2. 如果此文件被直接执行,则__name__的值为“__main__”

我们在创建模块时,在尾部添加如下代码进行模块的自我测试
if __name__ == '__main__':
  ...
如果模块被导入,则 if 后的语句就不会执行


 

标准库常用模块

1.sys模块

sys:模块sys让你能够访问与Python解释器紧密相关的变量和函数。  

argv   命令行参数,包括脚本名
exit([arg])   退出当前程序,可通过可选参数指定返回值或错误消息
modules   一个字典,将模块名映射到加载的模块
path     一个列表,包含要在其中查找模块的目录的名称
platform     一个平台标识符,如sunos5或win32
stdin     标准输入流——一个类似于文件的对象
stdout     标准输出流——一个类似于文件的对象
stderr     标准错误流——一个类似于文件的对象
 
变量sys.argv包含传递给Python解释器的参数,其中包括脚本名。
函数sys.exit退出当前程序。你可向它提供一个整数,指出程序是否成功,这是一种UNIX约定。在大多数情况下,使
用该参数的默认值(0,表示成功)即可。也可向它提供一个字符串,这个字符串将成为错误消
息,对用户找出程序终止的原因很有帮助。在这种情况下,程序退出时将显示指定的错误消息以
及一个表示失败的编码。
映射sys.modules将模块名映射到模块(仅限于当前已导入的模块)。
变量sys.path是一个字符串列表,其中的每个字符串都是一个目录名,
执行import语句时将在这些目录中查找模块。
变量sys.platform(一个字符串)是运行解释器的“平台”名称。这可能是表示操作系统的名
称(如sunos5或win32),也可能是表示其他平台类型(如Java虚拟机)的名称(如java1.4.0)——
如果你运行的是Jython。
变量sys.stdin、 sys.stdout和sys.stderr是类似于文件的流对象,表示标准的UNIX概念:
标准输入、标准输出和标准错误。简单地说, Python从sys.stdin获取输入(例如,用于input中),
并将输出打印到sys.stdout。有关文件和这三个流的详细信息,请参阅第11章。
举个例子,来看看按相反顺序打印参数的问题。从命令行调用Python脚本时,你可能指定一
些参数,也就是所谓的命令行参数。这些参数将放在列表sys.argv中,其中sys.argv[0]为Python
脚本名。按相反的顺序打印这些参数非常容易,如代码清单10-5所示。
代码清单10-5 反转并打印命令行参数
# reverseargs.py
import sys
args = sys.argv[1:]
args.reverse()
print(' '.join(args))
如你所见,我创建了一个sys.argv的副本。也可修改sys.argv,但一般而言,不这样做更安    
全,因为程序的其他部分可能依赖于包含原始参数的sys.argv。另外,注意到我跳过了sys.argv
的第一个元素,即脚本的名称。我使用args.reverse()反转这个列表,但不能打印这个操作的返
回值,因为它就地修改列表并返回None。下面是另一种解决方案:
print(' '.join(reversed(sys.argv[1:])))
最后,为美化输出,我使用了字符串的方法join。下面来尝试运行这个程序(假设使用的是
bash shell)。
$ python reverseargs.py this is a test
test a is this

2.os模块

 1 os:用于提供系统级别的操作
 2     os.getcwd()                 获取当前工作目录,即当前python脚本工作的目录路径
 3     os.chdir("dirname")         改变当前脚本工作目录;相当于shell下cd
 4     os.curdir                   返回当前目录: ('.')
 5     os.pardir                   获取当前目录的父目录字符串名:('..')
 6     os.makedirs('dir1/dir2')    可生成多层递归目录
 7     os.removedirs('dirname1')   若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
 8     os.mkdir('dirname')         生成单级目录;相当于shell中mkdir dirname
 9     os.rmdir('dirname')         删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
10     os.listdir('dirname')       列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
11     os.remove()                 删除一个文件
12     os.rename("oldname","new")  重命名文件/目录
13     os.stat('path/filename')    获取文件/目录信息
14     os.sep                      操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
15     os.linesep                  当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"
16     os.pathsep                  用于分割文件路径的字符串
17     os.name                     字符串指示当前使用平台。win->'nt'; Linux->'posix'
18     os.system("bash command")   运行shell命令,直接显示
19     os.environ                  获取系统环境变量
20     os.path.abspath(path)       返回path规范化的绝对路径
21     os.path.split(path)         将path分割成目录和文件名二元组返回
22     os.path.dirname(path)       返回path的目录。其实就是os.path.split(path)的第一个元素
23     os.path.basename(path)      返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素
24     os.path.exists(path)        如果path存在,返回True;如果path不存在,返回False
25     os.path.isabs(path)         如果path是绝对路径,返回True
26     os.path.isfile(path)        如果path是一个存在的文件,返回True。否则返回False
27     os.path.isdir(path)         如果path是一个存在的目录,则返回True。否则返回False
28     os.path.join(path1[, path2[, ...]])  将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
29     os.path.getatime(path)      返回path所指向的文件或者目录的最后存取时间
30     os.path.getmtime(path)      返回path所指向的文件或者目录的最后修改时间

3.time模块

 1 time:模块time包含用于获取当前时间、操作时间和日期、从字符串中读取日期、将日期格式化为
 2     字符串的函数。日期可表示为实数(从“新纪元” 1月1日0时起过去的秒数。“新纪元”是一个随
 3     平台而异的年份,在UNIX中为1970年),也可表示为包含9个整数的元组。例如,元组(2008, 1, 21, 12, 2, 56, 0, 21, 0)表示2008年1月21日12时2分56秒。
 4     模块time中一些重要的函数
 5     asctime([tuple]) 将时间元组转换为字符串
 6     localtime([secs]) 将秒数转换为表示当地时间的日期元组
 7     mktime(tuple) 将时间元组转换为当地时间
 8     sleep(secs) 休眠(什么都不做) secs秒
 9     strptime(string[, format]) 将字符串转换为时间元组
10     time() 当前时间(从新纪元开始后的秒数,以UTC为准)
11     函数time.asctime将当前时间转换为字符串,如下所示:
12     >>> time.asctime()
13     'Mon Jul 18 14:06:07 2016'
14     如果不想使用当前时间,也可向它提供一个日期元组(如localtime创建的日期元组)。要设
15     置更复杂的格式,可使用函数strftime,标准文档对此做了介绍。
16     函数time.localtime将一个实数(从新纪元开始后的秒数)转换为日期元组(本地时间)。如
17     果要转换为国际标准时间,应使用gmtime。
18     函数time.mktime将日期元组转换为从新纪元后的秒数,这与localtime的功能相反。
19     函数time.sleep让解释器等待指定的秒数。
20     函数time.strptime将一个字符串(其格式与asctime所返回字符串的格式相同)转换为日期
21     元组。(可选参数format遵循的规则与strftime相同,详情请参阅标准文档。)
22     函数time.time返回当前的国际标准时间,以从新纪元开始的秒数表示。虽然新纪元随平台
23     而异,但可这样进行可靠的计时:存储事件(如函数调用)发生前后time的结果,再计算它们的
24     差。
25     另外,还有两个较新的与时间相关的模块: datetime和timeit。前者提供了日期和时间算术
26     支持,而后者可帮助你计算代码段的执行时间。

 4.random模块

模块random包含生成伪随机数的函数,有助于编写模拟程序或生成随机输出的程序。请注意,
虽然这些函数生成的数字好像是完全随机的,但它们背后的系统是可预测的。如果你要求真正的
随机(如用于加密或实现与安全相关的功能),应考虑使用模块os中的函数urandom。模块random
中的SystemRandom类基于的功能与urandom类似,可提供接近于真正随机的数据。

模块random中一些重要的函数
    random() 返回一个0~1(含)的随机实数
    getrandbits(n) 以长整数方式返回n个随机的二进制位
    uniform(a, b) 返回一个a~b(含)的随机实数
    randrange([start], stop, [step]) 从range(start, stop, step)中随机地选择一个数
    choice(seq) 从序列seq中随机地选择一个元素
    shuffle(seq[, random]) 就地打乱序列seq
    sample(seq, n) 从序列seq中随机地选择n个值不同的元素

    函数random.random是最基本的随机函数之一,它返回一个0~1(含)的伪随机数。除非这正
    是你需要的,否则可能应使用其他提供了额外功能的函数。函数random.getrandbits以一个整数
    的方式返回指定数量的二进制位。
    向函数random.uniform提供了两个数字参数a和b时,它返回一个a~b(含)的随机(均匀分布
    的)实数。例如,如果你需要一个随机角度,可使用uniform(0, 360)。
    函数random.randrange是生成随机整数的标准函数。为指定这个随机整数所在的范围,
    你可像调用range那样给这个函数提供参数。例如,要生成一个1~10(含)的随机整数,可
    使用randrange(1, 11)或randrange(10) + 1。要生成一个小于20的随机正奇数,可使用randrange(1,
    20, 2)。
    函数random.choice从给定序列中随机(均匀)地选择一个元素。
    函数random.shuffle随机地打乱一个可变序列中的元素,并确保每种可能的排列顺序出现的
    概率相同。
    函数random.sample从给定序列中随机(均匀)地选择指定数量的元素,并确保所选择元素
    的值各不相同。
    注意 编写与统计相关的程序时,可使用其他类似于uniform的函数,它们返回按各种分布随机
    采集的数字,如贝塔分布、指数分布、高斯分布等。
    来看几个使用模块random的示例。在这些示例中,我将使用前面介绍的模块time中的几个函
    数。首先,获取表示时间段(2016年)上限和下限的实数。为此,可使用时间元组来表示日期(将
    星期、儒略日和夏令时都设置为1,让Python去计算它们的正确值),并对这些元组调用mktime:
    from random import *
    from time import *
    date1 = (2016, 1, 1, 0, 0, 0, -1, -1, -1)
    time1 = mktime(date1)
    date2 = (2017, 1, 1, 0, 0, 0, -1, -1, -1)
    time2 = mktime(date2)
    接下来,以均匀的方式生成一个位于该范围内(不包括上限)的随机数:
    >>> random_time = uniform(time1, time2)
    然后,将这个数转换为易于理解的日期。
    >>> print(asctime(localtime(random_time)))
    Tue Aug 16 10:11:04 2016
    在接下来的示例中,我们询问用户要掷多少个骰子、每个骰子有多少面。掷骰子的机制是使
    用randrange和for循环实现的。
    from random import randrange
    num = int(input('How many dice? '))
    sides = int(input('How many sides per die? '))
    sum = 0
    for i in range(num): sum += randrange(sides) + 1
    print('The result is', sum)
    如果将这些代码放在一个脚本文件中并运行它,将看到类似于下面的交互过程:
    How many dice? 3
    How many sides per die? 6
    The result is 10
    现在假设你创建了一个文本文件,其中每行都包含一种运气情况(fortune),那么就可使用
    前面介绍的模块fileinput将这些情况放到一个列表中,再随机地选择一种。
    # fortune.py
    import fileinput, random
    fortunes = list(fileinput.input())
    print random.choice(fortunes)
    在UNIX和macOS中,可使用标准字典文件/usr/share/dict/words来测试这个程序,这将获得一
    个随机的单词。
    $ python fortune.py /usr/share/dict/words
    dodge
    
    来看最后一个示例。假设你要编写一个程序,在用户每次按回车键时都发给他一张牌。另外,
    你还要确保发给用户的每张牌都不同。为此,首先创建“一副牌”,也就是一个字符串列表。
    >>> values = list(range(1, 11)) + 'Jack Queen King'.split()
    >>> suits = 'diamonds clubs hearts spades'.split()
    >>> deck = ['{} of {}'.format(v, s) for v in values for s in suits]
    刚才创建的这副牌并不太适合玩游戏。我们来看看其中一些牌:
    >>> from pprint import pprint
    >>> pprint(deck[:12])
    ['1 of diamonds',
    '1 of clubs',
    '1 of hearts',
    '1 of spades',
    '2 of diamonds',
    '2 of clubs',
    '2 of hearts',
    '2 of spades',
    '3 of diamonds',
    '3 of clubs',
    '3 of hearts',
    '3 of spades']
    太有规律了,对吧?这个问题很容易修复。
    >>> from random import shuffle
    >>> shuffle(deck)
    >>> pprint(deck[:12])
    ['3 of spades',
    '2 of diamonds',
    '5 of diamonds',
    '6 of spades',
    '8 of diamonds',
    '1 of clubs',
    '5 of hearts',
    'Queen of diamonds',
    'Queen of hearts',
    'King of hearts',
    'Jack of diamonds',
    'Queen of clubs']
    请注意,这里只打印了开头12张牌,旨在节省篇幅。如果你愿意,完全可以自己查看整副牌。
    最后,要让Python在用户每次按回车键时都给他发一张牌,直到牌发完为止,只需创建一个
    简单的while循环。如果将创建整副牌的代码放在了一个程序文件中,那么只需在这个文件末尾
    添加如下代码即可:
    while deck: input(deck.pop())
    请注意,如果在交互式解释器中尝试运行这个while循环,那么每当你按回车键时都将打印
    一个空字符串。这是因为input返回你输入的内容(什么都没有),然后这些内容将被打印出来。
    在普通程序中,将忽略input返回的值。要在交互式解释器中也忽略input返回的值,只需将其赋
    给一个你不会再理会的变量,并将这个变量命名为ignore。
View Code

 5.hashlib

hashlib
    用于加密相关的操作,代替了MD5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法
    import hashlib
    # ######## md5 ########
    hash = hashlib.md5()
    # help(hash.update)
    hash.update(bytes('admin', encoding='utf-8'))
    print(hash.hexdigest())
    print(hash.digest())
    ######## sha1 ########
    hash = hashlib.sha1()
    hash.update(bytes('admin', encoding='utf-8'))
    print(hash.hexdigest())
    # ######## sha256 ######## 
    hash = hashlib.sha256()
    hash.update(bytes('admin', encoding='utf-8'))
    print(hash.hexdigest())
    # ######## sha384 ####### 
    hash = hashlib.sha384()
    hash.update(bytes('admin', encoding='utf-8'))
    print(hash.hexdigest())
    # ######## sha512 ########
    hash = hashlib.sha512()
    hash.update(bytes('admin', encoding='utf-8'))
    print(hash.hexdigest())    以上加密算法虽然依然非常厉害,但时候存在缺陷,即:通过撞库可以反解。所以,有必要对加密算法中添加自定义key再来做加密。    
    import hashlib
    # ######## md5 ########
    hash = hashlib.md5(bytes('898oaFs09f',encoding="utf-8"))
    hash.update(bytes('admin',encoding="utf-8"))
    print(hash.hexdigest())
    python内置还有一个 hmac 模块,它内部对我们创建 key 和 内容 进行进一步的处理然后再加密    
    import hmac 
    h = hmac.new(bytes('898oaFs09f',encoding="utf-8"))
    h.update(bytes('admin',encoding="utf-8"))
    print(h.hexdigest())

6.re模块

正则表达式本身是一种小型的、高度专业化的编程语言,而在python中,通过内嵌集成re模块,可以直接调用来实现正则匹配。正则表达式模式被编译成一系列的字节码,然后由用C编写的匹配引擎执行。

  1     字符:
  2   . 匹配除换行符以外的任意字符
  3   \w    匹配字母或数字或下划线或汉字
  4   \s    匹配任意的空白符
  5   \d    匹配数字
  6   \b    匹配单词的开始或结束
  7   ^    匹配字符串的开始
  8   $    匹配字符串的结束
  9 
 10     次数:
 11   * 重复零次或更多次
 12   +    重复一次或更多次
 13   ?    重复零次或一次
 14   {n}    重复n次
 15   {n,}    重复n次或更多次
 16   {n,m}    重复n到m次
 17 
 18     math:从起始位置开始匹配,匹配成功返回一个对象,未匹配成功返回None
 19     match(pattern, string, flags=0)
 20      # pattern: 正则模型
 21      # string : 要匹配的字符串
 22      # falgs  : 匹配模式
 23          X  VERBOSE     Ignore whitespace and comments for nicer looking RE's.
 24          I  IGNORECASE  Perform case-insensitive matching.
 25          M  MULTILINE   "^" matches the beginning of lines (after a newline)
 26                         as well as the string.
 27                         "$" matches the end of lines (before a newline) as well
 28                         as the end of the string.
 29          S  DOTALL      "." matches any character at all, including the newline.
 30      
 31          A  ASCII       For string patterns, make \w, \W, \b, \B, \d, \D
 32                         match the corresponding ASCII character categories
 33                         (rather than the whole Unicode categories, which is the
 34                         default).
 35                         For bytes patterns, this flag is the only available
 36                         behaviour and needn't be specified.
 37           
 38          L  LOCALE      Make \w, \W, \b, \B, dependent on the current locale.
 39          U  UNICODE     For compatibility only. Ignored for string patterns (it
 40                         is the default), and forbidden for bytes patterns.
 41     
 42     # 无分组
 43     r = re.match("h\w+", origin)
 44     print(r.group())     # 获取匹配到的所有结果
 45     print(r.groups())    # 获取模型中匹配到的分组结果
 46     print(r.groupdict()) # 获取模型中匹配到的分组结果
 47     # 有分组
 48     # 为何要有分组?提取匹配成功的指定内容(先匹配成功全部正则,再匹配成功的局部内容提取出来)
 49     r = re.match("h(\w+).*(?P<name>\d)$", origin)
 50     print(r.group())     # 获取匹配到的所有结果
 51     print(r.groups())    # 获取模型中匹配到的分组结果
 52     print(r.groupdict()) # 获取模型中匹配到的分组中所有执行了key的组
 53 
 54     search:浏览整个字符串去匹配第一个,未匹配成功返回None
 55     search(pattern, string, flags=0)
 56     # 无分组
 57     r = re.search("a\w+", origin)
 58     print(r.group())     # 获取匹配到的所有结果
 59     print(r.groups())    # 获取模型中匹配到的分组结果
 60     print(r.groupdict()) # 获取模型中匹配到的分组结果
 61     # 有分组
 62     r = re.search("a(\w+).*(?P<name>\d)$", origin)
 63     print(r.group())     # 获取匹配到的所有结果
 64     print(r.groups())    # 获取模型中匹配到的分组结果
 65     print(r.groupdict()) # 获取模型中匹配到的分组中所有执行了key的组
 66 
 67     findall获取非重复的匹配列表;如果有一个组则以列表形式返回,且每一个匹配均是字符串;如果模型中有多个组,则以列表形式返回,且每一个匹配均是元祖;
 68     空的匹配也会包含在结果中
 69     findall(pattern, string, flags=0)
 70     # 无分组
 71     r = re.findall("a\w+",origin)
 72     print(r)
 73     # 有分组
 74     origin = "hello alex bcd abcd lge acd 19"
 75     r = re.findall("a((\w*)c)(d)", origin)
 76     print(r)
 77 
 78     sub:替换匹配成功的指定位置字符串
 79     sub(pattern, repl, string, count=0, flags=0)
 80     # pattern: 正则模型
 81     # repl   : 要替换的字符串或可执行对象
 82     # string : 要匹配的字符串
 83     # count  : 指定匹配个数
 84     # flags  : 匹配模式
 85     
 86     # 与分组无关
 87     origin = "hello alex bcd alex lge alex acd 19"
 88     r = re.sub("a\w+", "999", origin, 2)
 89     print(r)
 90 
 91     split:根据正则匹配分割字符串
 92     split(pattern, string, maxsplit=0, flags=0)
 93     # pattern: 正则模型
 94     # string : 要匹配的字符串
 95     # maxsplit:指定分割个数
 96     # flags  : 匹配模式
 97 
 98     # 无分组
 99     origin = "hello alex bcd alex lge alex acd 19"
100     r = re.split("alex", origin, 1)
101     print(r)
102     # 有分组
103     origin = "hello alex bcd alex lge alex acd 19"
104     r1 = re.split("(alex)", origin, 1)
105     print(r1)
106     r2 = re.split("(al(ex))", origin, 1)
107     print(r2)
108 
109     常用正则表达式
110     IP:
111     ^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$
112     手机号:
113     ^1[3|4|5|8][0-9]\d{8}$
114     邮箱:
115     [a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+
View Code

7.序列化模块 

 1 Python中用于序列化的两个模块
 2     json     用于【字符串】和 【python基本数据类型】 间进行转换
 3     pickle   用于【python特有的类型】 和 【python基本数据类型】间进行转换
 4     Json模块提供了四个功能:dumps、dump、loads、load
 5     pickle模块提供了四个功能:dumps、dump、loads、load        
 6     
 7     import pickle
 8     data = {'k1':123,'k2':'Hello'}
 9     p_str = pickle.dumps(data)#将数据通过特殊的形式转化为只有python语言认识的字符串
10     print(p_str)
11     
12     with open('D:/result.pr','w') as fp:  #将数据通过特殊的形式转换为只有python语言认识的字符串,并写入文件
13         pickle.dump(data,fp)
14     
15     import json
16     j_str = json.dumps(data)#将数据通过特殊的形式转化为只有python语言认识的字符串
17     print(j_str)
18     
19     with open('D:/result.json','w') as fp:#将数据通过特殊的形式转换为只有python语言认识的字符串,并写入文件
20         json.dump(data,fp)

8.requests模块

Python标准库中提供了urllib等模块以供Http请求,它需要巨量的工作,甚至包括各种方式覆盖,来完成最简单的任务。

 1 发送GET请求
 2     import urllib.request
 3     f = urllib.request.urlopen('http://www.webxml.com.cn//webservices/qqOnlineWebService.asmx/qqCheckOnline?qqCode=424662508')
 4     result = f.read().decode('utf-8')
 5     
 6     发送携带请求头的GET请求
 7     import urllib.request
 8     req = urllib.request.Request('http://www.example.com/')
 9     req.add_header('Referer', 'http://www.python.org/')
10     r = urllib.request.urlopen(req)
11     result = f.read().decode('utf-8')

Request是基于Python开发的HTTP库,其在python内置模块的基础上进行了高度份封装,从而使得python进行网络请求时,变得美好了许多,使用Requests可以轻易的王城浏览器可有的任何操作。

 1     1,安装模块
 2         pip3 install requests
 3     2,使用模块
 4         get请求
 5         # 1、无参数实例
 6         import requests     
 7         ret = requests.get('https://github.com/timeline.json')         
 8         print(ret.url)
 9         print(ret.text)
10                   
11         # 2、有参数实例         
12         import requests     
13         payload = {'key1': 'value1', 'key2': 'value2'}
14         ret = requests.get("http://httpbin.org/get", params=payload)         
15         print(ret.url)
16         print(ret.text)
17         post请求
18         # 1、基本POST实例
19         import requests         
20         payload = {'key1': 'value1', 'key2': 'value2'}
21         ret = requests.post("http://httpbin.org/post", data=payload)         
22         print(ret.text)         
23          
24         # 2、发送请求头和数据实例     
25         import requests
26         import json         
27         url = 'https://api.github.com/some/endpoint'
28         payload = {'some': 'data'}
29         headers = {'content-type': 'application/json'}         
30         ret = requests.post(url, data=json.dumps(payload), headers=headers)     
31         print(ret.text)
32         print(ret.cookies)
33 
34         其它请求
35         requests.get(url, params=None, **kwargs)
36         requests.post(url, data=None, json=None, **kwargs)
37         requests.put(url, data=None, **kwargs)
38         requests.head(url, **kwargs)
39         requests.delete(url, **kwargs)
40         requests.patch(url, data=None, **kwargs)
41         requests.options(url, **kwargs)
42          
43         # 以上方法均是在此方法的基础上构建
44         requests.request(method, url, **kwargs)

 


 

转载于:https://www.cnblogs.com/daidechong/p/9560814.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值