sys、os、hashlib、time模块和字符串格式化

stackoverflow.com程序员问题搜索网站

模块,用一砣代码实现了某个功能的代码集合。 

类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合。而对于一个复杂的功能来,可能需要多个函数才能完成(函数又可以在不同的.py文件中),n个 .py 文件组成的代码集合就称为模块

模块分为:

自定义模块

内置模块

第三方模块

导入模块:

导入模块有以下几种方法:

import module
from module.xx.xx import xx
from module.xx.xx import xx as rename  
from module.xx.xx import *

导入模块其实就是告诉Python解释器去解释那个py文件

  • 导入一个py文件,解释器解释该py文件
  • 导入一个包,解释器解释该包下的 __init__.py 文件

 

从复杂的文件夹里调用模块:三种调用lib文件夹里login模块 的方法   一般推荐前两种方法from...import... 或import...

如果使用import.lib.account 那么以后引用的时候或者使用它里面函数时,还需要从新写一边lib.account.login()如果只写account.login(),是执行不了的

如果调用的模块路径里没有,就可以添加路径

 

sys:提供python解释器相关的操作

sys.argv :获取到脚本传入的参数,命令行参数list,第一个元素是程序本身路径

 sys.path:返回模块的搜索路径。场景:在实际开发中,默认包含了当前目录为搜索路径,所以,当前目录下的模块和子模块均可以正常访问。但是若一个模块需要import平级的不同目录的模块,或者上级目录里面的模块,就可以通过修改path来实现。

sys.version:获取python当前的版本

sys.platform:返回操作系统版本

sys.stdout.write():输出之后 不换行

按百分比输出*进度条

 

os

用于提供对解释器相关的操作

os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
os.chdir("dirname")  改变当前脚本工作目录;相当于shell下cd
os.curdir  返回当前目录: ('.')
os.pardir  获取当前目录的父目录字符串名:('..')
os.makedirs('dirname1/dirname2')    可生成多层递归目录
os.removedirs('dirname1')    若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
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"
os.pathsep    输出用于分割文件路径的字符串
os.name    输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
os.system("bash command")  运行shell命令,直接显示
os.environ  获取系统环境变量
os.path.abspath(path)  返回path规范化的绝对路径
os.path.split(path)  将path分割成目录和文件名二元组返回
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所指向的文件或者目录的最后修改时间

 

合并路径:

 

 hashlib

用于加密相关的操作,代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法

hashlib使用非常简单、方便.是通过一种加密的规则让你的字符串生成一段新的字符串,是不可反解的,只有通过撞库才有可能找到对应的密码。但是别人也可以通过这套规则来生成一样的字符串,所以就需要在MD5后面添加参数,相当于你制定了一套规则,这样出来的字符串就独一无二了

详情点击

hashlib里面包含很多种加密方法,import hashlib 就可以用了,例如:MD5

import hashlib
 
# ######## md5 ########
 
hash = hashlib.md5()
hash.update('admin')
print hash.hexdigest()
 
# ######## sha1 ########
 
hash = hashlib.sha1()
hash.update('admin')
print hash.hexdigest()
 
# ######## sha256 ########
 
hash = hashlib.sha256()
hash.update('admin')
print hash.hexdigest()
 
 
# ######## sha384 ########
 
hash = hashlib.sha384()
hash.update('admin')
print hash.hexdigest()
 
# ######## sha512 ########
 
hash = hashlib.sha512()
hash.update('admin')
print hash.hexdigest()
View Code

hashlib使用非常简单、方便.是通过一种加密的规则让你的字符串生成一段新的字符串,是不可反解的,只有通过撞库才有可能找到对应的密码。但是别人也可以通过这套规则来生成一样的字符串,所以就需要在MD5后面添加参数,相当于你制定了一套规则,这样出来的字符串就独一无二了

import hashlib
 
# ######## md5 ########
 
hash = hashlib.md5('898oaFs09f')
hash.update('admin')
print hash.hexdigest()

 

 用户登录和注册:

import hashlib
def md5(arg):
    oo = hashlib.md5(bytes('gfdsggg',encoding='utf-8'))
    oo.undate(bytes(arg,encoding='utf-8'))
    return oo.hexdigest()
def login(user,pwd):
    with open("xx",'r',encoding='utf-8') as f:
        for line in f:
            u, p =line.strip().split("|")
            if u == user and p == md5(pwd):
                return True
def register(user,pwd):
    with open("xx",'a',encoding='utf-8') as f:
        temp = user + "|" + md5(pwd)
        f.write(temp)

i =input("1,登录:2,注册")
if i == "2":
    user = input("用户名:")
    pwd = input("密码:")
    register(user,pwd)
elif i == "1":
    user = input("用户名:")
    pwd = input("密码:")
    r = login(user,pwd)
    if r:
        print("成功")
    else:
        print("失败")

 

 

time模块:gmtime是将时间戳改为0时区,localtime是改为当前时区

  • 时间戳               1970年1月1日之后的秒,即:time.time()
  • 格式化的字符串    2014-11-11 11:11,    即:time.strftime('%Y-%m-%d')
  • 结构化时间          元组包含了:年、日、星期等... time.struct_time    即:time.localtime()

time.time()时间戳,从1970.1.1日0时开始到当时一共过了多少秒

time.ctime:当前系统时间

time.sleep()中间间隔多久

计算时间:后面的参数还可以加weeks等时间

 

 

字符串格式化:分两种,一种是百分号,另一种是format方式

1、百分号方式

格式:%[(name)][flags][width].[precision]typecode  中括号里代表的是可有可无,有没有都不报错

  • (name)      可选,用于选择指定的key
  • flags          可选,可供选择的值有:
    • +       右对齐;正数前加正好,负数前加负号;
    • -        左对齐;正数前无符号,负数前加负号;
    • 空格    右对齐;正数前加空格,负数前加负号;
    • 0        右对齐;正数前无符号,负数前加负号;用0填充空白处
  • width         可选,占有宽度
  • .precision   可选,小数点后保留的位数
  • typecode    必选
    • s,获取传入对象的__str__方法的返回值,并将其格式化到指定位置
    • r,获取传入对象的__repr__方法的返回值,并将其格式化到指定位置
    • c,整数:将数字转换成其unicode对应的值,10进制范围为 0 <= i <= 1114111(py27则只支持0-255);字符:将字符添加到指定位置
    • o,将整数转换成 八  进制表示,并将其格式化到指定位置
    • x,将整数转换成十六进制表示,并将其格式化到指定位置
    • d,将整数、浮点数转换成 十 进制表示,并将其格式化到指定位置
    • e,将整数、浮点数转换成科学计数法,并将其格式化到指定位置(小写e)
    • E,将整数、浮点数转换成科学计数法,并将其格式化到指定位置(大写E)
    • f, 将整数、浮点数转换成浮点数表示,并将其格式化到指定位置(默认保留小数点后6位)
    • F,同上
    • g,自动调整将整数、浮点数转换成 浮点型或科学计数法表示(超过6位数用科学计数法),并将其格式化到指定位置(如果是科学计数则是e;)
    • G,自动调整将整数、浮点数转换成 浮点型或科学计数法表示(超过6位数用科学计数法),并将其格式化到指定位置(如果是科学计数则是E;)
    • %,当字符串中存在格式化标志时,需要用 %%表示一个百分号

注:Python中百分号格式化是不存在自动将整数转换成二进制表示的方式

常用格式化:

 1 tpl = "i am %s" % "alex"
 2  
 3 tpl = "i am %s age %d" % ("alex", 18)
 4  
 5 tpl = "i am %(name)s age %(age)d" % {"name": "alex", "age": 18}
 6  
 7 tpl = "percent %.2f" % 99.97623
 8  
 9 tpl = "i am %(pp).2f" % {"pp": 123.425556, }
10  
11 tpl = "i am %.2f %%" % {"pp": 123.425556, }

 

flags:'+'代表右对齐,如果后面传入数字,那就前面加正号,'-'代表左对齐  width可以写长度,如果后面传入是负数,那就前面加负号

.[precision]:后面保留几位小数

 

%d:只能接收整数

%f:浮点,只能接收小数

format格式化:

[[fill]align][sign][#][0][width][,][.precision][type]

  • fill           【可选】空白处填充的字符
  • align        【可选】对齐方式(需配合width使用)
    • <,内容左对齐
    • >,内容右对齐(默认)
    • =,内容右对齐,将符号放置在填充字符的左侧,且只对数字类型有效。 即使:符号+填充物+数字
    • ^,内容居中
  • sign         【可选】有无符号数字
    • +,正号加正,负号加负;
    •  -,正号不变,负号加负;
    • 空格 ,正号空格,负号加负;
  • #            【可选】对于二进制、八进制、十六进制,如果加上#,会显示 0b/0o/0x,否则不显示
  • ,            【可选】为数字添加分隔符,如:1,000,000
  • width       【可选】格式化位所占宽度
  • .precision 【可选】小数位保留精度
  • type         【可选】格式化类型
    • 传入” 字符串类型 “的参数
      • s,格式化字符串类型数据
      • 空白,未指定类型,则默认是None,同s
    • 传入“ 整数类型 ”的参数
      • b,将10进制整数自动转换成2进制表示然后格式化
      • c,将10进制整数自动转换为其对应的unicode字符
      • d,十进制整数
      • o,将10进制整数自动转换成8进制表示然后格式化;
      • x,将10进制整数自动转换成16进制表示然后格式化(小写x)
      • X,将10进制整数自动转换成16进制表示然后格式化(大写X)
    • 传入“ 浮点型或小数类型 ”的参数
      • e, 转换为科学计数法(小写e)表示,然后格式化;
      • E, 转换为科学计数法(大写E)表示,然后格式化;
      • f , 转换为浮点型(默认小数点后保留6位)表示,然后格式化;
      • F, 转换为浮点型(默认小数点后保留6位)表示,然后格式化;
      • g, 自动在e和f中切换
      • G, 自动在E和F中切换
      • %,显示百分比(默认显示小数点后6位)

 常用格式化:

 

 1 tpl = "i am {}, age {}, {}".format("seven", 18, 'alex')
 2   
 3 tpl = "i am {}, age {}, {}".format(*["seven", 18, 'alex'])
 4   
 5 tpl = "i am {0}, age {1}, really {0}".format("seven", 18)
 6   
 7 tpl = "i am {0}, age {1}, really {0}".format(*["seven", 18])
 8   
 9 tpl = "i am {name}, age {age}, really {name}".format(name="seven", age=18)
10   
11 tpl = "i am {name}, age {age}, really {name}".format(**{"name": "seven", "age": 18})
12   
13 tpl = "i am {0[0]}, age {0[1]}, really {0[2]}".format([1, 2, 3], [11, 22, 33])
14   
15 tpl = "i am {:s}, age {:d}, money {:f}".format("seven", 18, 88888.1)
16   
17 tpl = "i am {:s}, age {:d}".format(*["seven", 18])
18   
19 tpl = "i am {name:s}, age {age:d}".format(name="seven", age=18)
20   
21 tpl = "i am {name:s}, age {age:d}".format(**{"name": "seven", "age": 18})
22  
23 tpl = "numbers: {:b},{:o},{:d},{:x},{:X}, {:%}".format(15, 15, 15, 15, 15, 15.87623, 2)
24  
25 tpl = "numbers: {:b},{:o},{:d},{:x},{:X}, {:%}".format(15, 15, 15, 15, 15, 15.87623, 2)
26  
27 tpl = "numbers: {0:b},{0:o},{0:d},{0:x},{0:X}, {0:%}".format(15)
28  
29 tpl = "numbers: {num:b},{num:o},{num:d},{num:x},{num:X}, {num:%}".format(num=15)

 

posted @ 2017-06-07 16:55  7788碎片  阅读(86)  评论(0)    收藏  举报