zoukankan      html  css  js  c++  java
  • 时间、文件、系统、序列化模块

    一、在python中,通常有这几种方式来表示时间:

    • 时间戳

    • 格式化的时间字符串

    • 元祖(struct_time)共九个元素。由于Python的time模块实现主要调用C库,所以每个平台可能有所不同。

    二、几个定义

      UTC(Coordinated Universal Time,世界协调时)亦即格林威治天文时间,世界标准时间。在中国为UTC+8。DST(Daylight Saving Time)即夏令时。

      时间戳(timestamp)的方式:通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移值。我们运行type(time.time()),返回的是float类型。

      元祖(struct_time)方式:struct_time元祖共有9个元素,返回struct_time的函数主要有gmtime(),localtime(),strptime()。下面列出这种方式元祖中的几个元素:

    属性                            值
    tm_year(年)                  比如2019 
    tm_mon(月)                   1 - 12
    tm_mday(日)                  1 - 31
    tm_hour(时)                  0 - 23
    tm_min(分)                   0 - 59
    tm_sec(秒)                   0 - 61
    tm_wday(weekday)             0 - 6(0表示周日)
    tm_yday(一年中的第几天)        1 - 366
    tm_isdst(是否是夏令时)        默认为-1

    一、time模块的方法

    time.localtime( [secs] )
    将一个时间戳转换为当前时区的struct_time,即时间数组格式的时间
    参数:

    sec – 转换为time.struct_time类型的对象的秒数
    如果secs参数未提供,则以当前时间为准(即会默认调用time.time())。

    >>> import time
    >>> time.localtime()
    time.struct_time(tm_year=2019, tm_mon=1, tm_mday=23, tm_hour=10, tm_min=31, tm_sec=21, tm_wday=2, tm_yday=23, tm_isdst=0)

    time.gmtime([secs])
    将一个时间戳转换为UTC时区的struct_time
    time.gmtime() 函数将一个时间戳转换为UTC时区(0时区)的struct_time,可选的参数sec表示从1970-1-1 00:00:00以来的秒数。其默认值为time.time(),函数返回time.struct_time类型的对象。(struct_time是在time模块中定义的表示时间的对象)。
    如果secs参数未提供,则以当前时间为准。
    参数:

    sec – 转换为time.struct_time类型的对象的秒数

    >>> time.gmtime()
    time.struct_time(tm_year=2019, tm_mon=1, tm_mday=23, tm_hour=2, tm_min=34, tm_sec=6, tm_wday=2, tm_yday=23, tm_isdst=0)
    >>>

    time.time()

    返回当前时间的时间戳

    >>> time.time()
    1548210925.5266087

    time.mktime(t)

    将一个struct_time转化为时间戳
    time.mktime() 函数执行与gmtime(), localtime()相反的操作,它接收struct_time对象作为参数,返回用秒数表示时间的浮点数。
    如果输入的值不是一个合法的时间,将触发 OverflowError 或 ValueError。
    参数:

    t – 结构化的时间或者完整的9位元组元素

    >>> time.mktime(time.localtime())
    1548211010.0

    time.sleep(secs)

    线程推迟指定的时间运行 
    线程睡眠指定时间,单位为妙。

    >>> time.sleep(2)  # 睡眠2秒

    time.asctime( [t] )
    把一个表示时间的元组或者struct_time表示为 ‘Sun Aug 23 14:31:59 2015’ 这种形式。如果没有给参数,会将time.localtime()作为参数传入。
    参数:

    t – 9个元素的元组或者通过函数 gmtime() 或 localtime() 返回的时间值

    >>> time.asctime()
    'Wed Jan 23 10:39:47 2019'

    time.ctime([secs])
    把一个时间戳(按秒计算的浮点数)转化为time.asctime()的形式。如果为指定参数,将会默认使用time.time()作为参数。它的作用相当于time.asctime(time.localtime(secs))
    参数:

    sec – 要转换为字符串时间的秒数

    >>> time.ctime()
    'Wed Jan 23 10:41:58 2019'

    time.strftime( format [, t] )
    返回字符串表示的当地时间。
    把一个代表时间的元组或者struct_time(如由time.localtime()和time.gmtime()返回)转化为格式化的时间字符串,格式由参数format决定。如果未指定,将传入time.localtime()。如果元组中任何一个元素越界,就会抛出ValueError的异常。函数返回的是一个可读表示的本地时间的字符串。
    参数:

    format:格式化字符串
    t :可选的参数是一个struct_time对象
    时间字符串支持的格式符号:(区分大小写)

    %a  本地星期名称的简写(如星期四为Thu)      
    %A  本地星期名称的全称(如星期四为Thursday)      
    %b  本地月份名称的简写(如八月份为agu)    
    %B  本地月份名称的全称(如八月份为august)       
    %c  本地相应的日期和时间的字符串表示(如:15/08/27 10:20:06%d  一个月中的第几天(01 - 31%f  微秒(范围0.999999%H  一天中的第几个小时(24小时制,00 - 23%I  第几个小时(12小时制,0 - 11%j  一年中的第几天(001 - 366%m  月份(01 - 12%M  分钟数(00 - 59%p  本地am或者pm的相应符      
    %S  秒(00 - 61%U  一年中的星期数。(00 - 53星期天是一个星期的开始。)第一个星期天之    前的所有天数都放在第0周。     
    %w  一个星期中的第几天(0 - 6,0是星期天)    
    %W  和%U基本相同,不同的是%W以星期一为一个星期的开始。    
    %x  本地相应日期字符串(如15/08/01%X  本地相应时间字符串(如08:08:10%y  去掉世纪的年份(00 - 99)两个数字表示的年份       
    %Y  完整的年份(4个数字表示年份)
    %z  与UTC时间的间隔(如果是本地时间,返回空字符串)
    %Z  时区的名字(如果是本地时间,返回空字符串)       
    %%  ‘%’字符  

    time.strptime(string[,format])
    将格式字符串转化成struct_time.
    该函数是time.strftime()函数的逆操作。time strptime() 函数根据指定的格式把一个时间字符串解析为时间元组。所以函数返回的是struct_time对象。
    参数:

    string :时间字符串
    format:格式化字符串

    注意在使用strptime()函数将一个指定格式的时间字符串转化成元组时,参数format的格式必须和string的格式保持一致,如果string中日期间使用“-”分隔,format中也必须使用“-”分隔,时间中使用冒号“:”分隔,后面也必须使用冒号分隔,否则会报格式不匹配的错误。

    时间格式转换图:

    二、datetime模块

    • datetime模块定义了下面几个类:

    • datetime.date:表示日期的类。常用的属性有year,month,day;

    • datetime.time:表示时间的类。常用的属性有hour,minute,second,microsecond;

    • datetime.datetime:表示日期时间。

    • datetime.timedelta:表示时间间隔,即两个时间点之间的长度;

    • datetime.tzinfo:与时区有关的信息。

    需要记住的方法:

    1. d = datetime.datetime.now() 返回当前的datetime日期类型

      •   d.timestamp(),d.today,d.year,d.timetuple()等方法可以调用

    2. datetime.date.fromtimestamp() 把一个时间戳转为datetime日期类型

    3. 时间运算

    >>> datetime.datetime.now()
    datetime.datetime(2019, 1, 23, 11, 3, 42, 125406)
    >>> datetime.datetime.now() + datetime.timedelta(4)  # 当前时间+4天
    datetime.datetime(2019, 1, 27, 11, 4, 18, 791478)
    >>> datetime.datetime.now() + datetime.timedelta(hours=4)  # 当前时间+4小时
    datetime.datetime(2019, 1, 23, 15, 4, 52, 988594)

      4. 时间替换

    >>> d.replace(year=1994,month=11,day=12)
    datetime.datetime(1994, 11, 12, 11, 0, 27, 749344)

    三、random模块

    >>> random.randrange(0,100,2)  # 随机选取 0到100间的偶数
    64
    >>> random.random()  # 返回一个随机浮点数
    0.2246826615173001
    >>> random.choice('abc123#$%')  # 返回一个给定数据集合中的随机字符
    '1'
    >>> random.sample('abcdefg',3)  # 从多个字符中选取特定数量的字符
    ['g', 'd', 'f']
    >>>
    >>> # 生成随机字符串
    ... import string
    >>> ''.join(random.sample(string.ascii_lowercase+string.digits,6))
    'kwcsq4'
    >>>
    >>> # 洗牌
    ... a = [1,2,3,4,5,6,7,8,9]
    >>> random.shuffle(a)
    >>> a
    [8, 5, 1, 6, 9, 7, 3, 4, 2]

    四、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下为"	
    ",Linux下为"
    "
    os.pathsep    输出用于分割文件路径的字符串 win下为;,Linux下为:
    os.name    输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
    os.system("bash command")  运行shell命令,直接显示
    os.popen("bash command)  运行shell命令,获取执行结果
    os.environ  获取系统环境变量
    
    
    os.path
    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所指向的文件或者目录的最后修改时间
    os.path.getsize(path) 返回path的大小

    os.stat('pathfilename') 获取文件目录信息的结构说明

    stat 结构:
     
    st_mode: inode 保护模式
    st_ino: inode 节点号。
    st_dev: inode 驻留的设备。
    st_nlink: inode 的链接数。
    st_uid: 所有者的用户ID。
    st_gid: 所有者的组ID。
    st_size: 普通文件以字节为单位的大小;包含等待某些特殊文件的数据。
    st_atime: 上次访问的时间。
    st_mtime: 最后一次修改的时间。
    st_ctime: 由操作系统报告的"ctime"。在某些系统上(如Unix)是最新的元数据更改的时间,<br>在其它系统上(如Windows)是创建时间(详细信息参见平台的文档)。

    五、sys模块

    import sys
    
    sys.argv  # 命令行参数List,第一个元素是程序本身路径
    sys.exit(n)  # 退出程序,正常退出时exit(0)
    sys.version  # 获取Python解释程序的版本信息
    sys.maxint  # 最大的Int值
    sys.path  # 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
    sys.platform  # 返回操作系统平台名称
    sys.stdout.write('please:')  # 标准输出,引出进度条的例子。注:在py3上不行,可以用print代替
    val = sys.stdin.readline()[:-1]  # 标准输入
    sys.getrecursionlimit()  # 获取最大递归层数
    sys.setrecursionlimit(1200)  # 设置最大递归层数
    sys.getdefaultencoding()  # 获取解释器默认编码
    sys.getfilesystemencoding  # 获取内存数据存到文件里的默认编码

    六、shutil模块

     高级的文件、文件夹、压缩包 处理模块

    shutil.copyfileobj(fsrc,fdst[,length])

    将文件内容拷贝到另一个文件中

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

    shutil.copyfile(src,dst)

    拷贝文件

    shutil.copyfile('f1.log','f2.log')  # 目标文件无需存在

    shutil.copymode(src,dst)

    仅拷贝权限。内容、组、用户均不变

    shutil.copymode('f1.log','f2.log')  # 目标文件必须存在

    shutil.copystat(src,dst)

    仅拷贝状态的信息,包括:mode bits,atime,mtime,flags

    shutil.copystat('f1.log','f2.log')  # 目标文件必须存在

    shutil.copy(src,dst)

    拷贝文件和权限

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

    shutil.copy2(src,dst)

    拷贝文件和状态信息

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

    shutil.ignore_patterns(*patterns)
    shutil.copytree(src,dst,symlinks=False,ignore=None)

    递归的去拷贝文件夹

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

    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:用于记录日志,通常的loggin.Logger对象

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

    shutil对压缩包的处理是调用ZipFile和TarFile两个模块来进行的

    # zipfile压缩和解压缩
    import zipfile
    # 压缩
    z = zipfile.ZipFile('aaa.zip','w')
    z.write('bbb.log')
    z.write('data.data')
    z.close()
    
    # 解压缩
    z = zipfile.ZipFile('aaa.zip','r')
    z.extractall(path='.')
    z.close()
    # tarfile压缩和解压缩
    import tarfile
    # 压缩
    t = tarfile.open('/tmp/aaa.tar','w')
    t.add('/test/a.py',arcname='a.bak')
    t.add('/test/b.py',arcname='b.bak')
    t.close()
    
    # 解压缩
    t = tarfile.open('/tmp/aaa.tar','r')
    t.extractall('/test')
    t.close()

    七、json&pickle模块

    什么叫序列化?序列化是指把内存里的数据类型转变成字符串,以使其能存储到硬盘或通过网络传输到远程,因为硬盘或网络传输时只能接受bytes。

    用于序列化的两个模块

    • json,用于字符串和python数据类型间进行转换

    • pickle,用于python特有的类型和python的数据类型间进行转换

    Json模块提供四个模块;dumps,dump,loads,load

    pickle模块提供四个模块;dumps,dump,loads,load

    import pickle
    data = {'k1':123,'k2':'hello'}
    # pickle.dumps 将数据通过特殊的形式转换为只有python语言认识的字符串
    p_str = pickle.dumps(data)
    print(p_str)
    # pickle.dump 将数据通过特殊的形式转换为只有python语言认识的字符串,并写入文件
    with open('test','w') as fp:
        pickle.dumps(data,fp)
        
    import json
    # json.dumps 将数据通过特殊的形式转换为所有程序语言认识的字符串
    j_str = json.dumps(data)
    print(j_str)
    # json.dump 将数据通过特殊的形式转换为所有程序语言认识的字符串,并写入文件
    with open('test','w') as fp:
        json.dump(data,fp)

    json vs pickle:

      JSON:

      优点:跨语言,体积小

      缺点:只能支持int/str/list/tuple/dict

      Pickle:

      优点:专为python设计,支持python所有的数据类型

      缺点:只能在python中使用,存储数据占空间大

    八、shelve模块

    shelve模块是一个简单的k,v将内存数据通过文件持久化的模块,可以持久化任何pickle可支持的python数据格式。

    序列化:

    import shelve
    f = shelve.open('shelve_test')  # 打开一个文件
    names = ['悟空','八戒','沙僧']
    info = {'name':'悟空','age':999}
    f['name'] = names
    f['info_dic'] = info
    f.close()

    反序列化:

    import shelve
    d = shelve.open('shelve_test')  # 打开一个文件
    print(d['names'])
    print(d['info_dic'])
    # del d['test']   # 还可以删除


    原文:https://blog.csdn.net/SeeTheWorld518/article/details/48314501 

       https://www.cnblogs.com/tkqasn/p/6001134.html
        

  • 相关阅读:
    STM32的GPIO工作原理 | 附电路图详细分析
    话说上拉电阻和下拉电阻
    Linux下MySQL数据库常用基本操作
    Linux acpi off学习的必要
    CentOS 6.2出现Disk sda contains BIOS RAID metadata解决方法
    降低开关电源纹波的三个要素
    什么是RFID? 射频识别技术的特点及工作原理!
    亲测可用的国内maven镜像
    Linux 删除文件夹和文件的命令
    [Gradle] 在 Eclipse 下利用 gradle 构建系统
  • 原文地址:https://www.cnblogs.com/ForT/p/10307762.html
Copyright © 2011-2022 走看看