Python使用中破绽百出,Python常用模块

一、在运用requests发送请求,响应数据转成json提醒,未有可解码的json

Time 模块

时光模块常用的有如下三种。

import time
print(time.time())  # 1513319911.3789327 1970年到当前的总时间s。
print(time.strftime('%Y-%m-%d %X')) # 2017-12-15 14:38:31

元组格局显得时间:

print(time.localtime())
# time.struct_time(tm_year=2017, tm_mon=12, tm_mday=15, tm_hour=14, tm_min=53, tm_sec=39, tm_wday=4, tm_yday=349, tm_isdst=0)

print(time.localtime().tm_mon) # 12

UTC时间:

print(time.gmtime())

将格式化的日子转移为元组方式的光阴:

print(time.localtime(3243543544))
print(time.gmtime(3243543544))

岁月转移:

print(time.ctime(12334454))
print(time.asctime(time.gmtime()))

Sun May 24 02:14:14 1970
Fri Dec 15 07:38:07 2017

简介:

Python使用中破绽百出,Python常用模块。模块:用壹坨代码完结了有个别成效的代码集合。分为三种:

  • 自定义模块
  • 其三方模块
  • 置于模块

简介:

模块:用1坨代码落成了有个别意义的代码集合。分为三种:

  • 自定义模块
  • 其三方模块
  • 放到模块

化解办法:

random模块

import random

print(random.random())#(0,1)----float    大于0且小于1之间的小数

print(random.randint(1,3))  #[1,3]    大于等于1且小于等于3之间的整数

print(random.randrange(1,3)) #[1,3)    大于等于1且小于3之间的整数

print(random.choice([1,'23',[4,5]]))# 1或者23或者[4,5] 随机选取

print(random.sample([1,'23',[4,5]],2))#列表元素任意2个组合

print(random.uniform(1,3))#大于1小于3的小数,如1.927109612082716 


item=[1,3,5,7,9]
random.shuffle(item) #打乱item的顺序,相当于"洗牌"
print(item)

浮动随机验证码:

import random
def make_code(n):
    res=''
    for i in range(n):
        s1=chr(random.randint(65,90))
        s2=str(random.randint(0,9))
        res+=random.choice([s1,s2])
    return res

print(make_code(4))

python去找模块的路线

www.5929.com 1

里头,第3方模块安装的任务

www.5929.com 2

提示:第3方模块名不能够和停放以及第3方模块重名

导入模块:from lib.account import login

 

python去找模块的路子

www.5929.com 3

内部,第壹方模块安装的地方

www.5929.com 4

提示:第1方模块名无法和松开以及第二方模块重名

导入模块:from lib.account import login

 

那是由于,发送请求的数目,存在不当,响应出错比如404
400,所以找不到能够解码的json

os模块常用函数

os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
os.chdir(“dirname”) 改变近期剧本工作目录;相当于shell下cd
os.curdir 重返当前目录: (‘.’)
os.pardir 获取当前目录的父目录字符串名:(‘..’)
os.makedirs(‘dirname1/dirname贰’) 可生成多层递归目录
os.removedirs(‘dirname一’)
若目录为空,则删除,并递归到上一流目录,假如也为空,则删除,依此类推
os.mkdir(‘dirname’) 生成单级目录;也就是shell中mkdir dirname
os.rmdir(‘dirname’)
删除单级空目录,若目录不为空则不大概删除,报错;相当于shell中rmdir
dirname
os.listdir(‘dirname’)
列出钦定目录下的持有文件和子目录,包蕴隐藏文件,并以列表格局打字与印刷
os.remove() 删除二个文本
os.rename(“oldname”,”newname”) 重命名文件/目录
os.stat(‘path/filename’) 获取文件/目录消息
os.sep 输出操作系统特定的门径分隔符,win下为”\”,Linux下为”/”
os.linesep 输出当前平台利用的行终止符,win下为”\t\n”,Linux下为”\n”
Python使用中破绽百出,Python常用模块。os.pathsep 输出用于私分文件路径的字符串 win下为;,Linux下为:
os.name 输出字符串提醒当前采纳平台。win->’nt’; Linux->’posix’
os.system(“bash command”) 运维shell命令,间接显示
os.environ 获取系统环境变量
os.path.abspath(path) 重临path规范化的相对路径
os.path.split(path) 将path分割成目录和文件名2元组再次回到
os.path.dirname(path)
重回path的目录。其实便是os.path.split(path)的首先个因素
os.path.basename(path)
重临path最终的文书名。怎么样path以/或\最后,那么就会重回空值。即os.path.split(path)的第二个要素
os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False
os.path.isabs(path) 如若path是相对路径,再次回到True
os.path.isfile(path) 就算path是三个留存的公文,再次来到True。不然重返False
os.path.isdir(path)
假设path是一个设有的目录,则赶回True。不然再次回到False
os.path.join(path1[, path2[, …]])
将四个途径组合后回来,第二个绝对路径在此以前的参数将被忽略
os.path.getatime(path) 重回path所指向的文本或许目录的结尾存取时间
os.path.getmtime(path) 再次回到path所指向的文书可能目录的终极修改时间
os.path.getsize(path) 返回path的大小

os.path.normcase()此函数在Linux和mac平台上,该函数会原样重临path,在windows平台上会将路径中的全部字符转换为小写的花样,并将斜转换为反斜杠:

# Linux 平台:
>>> import os
>>> os.path.normcase('c:/windows\\system32\\')
'c:/windows\\system32\\'

# Windows平台:
>>> import os
>>> os.path.normcase('c:/windows\\system32\\')
'c:\\windows\\system32\\'

使用.. 可以象征上一流目录。对目录举行格式化:

#Windows 平台:
>>> os.path.normpath('c://windows\\System\\../Temp/')
'c:\\windows\\Temp'

# Linux 平台:
>>> os.path.normpath('/etc/system/sysconfig/\\\\network/\\\ifconfig/../..')
'/etc/system/sysconfig'

获取文件目录的二种艺术(有些许层,就选拔多少次os.path.dirname):

方式一:
>>> os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath('/etc/sysconfig/network-scripts/ifcfg-eth0'))))
'/etc'

方式二: os.pardir想当与  ..    sys.path是一个目录列表.使用insert(0,..)的方式可以优先将目录加入到列表的最前面.
>>> topdir = os.path.normpath(os.path.join(os.path.abspath('/etc/sysconfig/network-scripts/ifcfg-eth0'),os.pardir,os.pardir,os.pardir))
>>> print(topdir)
/etc
>>> sys.path.insert(0,topdir)

添加sys.path路径:

www.5929.com 5

 

添加sys.path路径:

www.5929.com 6

 

示范如下:

sys模块

sys.argv 命令行参数List,第三个因素是先后本身路径
sys.exit(n) 退出程序,平常退出时exit(0)
sys.version 获取Python解释程序的版本音讯
sys.maxint 最大的Int值
sys.path 重返模块的探寻路径,初叶化时利用PYTHONPATH环境变量的值
sys.platform 再次来到操作系统平台名称

打字与印刷进度条的演示:

>>> print('[%-20s]' %'##')
[##                  ]
# -20 表示宽度,[%-20s]是固定写法,后面引用字符变量 %'##'

'\r' 表示跳到行首打印

#=========实现打印进度条函数==========
import sys
import time

def progress(percent,width=50):
    if percent >= 1:
        percent=1
    show_str=('[%%-%ds]' %width) %(int(width*percent)*'#')
    print('\r%s %d%%' %(show_str,int(100*percent)),file=sys.stdout,flush=True,end='')

os模块(和连串有关)

os.stat(“path“)  获取文件目录音信

www.5929.com 7

os.path.dirname(path)  获取文件所在的目录

www.5929.com 8

os.path.exists(path)  假使path存在则赶回true,否则再次回到false

www.5929.com 9

os.path.join(path1[,path2[,…]])  将三个路子组合后回去,第二个相对路径在此之前的参数将被忽视

www.5929.com 10

 

os模块(和系统有关)

os.stat(“path“)  获取文件目录音信

www.5929.com 11

os.path.dirname(path)  获取文件所在的目录

www.5929.com 12

os.path.exists(path)  假诺path存在则赶回true,不然再次回到false

www.5929.com 13

os.path.join(path1[,path2[,…]])  将多少个路子组合后回到,第3个相对路径在此以前的参数将被忽视

www.5929.com 14

 

postdata = '''{'userName':'13718651996',
            'passwd':'yhlxxxx870120',
            'validateCode':'abc',
            'rememberMe':'true'}'''
url = 'https://secure.elong.com/passport/ajax/elongLogin'
response = Session().post(url,data=postdata)
print(response.json())

shutil 模块

shutil模块重若是对文本,文件夹,和压缩包进行操作处理的模块,相当于系统中常用的公文操作命令。
shutil.copyfileobj(fsrc, fdst[, length])
:复制文件,借使目的文件存在,则覆盖目的文件。

import shutil
shutil.copyfileobj(open('old.xml', 'r'), open('new.xml', 'w'))

shutil.copyfile(src, dst) 拷贝文件。

shutil.copyfile('new.xml', 'f2.log')

shutil.copymode(src, dst)
仅拷贝权限。文件的剧情,所属用户和所属组都不变。
shutil.copystat(src, dst) 仅拷贝状态消息,包罗: mode
bits,atime,mtime,flages.
shutil.copy(src,dst) : 拷贝文件和权力。

shutil.copy('f2.log','f1.log')

shutil.copy2(src, dst) 拷贝文件和状态音讯

shutil.copy2('f1.log', 'f2.log')

shutil.copytree(src, dst, symlinks=False, ignore=None)
递归的正片文件目录,和shutil.ignore_patterns(*patterns)连用,排除不必要拷贝的内容:

shutil.copytree('folder1', 'folder2', ignore=shutil.ignore_patterns('*.pyc', 'tmp*')) 
#目标目录不能存在,注意对folder2目录父级目录要有可写权限,ignore的意思是排除 

拷贝软连接:

import shutil

shutil.copytree('f1', 'f2', symlinks=True, ignore=shutil.ignore_patterns('*.pyc', 'tmp*'))
# 通常的拷贝都把软连接拷贝成硬链接,即对待软连接来说,创建新的文件

shutil.rmtree(path[, ignore_errors[, onerror]])递归的去除文件。

shutil.rmtree('folder1')

shutil.move(src, dst)递归的去运动文件,它就像mv 命令,其实正是重命名。

shutil.move('folder1', 'folder3')

shutil.make_archive(base_name, format,...)
创设压缩包,并再次回到文件路径,如 zip,tar。

  • base_name:压缩包的公文名,也得以是压缩包的门道。只是文件名时,则保留当前至当前目录,不然保存至钦定路线。如
    data_bak =>保存至近年来路。如:/tmp/data_bak =>保存至/tmp/
  • format:压缩包种类,“zip”, “tar”, “bztar”,“gztar”
  • root_dir:要减少的文本夹路径(暗许当前目录)
  • owner:用户,暗中认可当前用户
  • group: 组,私下认可当前组
  • logger:用于记录日志,经常是logging.Logger对象

示例:

#将 /data 下的文件打包放置当前程序目录
import shutil
ret = shutil.make_archive("data_bak", 'gztar', root_dir='/data')

#将 /data下的文件打包放置 /tmp/目录
import shutil
ret = shutil.make_archive("/tmp/data_bak", 'gztar', root_dir='/data') 

shutil 对压缩包的处理是调用 ZipFile 和 TarFile 多个模块来举行的.

 hashlib模块:  (加密辅车相依操作)

用户名,密码保存的时候必须加密

md五加密是不得以反解的。

www.5929.com 15

因为每种电脑上的md5加密出来的数额都是壹律的,所以会被别人拿走加密对应的用户名,密码。所以要团结再定制,使md五加密出来的多寡只设有本身的总计机上。

www.5929.com 16

加密报到注册实例:

www.5929.com 17

 

 www.5929.com 18

 

 hashlib模块:  (加密相关操作)

用户名,密码保存的时候必须加密

md五加密是不能反解的。

www.5929.com 19

因为种种电脑上的md5加密出来的数据都以千篇一律的,所以会被旁人取得加密相应的用户名,密码。所以要本身再定制,使md五加密出来的数目只存在本身的微型计算机上。

www.5929.com 20

加密登录注册实例:

www.5929.com 21

 

 www.5929.com 22

 

实质上从图上很扎眼能观察难点,因为postdata是字符串类型,不是dict字典

json&pickle模块

把指标(变量)从内部存储器中变成可存款和储蓄或传输的经过称之为种类化,在Python中叫pickling.

  • json:
    json匡助具备通用项目标操作,对于python特有的功力不协助,就有很好的跨平台性。
    在运用eval执行字符串表明式是有局限性的,对于普通的数据类型,json.loads和eval都能用,但遇到特别类别的时候,eval就不管用了,所以eval的要紧照旧日常用来推行3个字符串表明式,并重临说明式的值。
    接纳json.dump()能够将字典函数等类型转换为字符串类型,方便存款和储蓄:

import  json
dic = {'name': 'alvin', 'age': 23, 'sex': 'male'}
print(type(dic))

j=json.dumps(dic)
print(type(j))
print(j)

输出:
<class ‘dict’>
<class ‘str’>
{“name”: “alvin”, “age”: 23, “sex”: “male”}

选取json.loads()形式得以将适合json格式的数据实行系列化:

# 读取json.txt的文件内容为:{"name": "alvin", "age": 23, "sex": "male"}
import  json
with open('json.txt','r') as f2:
    data=json.loads(f2.read())
    print(type(data))
    print(data)

输出:
<class ‘dict’>
{‘name’: ‘alvin’, ‘age’: 23, ‘sex’: ‘male’}

  • pickle: 是python
    特有类别化操作,能够种类化函数等特别连串。与json的施用方法接近。

import pickle
def func():
    print('this is func')    
j=pickle.dumps(func)
print(j)

输出的是bytes类型:
b’\x80\x03c__main__\nfunc\nq\x00.’

反类别化:

import pickle
f=open('序列化对象_pickle','rb')
data=pickle.loads(f.read())  #  等价于data=pickle.load(f)
print(data['age'])   

停放的模块

www.5929.com 23

__doc__   是py文件的笺注

www.5929.com 24

__file__  #文件本身的路线

www.5929.com 25

__package__  当前py文件在哪些文件夹下,若是三个途径用.连接

__cached__  做缓存用的

__name__  (重要)

__name__ == ‘__main__’的应用:

主文件: 调用函数前,必须加__name__ == ‘__main__’

 

json序列化  (Json就是字符串)

json.loads  用于将列表、字典、元组方式的字符串,转换为对应的字典,列表,元组(注意报错,格式)

www.5929.com 26

www.5929.com 27

留神上海体育地方的格式,报错。

json.dumps()  将获得的字典、列表,元组转换为相应的字符串

www.5929.com 28

json.dump()  得到剧情再写入相应的文件内

 

停放的模块

www.5929.com 29

__doc__   是py文件的笺注

www.5929.com 30

__file__  #文件本人的路径

www.5929.com 31

__package__  当前py文件在哪些文件夹下,倘若几个途径用.连接

__cached__  做缓存用的

__name__  (重要)

__name__ == ‘__main__’的应用:

主文件: 调用函数前,必须加__name__ == ‘__main__’

 

json体系化  (Json便是字符串)

json.loads  用于将列表、字典、元组情势的字符串,转换为对应的字典,列表,元组(注意报错,格式)

www.5929.com 32

www.5929.com 33

注意上海教室的格式,报错。

json.dumps()  将获得的字典、列表,元组转换为相应的字符串

www.5929.com 34

json.dump()  得到内容再写入相应的公文内

 

如上海教室代码假设实施报如下错误:

shelve模块

shelve模块和pickle功效看似,可是比pickle模块简单,唯有三个open函数,重返类似字典的对象,可读可写;key必须为字符串,而值能够是python所支撑的数据类型。

import shelve

f=shelve.open(r'sheve.txt')
# f['stu1_info']={'name':'egon','age':18,'hobby':['piao','smoking','drinking']}
# f['stu2_info']={'name':'gangdan','age':53}
# f['school_info']={'website':'http://www.pypy.org','city':'beijing'}

print(f['stu1_info']['hobby'])
f.close()

configparser模块:  (打开,读取特定格式的公文)(暗许文件都以字符串)

www.5929.com 35

 

 www.5929.com 36

 

configparser模块:  (打开,读取特定格式的公文)(暗中同意文件都以字符串)

www.5929.com 37

 

 www.5929.com 38

 

www.5929.com 39

xml模块

xml是先后之间开展多少交互的情商,在稍微应用中还会动用XML协议。xml和json类似,也是跨平台,xml协议在相继语言中都以支撑的。
xml文件是2个树形结构的多少,python 的xml模块帮忙对xml文件的操作。
xml分为多个部分:标签(tag),属性(attrib),内容(text)。标签一般有多级标签。

# 获取xml的根标签
import xml.etree.ElementTree as ET

tree = ET.parse("xmltest.xml")
root = tree.getroot()
print(root.tag)

#遍历xml文档, 使用多层循环,获取多层数据
for child in root:
    print('========>',child.tag,child.attrib,child.attrib['name'])
    for i in child:
        print(i.tag,i.attrib,i.text)

#只遍历year 节点
for node in root.iter('year'):  # root.iter()表示从根节点开始扫描整个xml
    print(node.tag,node.text)

#修改
for node in root.iter('year'):
    new_year=int(node.text)+1
    node.text=str(new_year)
    node.set('updated','yes')   # tag.set用于设置属性
    node.set('version','1.0')
tree.write('test.xml')

#删除node
for country in root.findall('country'): #  tag.findall 只查找tag的下一层。 tag.find只查找tag下一层的一个符合数据。
   rank = int(country.find('rank').text)
   if rank > 50:
       root.remove(country)
tree.write('output.xml')

在country内添加(append)节点year2

import xml.etree.ElementTree as ET

tree = ET.parse("a.xml")
root=tree.getroot()
for country in root.findall('country'):    # 使用两层for循环遍历整个标签下的数据
    for year in country.findall('year'):  
        if int(year.text) > 2000:               #  标签.text 用于指定标签对应的数据项
            year2=ET.Element('year2')     #
            year2.text='新年'
            year2.attrib={'update':'yes'}
            country.append(year2) # 往country节点下添加子节点

tree.write('a.xml.swap')

shutil模块(高级文件、文件夹、压缩包处理模块)

www.5929.com 40

www.5929.com 41

www.5929.com 42

 

shutil模块(高级文件、文件夹、压缩包处理模块)

www.5929.com 43

www.5929.com 44

www.5929.com 45

 

化解办法,eval()函数将字符串,转换来字典;如下所示

configparser 模块

在运用mysql只怕openstack的布署文件中,常常能够看到如下的配置文件格式:

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid

采取configparser能够很有利的读写配置音讯的内容.

import configparser

config=configparser.ConfigParser()
config.read('my.cnf')
print(config.sections())   # 查看标题
print(config.options(config.sections()[0])) # 查看某个标题下的配置项
print(config.get('mysqld','socket')) # 查看某个标题下的某个配置项的值

输出:

['mysqld', 'mysqld_safe']
['datadir', 'socket', 'symbolic-links']
/var/lib/mysql/mysql.sock

假使获得的值中蕴藏数字和布尔值,可以选拔get的主意一贯转换为相应的类别。

res1=config.getint('title','conf_option')
res2=config.getfloat('title','conf_option')
res3=config.getboolean('title','conf_option')

修改配置:

config.remove_section('mysqld') # 删除整个标题区域
config.remove_option('mysqld_safe','log-error') # 删除指定title的配置项
config.write(open('my.cnf','w'))  # 写入文件

增加计划:

config.add_section('client')   # 添加一个标题
config.set('client','socket','/var/run/mysql.sock') # 在client标题下添加 socket = /var/run/mysql.sock
config.write(open('my.cnf','w'))  # 写入文件

subprocess模块

www.5929.com 46

 

logging模块(主要)  (用于便捷记录日志且线程安全的模块)

www.5929.com 47

www.5929.com 48

www.5929.com 49

www.5929.com 50

www.5929.com 51

 

www.5929.com,subprocess模块

www.5929.com 52

 

logging模块(主要)  (用于便捷记录日志且线程安全的模块)

www.5929.com 53

www.5929.com 54

www.5929.com 55

www.5929.com 56

www.5929.com 57

 

postdata = '''{'userName':'13718651996',
            'passwd':'yhlxxxx870120',
            'validateCode':'abc',
            'rememberMe':'true'}'''
url = 'https://secure.elong.com/passport/ajax/elongLogin'
request = Session().post(url,data=eval(postdata))
print(request.json())

hashlib模块

hash:一种算法 ,叁.x里代替了md5模块和sha模块,首要提供 SHA壹, SHA2二四,
SHA25陆, SHA3八四, SHA51二 ,MD五 算法
哈希算法的特性:
壹.内容1律则hash运算结果一致,内容有点改变则hash值则变
二.不可逆推
三.平等算法:无论校验多少长度的数码,获得的哈希值长度固定。

对数据举行校验:

import hashlib
# 相同的内容校验结果一样
n=hashlib.md5('helloworld'.encode('utf-8'))   # 
print(n.hexdigest())

m=hashlib.md5('hello'.encode('utf-8'))
m.update('world'.encode('utf-8'))
print(m.hexdigest())

输出:

fc5e038d38a57032085441e7fe7010b0
fc5e038d38a57032085441e7fe7010b0

对文本举办校验:

import hashlib
m=hashlib.md5()
with open('my.cnf','rb') as f:
    for line in f:
        m.update(line)
print(m.hexdigest())

# 文件较大时不推荐使用一次读取文件的方式
m=hashlib.md5()
with open('my.cnf','rb') as f:
    m.update(f.read())
print(m.hexdigest())

在做加密算法时,通过撞库能够反解密码,所以1般对加密算法添加salt实行加密:

# 加盐处理
password='123456'
m=hashlib.md5('add salt code str'.encode('utf-8'))
m.update(password.encode('utf-8'))
print(m.hexdigest())

# 实际的处理字符串
n=hashlib.md5('add salt code str123456'.encode('utf-8'))
print(n.hexdigest())

出口的结果同样:

b7709cddef6897748d66663afdb5a003
b7709cddef6897748d66663afdb5a003


hashlib模块类似的还有1个hmac模块,那个模块用法和hashlib壹样,不过必须保险第陆个字符一样,才能校验出1致的结果:

import hmac

h=hmac.new('hello'.encode('utf-8'))
h.update('world'.encode('utf-8'))
print(h.hexdigest())

k=hmac.new('hello'.encode('utf-8'))
k.update('wor'.encode('utf-8'))
k.update('ld'.encode('utf-8'))
print(k.hexdigest())

# 这里输出和上面两种结果不一致
g=hmac.new('hell'.encode('utf-8'))
g.update('oworld'.encode('utf-8'))
print(g.hexdigest())

输出:

0e2564b7e100f034341ea477c23f283b
0e2564b7e100f034341ea477c23f283b
e705e80d60a2e0851a23dcd1773099ab

有人恐怕会说,你那不是借题发挥吗?把postdata直接定义成字典不就行了;你说的科学确实能够如此

suprocess 模块

suprocess模块用于调用系统的shell命令.
执行命令之后,能够将指令的实行结果个别通过管道赋值给专业输出和不当输出:

import subprocess

res=subprocess.Popen(r'ipconfig|findstr 192.168',shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
print(res.stdout.read().decode('gbk'))
print(res.stderr.read().decode('gbk'))

输出结果:

   IPv4 地址 . . . . . . . . . . . . : 192.168.20.191
   默认网关. . . . . . . . . . . . . : 192.168.20.254
   IPv4 地址 . . . . . . . . . . . . : 192.168.56.1

1经产生错误,提醒新闻就会从stderr中输出。
在linux平台也足以应用相同的用法。
也足以运用stdin将事先的出口结果输入到近年来的吩咐中实践,重回结果:

import subprocess

res=subprocess.Popen(r'ipconfig',shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
res1=subprocess.Popen(r'findstr 192.168.20',shell=True,stdin=res.stdout,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
print(res1.stdout.read().decode('gbk'))

输出结果:

   IPv4 地址 . . . . . . . . . . . . : 192.168.20.191
   默认网关. . . . . . . . . . . . . : 192.168.20.254
postdata = {'userName':'13718651996',
            'passwd':'yhlxxxx870120',
            'validateCode':'abc',
            'rememberMe':'true'}
url = 'https://secure.elong.com/passport/ajax/elongLogin'
request = Session().post(url,data=postdata)
print(request.json())

然而如果以下那串数据,存款和储蓄在数据库中,可能excel中,读出来的时候暗中同意正是字符串,倘使读出来直接动用就会油可是生本文的一无所长,

由此哪儿错了那些要驾驭,那是1个小细节;调节和测试输出,发现输出跟以下是均等的,

尚无错呀那是字典呢{‘xxxx’:’xxx’……….},然则它正是字符串。简单被忽略,所以还要采取eval(postdata)函数转成字典

{'userName':'13718651996',
            'passwd':'yhlxxxx870120',
            'validateCode':'abc',
            'rememberMe':'true'}

正确代码:

postdata = '''{'userName':'13718651996',
            'passwd':'yhlxxxx870120',
            'validateCode':'abc',
            'rememberMe':'true'}'''
url = 'https://secure.elong.com/passport/ajax/elongLogin'
request = Session().post(url,data=eval(postdata))
print(request.json())

------------------------------作者是华侈的分隔线----------------------------------

二、join拼接路径

os.path.join拼接路径,遭遇的题材,平日会把自身绕进去

 

str = r'd:\PHJ\Reporter\LOGS'
#报告文件路径
reporPath = os.path.join(str,'report')
isExistPath(reporPath) #创建文件夹

print(reporPath)

imgPath = os.path.join(reporPath,'\\Image')
print(imgPath)

 

谬误输出输出:

d:\PHJ\Reporter\LOGS\report
d:\Image

我们目的在于结果:

d:\PHJ\Reporter\LOGS\report
d:\PHJ\Reporter\LOGS\report\Image

是或不是很想获得,难题终究出在哪儿,这几个题材让自家庭纠纷结了旷日持久,3个不太上心的小标题。

www.5929.com 58

不错,我们便是拼接的时候,多了三个返斜扛。去掉后难点消除。

 

三、写完项目,直接在微型计算机中双击py文件,报文件中援引的包找不到

项目协会,要执行run文件夹下的run.py ;报找不到run文件中援引的包

www.5929.com 59

缘由:双击执行的时候,不会自行进化搜索包,只会在当下文件夹及子文件夹中检索

那么如何做吧,把推行文书,在档次根目录下建个run.py做为执行入口,难题化解。

www.5929.com 60

 

您恐怕会说了,那样做,小编有些引用路径的地点不对了,那笔者揣摸是获得路径的方法是

os.getcur
 获取当前路线,那样1来,你各样文件用的路线都以最近引用文件所在的路线

所以建议起个gl文件,用来储存路径。等音讯。

os.path.abspath(os.path.dirname(__file__))
用那几个获得当前路线,而不要用os.getcur

要不,即使你把收获路径这几个,配置到gl也正是独自三个py中,那么区别地点调用。路径也会区别。

 

Leave a Comment.