27 os 模块 序列化模块 sys模块 时间模块

主要内容:

1 : 时间模块

  a: 时间戳时间 ,格林威治时间, float数据类型 ,给机器用的

    英国伦敦时间  1970.1.1  0:0:0

    北京时间          1970.1.1 8:0:0

  time.time()        获取时间戳时间

import time
print(time.time())

  b: 结构化时间,时间对象,能够通过.属性名来获取对象中的值.

    time.localtime()  获取结构化时间

struct_time = time.localtime()
print(struct_time)   #time.struct_time(tm_year=2018, tm_mon=8, tm_mday=8, tm_hour=19, tm_min=13, tm_sec=37, tm_wday=2, tm_yday=220, tm_isdst=0)

  c: 格式化时间: 字符串时间, str数据类型,给人看的

    time.strftime()    获取格式化时间

struct_time = time.localtime()
print(struct_time)   #time.struct_time(tm_year=2018, tm_mon=8, tm_mday=8, tm_hour=19, tm_min=13, tm_sec=37, tm_wday=2, tm_yday=220, tm_isdst=0)

  d: 三种模式之间的转换

    1)  格式化时间--> strptime('格式化时间','%Y-%m-%d') <--结构化时间<-- mktime(结构化时间) -->时间戳时间

import time
formatstring = time.strftime('%y-%m-%d')
struct_time = time.strptime(formatstring,'%y-%m-%d')
timestamp = time.mktime(struct_time)
print(timestamp)

    2)  时间戳时间--> localtime(timestamp)<--结构化时间-->strftime('时间格式',格式化时间)

import time
timestamp = time.time()
struct_time = time.localtime(timestamp)
print(struct_time)
formatsring = time.strftime('%y-%m-%d',struct_time)
print(formatsring)

  e: 一道题:计算本地一月的时间戳时间

import time
formatstring = time.strftime('%y-%m-1')
struct_time = time.strptime('formatstring','%y-%m-%d')
timestamp = time.mktime(struct_time)
print(timestamp)

    第二种方法:

import time
struct_time = time.localtime()
struct_time = time.strptime('%s-%s-1' % (struct_time.tm_year,struct_time.tm_mon),'%Y-%m-%d')
timestamp = time.mktime(struct_time)
print(timestamp)

2 . sys模块  :跟python解释器打交道的(sys模块是与python解释器交互的一个接口)

  a: sys.platform  :返回操作系统平台名称

  b: sys.exit()        退出程序

import sys            #跟python解释器打交道的
print(sys.platform)   #操作平台win32
sys.exit()            #结束程序再写print会报错
print(123)

  c: sys.argv    : 命令行参数list

    1) :返回一个列表 

      第一个元素, 是执行这个文件的时候, 写在python命令后面的第一个值,

      之后的元素,在执行python的启动的时候可以写多个值, 都会被依次添加到列表中.

    2): 用处

name = sys.argv[1]
pwd = sys.argv[2]
if name == 'alex' and pwd == 'alex3714':
    print('执行以下代码')
else:
    exit()

3 . os模块

  a: 创建和删除文件夹

    创建文件夹:

import os
os.mkdir('dir')  # ftp 网盘                     生成单级文件夹
os.mkdir('dir/dir5')  # ftp 网盘
os.makedirs('dir2/dir3/dir4',exist_ok=True)    生成多级文件夹

    删除文件夹:

os.remove('dir2/dir3/dir4/aaa.py')             删除文件
os.rmdir('dir2/dir3/dir4')                     不能删除一个非空文件夹 ,删除单级文件夹
os.removedirs('dir2/dir3/dir4')
递归向上删除文件夹,只要删除当前目录之后 发现上一级目录也为空了,就把上一级目录也删掉.
如果发现上一级目录有其他文件,就停止

  b: os.listdir:  列出指定目录下的所有文件和子目录,并以列表方式打印.

import os
print(os.listdir(r'C:Users26897PycharmProjectsuntitledWorkspace'))
# ['day  20', 'day 02', 'day 21 反射', 'day01', 'day03', 'day04', 'day05', 'day06', 'day07', 'day08', 'day09', 'day10', 'day11考试', 'day12', 'day13', 
'day14', 'day15', 'day16 类,对象调用类中的变量和方法', 'day17 类,对象的查询空间,组合', 'day18 继承,单,多继承;新式类,经典类', 'day22 考试', 'day23', 'day24', '
day25 正则表达式', 'day26', 'day27', '作业', '学生选课']

  c :

import os
print(os.stat(r'C:Users26897PycharmProjectsuntitledWorkspaceday25 正则表达式练习.py')) #获取文件目录信息
print(os.sep)  # 当前你所在的操作系统的目录分割符    /a/dir/dir2
print([os.linesep])  #输出当前平台使用的行终止符,win下为"
",Linux下为"
"
print(os.pathsep) #   输出用于分割文件路径的字符串 win下为;,Linux下为:
print(os.name) # 输出字符串指示当前使用平台。win->'nt'; Linux->'posix'

  d: print(os.environ)       :获取系统环境变量

  e:  os.path.dirname(path) # 返回path的上一级目录,即是os.path.split(path) 的第一个元素

os.path.dirname(path)  # 返回path的上一级目录,即是os.path.split(path) 的第一个元素
print(os.path.dirname(r'C:Users26897PycharmProjectsuntitledWorkspaceday27')) 
#返回path的上一级目录,即是os.path.split(path) 的第一个元素

  f:  os.path.split(path) # 将path分割成目录和文件名二元组返回,

# print(os.path.split(r'C:Users26897PycharmProjectsuntitledWorkspaceday27lianxi.py'))
# print(os.path.split(r'C:Users26897PycharmProjectsuntitledWorkspaceday27'))

  h: os.path.isfile(path) #判断path是不是一个存在的文件,如果是返回ture,否则false

   os.path.isdir(path) #判断path是不是一个存在的目录,如果是返回ture,否则false

import os
print(os.path.isfile(r'C:Users26897PycharmProjectsuntitledWorkspaceday27lianxi.py'))  #ture
print(os.path.isdir(r'C:Users26897PycharmProjectsuntitledWorkspaceday27lianxi.py'))   #false
print(os.path.isdir(r'C:Users26897PycharmProjectsuntitledWorkspaceday27'))              #ture

  g:  os.path.join() #将多个路径组合后返回,(第一个绝对路径之前的参数将被忽略.)

import os
ret = os.path.join(r'C:Users26897PycharmProjectsuntitledWorkspaceday27','aaa','bbb')
print(os.path.abspath(ret))
# C:Users26897PycharmProjectsuntitledWorkspaceday27aaabb

  l: os.path.getsize(path) 返回path的大小

import os
print(os.path.getsize(r'C:Users26897PycharmProjectsuntitledWorkspaceday27lianxi.py'))  #428
print(os.path.getsize(r'C:Users26897PycharmProjectsuntitledWorkspaceday24'))             #4096
print(os.path.getsize(r'C:Users26897PycharmProjectsuntitledWorkspaceday23'))             #4096

#文件夹都是4096字节,所有的都一样,文件大小精确统计

  m : os.path.exist()  : 判断path是否存在  os.path.isabs() : 判断path是不是决定路径,如果是返回ture

  n : os.path.basename(path) : 返回最后一层文件或者目录

print(os.path.basename('D:/sylar/python_workspace/day25'))                      #day25
print(os.path.basename('D:/sylar/python_workspace/day25/5.os模块.py'))         #5.os模块.py

4 . 序列化  : 把原本的字典 , 列表等内容转换成字符串的过程.

  a : 为什么要序列化 : 要把内容写入文件    ,      网络传输数据

  b :反序列化 : 字符串 --> 字典,列表 , 数字 , 对象

  c : json 的四个方法 :jumps  loads jump load

    1) json . jumps    jumps.loads

dic = {'aaa':'bbb','ccc':'ddd'}
str_dic = json.dumps(dic)
print(str_dic)             #{"aaa": "bbb", "ccc": "ddd"}     将字典转转换成字符串
print([str_dic])           #['{"aaa": "bbb", "ccc": "ddd"}']
注意,json转换完的字符串类型的字典中的字符串是由""表示的
with open('json_dunp','w')as f:
    f.write(str_dic)
ret = json.loads(str_dic)    #反序列化: 将一个字符串格式的字典转换成一个字典
print(ret)                 #{'aaa': 'bbb', 'ccc': 'ddd'}
注意,要用json的loads功能处理的字符串类型的字典中的字符串必须由""表示

       2) json. jump,      json. load

import json
f = open('json_file','w')
dic = {'k1':'v1','k2':'v2','k3':'v3'}
json.dump(dic,f)  #dump方法接收一个文件句柄,直接将字典转换成json字符串写入文件
f.close()

f = open('json_file')
dic2 = json.load(f)  #load方法接收一个文件句柄,直接将文件中的json字符串转换成数据结构返回
f.close()
print(type(dic2),dic2)

    3)  json 限制问题

      @   json格式的限制1,json格式的key必须是字符串数据类型,如果是数字为key,那么dump之后会强行转成字符串数据类型

import json
dic = {1:2,3:4}
str_dic = json.dumps(dic)
print(str_dic)            #{"1": 2, "3": 4}
new_dic = json.loads(str_dic)
print(new_dic)            #{'1': 2, '3': 4}

      @  json是否支持元祖作为key : 不支持

dic = {(1,2,3):3, ('a','b','c'):4}
str_dic1 = json.dumps(dic)
print(str_dic1)                   #keys must be a string

      @  json是否支持元祖作为value :支持,会把value转变成列表

dic = {3:(1,2,3), 4:('a','b','c')}
str_dic1 = json.dumps(dic)        #{"3": [1, 2, 3], "4": ["a", "b", "c"]}
print(str_dic1)
new_dic1 = json.loads(str_dic1)   #{'3': [1, 2, 3], '4': ['a', 'b', 'c']}
print(new_dic1)

      @  对列表的dump

import json
li = ['ser',1,'a', (1,2,3)]
with open('uin','w')as f:
    json.dump(li,f)
with open('uin', 'r')as f:
    json.load(f)
    print(li, type(li))

      @  能不能多次dump数据到文件里,可以多次dump但是不能load出来了

import json
dic = {1:2,'a':(1,2,4)}
lst = ['a', 'b']
with open('str', 'w')as f :
    json.dump(dic,f)
    json.dump(lst,f)
with open('str','r')as f:
    json.load(f)             #报错

            想dump多个数据进入文件,用dumps

import json
dic = {1:2,'a':(1,2,4)}
lst = ['a', 'b']
str_dic = json.dumps(dic)
str_lst = json.dumps(lst)
with open('iii','w')as f:
    f.write(str_dic + '
')
    f.write(str_lst + '
')
    f.close()
with open('iii')as f:
    for line in f:
        ret = json.loads(line)
        print(ret)

      @  中文格式 加了ensure_ascii=false中文就可以原样输出

import json
dic = {'a':1,'每天':2}
str_dic = json.dumps(dic, ensure_ascii=False)
print(str_dic)             #{"a": 1, "u6bcfu5929": 2}

      @  json的其他参数,是为了用户看的更方便,但是会相对浪费存储空间(ident缩进, ensure_ascii = false显示中文separators分隔符)

import json
data = {'username':['李华','二愣子'],'sex':'male','age':16}
json_dic2 = json.dumps(data,sort_keys=True,indent=4,separators=(',',':'),ensure_ascii=False)
print(json_dic2)

      @  set不能被dump/dumps

import json
set = {2,3,4,'a',9,(2,4,5)}
str_set = json.dumps(set)
print(str_set)          #报错Object of type 'set' is not JSON serializable

  d : pickle

    dump的结果是bytes, dump用的f文件句柄需要以wb的形式打开,load所用的f是'rb'模式

import pickle
dic = {1:2,3:4}
str_dic = pickle.dumps(dic)
print(str_dic)               #b'x80x03}qx00(Kx01Kx02Kx03Kx04u.'
new_dic = pickle.loads(str_dic)
print(new_dic)               #{1: 2, 3: 4}

    对于对象的序列化需要这个对象对应的类在内存中

class Student:
    def __init__(self,name, age):
        self.name = name
        self.age = age
s = Student('lily',34)
str_S = pickle.dumps(s)
new_s = pickle.loads(str_S)
print(new_s)      #<__main__.Student object at 0x000001DE1915D550>
print(new_s.name) #lily

    对于多次dump/load做了良好的处理.

import pickle
with open('pickle_demo','wb') as f:
    pickle.dump({'k1':'v1'}, f)
    pickle.dump({'k11':'v1'}, f)
    pickle.dump({'k11':'v1'}, f)
    pickle.dump({'k12':[1,2,3]}, f)
    pickle.dump(['k1','v1','l1'], f)
with open('pickle_demo','rb')as f :
    while 1:
        try:
            print(pickle.load(f))
        except EOFError:
            break

  e: pickle 和 json 的区别:

    json :    有限制 ,字符串, 字典 , 列表, 数字   支持所有语言

    pickle:   几乎支持所有的对象.

  f : shelve   (稍微了解)只有一个方法

import shelve
f = shelve.open('shelve_demo')
f['key'] = {'k1':(1,2,3),'k2':'v2'}
f.close()
f = shelve.open('shelve_demo')
content = f['key']
f.close()
print(content) 
# shelve  如果你写定了一个文件
# 改动的比较少
# 读文件的操作比较多
# 且你大部分的读取都需要基于某个key获得某个value

  

  

  

原文地址:https://www.cnblogs.com/gyh412724/p/9445535.html