文件与datetime

本文介绍了Python datetime模块的基础用法,包括获取当前时间、时间戳转换、日期和时间组件,以及dateutil.parser解析时间字符串。同时涵盖了文件与文件系统的操作,如打开、读写、路径处理及OS模块的常用函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

这是学习python的最后一个博客咯,从开头走到这我学习到了很多有趣的东西,解决了许多问题,今后还会有很多问题等着我去解决。


一、datetime模块

  • datetime.now(tz=None) 获取当前的日期时间,输出顺序为:年、月、日、时、分、秒、微秒。
  • datetime.timestamp() 获取以 1970年1月1日为起点记录的秒数。
  • 这个函数到底怎么用?????????????
  • 答:我们得将datetime修改成一个保存时间戳的对象变量,再调用timestamp函数来赋值给一个新的变量。
  • datetime.fromtimestamp(tz=None) 使用 unixtimestamp 创建一个 datetime。
  • 这个函数是用来记录从1970年1月1日开始,输入秒为参数后,得到结果为输出的经过秒数的时间。

import datetime

t = datetime.datetime.now()   #第一个datetime是包,第二个datetime是包里面的一个类。
print(t)            #2020-10-31 19:32:01.925000


t1 = datetime.datetime(year=2020, month=6, day=25, hour=11, minute=23, second=59)
print(t1)           #2020-06-25 11:23:59
print(t1.isoweekday())      #4

dt = datetime.datetime.fromtimestamp(9999999999.0)
print(dt)   #2286-11-21 01:46:39
print(dt.timestamp())  #9999999999.0

t2 = datetime.date(2011, 8, 30)
print(t2)       #2011-08-30
print(t2.strftime('%b-%d, %Y'))     #Aug-30, 2011


  • datetime.date() Return the date part.
  • datetime.time() Return the time part, with tzinfo None.
  • datetime.year
  • datetime.month
  • datetime.day
  • datetime.hour 小时
  • datetime.minute 分钟
  • datetime.second
  • datetime.isoweekday 星期几

这个函数parser.parse(timestr, parserinfo=None, **kwargs) 很好用哦,他可以将字符串形式的时间转化成时间戳然后进行时间的计算加减。

from dateutil import parser     #找不着这个dateutil包❤❤❤❤❤❤❤❤❤❤❤

s = '2020-06-25'
dt = parser.parse(s)
print(dt)  # 2020-06-25 00:00:00
print(type(dt))  # <class 'datetime.datetime'>

s = 'March 31, 2010, 10:51pm'
dt = parser.parse(s)
print(dt)  # 2010-03-31 22:51:00
print(type(dt))  # <class 'datetime.datetime'>

timedelta 表示具体时间实例中的一段时间。你可以把它们简单想象成两个日期或时间之间的间隔
它常常被用来从 datetime 对象中添加或移除一段特定的时间。

from dateutil import parser
import datetime

bday = 'Oct 2, 1969'
dt1 = parser.parse(bday).date()
dt2 = datetime.date.today()
dt3 = dt2 - dt1       #这是出生到今天所过去的天数
print(dt3.days)       #18657

dt4 = datetime.date(year = 2021, month = 10, day = 2)
print(dt4)
dt5 = dt4 - dt2        #这是输出距离下一个生日还有多少天
print(dt5.days)     #336

print(dt5.days * 24 * 60 * 60)   #29030400     输出秒数


习题

1、假设你获取了用户输入的日期和时间如2020-1-21 9:01:30,以及一个时区信息如UTC+5:00,均是str,请编写一个函数将其转换为timestamp:
答:

import re
from dateutil import parser
import datetime

def to_timestamp(dt_str, tz_str):

    dates = parser.parse(dt_str)
    hour = re.match(r'([UTC]+)([+-])(\d+):(\d)',tz_str)
    i = int(hour.group(3))
    if hour.group(2) == '+':
        dates1 = dates + datetime.timedelta(hours = i)
    if hour.group(2) == '-':
        dates1 = dates - datetime.timedelta(hours = i)

    print(dates1.timestamp())


dt_str='2020-6-1 08:10:30'
tz_str='UTC+7:00'

to_timestamp(dt_str, tz_str)


2、编写Python程序以选择指定年份的所有星期日。
答:

import datetime

def all_sundays(year):
    td = datetime.timedelta(days = 1)
    dn = datetime.date(year, 1, 1)

    while 1:
        tdweek = dn.isoweekday()
        if tdweek == 7:
            print(dn)
        dn = dn + td
        if dn.year >= year + 1:
            break

all_sundays(2021)

文件与文件系统

打开文件

open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True) Open file and return a stream. Raise OSError upon failure.

  • file: 必需,文件路径(相对或者绝对路径)。
  • mode: 可选,文件打开模式
  • buffering: 设置缓冲
  • encoding: 一般使用utf8
  • errors: 报错级别
  • newline: 区分换行符
f = open(r'C:\Users\Administrator\Desktop\将进酒.txt')
print(f)

for each in f:
    print(each)

fileObject.seek(offset[, whence])用于移动文件读取指针到指定位置。

  • offset:开始的偏移量,也就是代表需要移动偏移的字节数,如果是负数表示从倒数第几位开始。
  • whence:可选,默认值为 0。给 offset 定义一个参数,表示要从哪个位置开始偏移;0 代表从文件开头开始算起,1 代表从当前位置开始算起,2 代表从文件末尾算起。
f = open(r'C:\Users\Administrator\Desktop\将进酒.txt')
print(f)

line = f.readline()
print(line)
# 君不见,黄河之水天上来,奔流到海不复回。
line = f.readline()
print(line)
# 君不见,高堂明镜悲白发,朝如青丝暮成雪。
f.seek(0, 0)
line = f.readline()
print(line)
# 君不见,黄河之水天上来,奔流到海不复回。
f.close()
f = open(r'C:\Users\Administrator\Desktop\将进酒.txt', 'wb+')

print(f.write(b'0123456789abcdef'))  # 16  输入字符个数
print(f.seek(12))  #12    寻找位置
print(f.read(2))  #b'cd'  读取两个字符
print(f.seek(-3, 2))  #13  末尾开始倒数第3个字符
print(f.read(3))  #b'def'  读取3个字符


如果文件打开模式带b,那写入文件内容时,str(参数)要用encode方法转为bytes形式,否则报错:TypeError: a bytes-like object is required, not 'str'

str = '...'
# 文本 = Unicode字符序列
# 相当于 string 类型

str = b'...'
# 文本 = 八位序列(0到255之间的整数)
# 字节文字总是以‘b’或‘B’作为前缀;它们产生一个字节类型的实例,而不是str类型。
# 相当于 byte[]

OS 模块中关于文件/目录常用的函数

有了OS(Operation System)模块,我们不需要关心什么操作系统下使用什么模块,OS模块会帮你选择正确的模块并调用。

  • os.getcwd()用于返回当前工作目录。
  • os.chdir(path)用于改变当前工作目录到指定的路径。
import os

path = 'C:\\'
print("当前工作目录 : %s" % os.getcwd())   #当前工作目录 : E:\python\实验
import os

dirs = os.listdir()
for item in dirs:
    print(item)
    
'''    
.idea
2048小游戏
continue.py
datetime模块.py
game.py
game2.py
gui.py
hanoi递归(汉诺塔).py
venv
wenjian.py
__pycache__
九九.py
九九乘法表.py
位运算习题.py
函数.py
分数划分.py
回文子串.py
字典.py
山脉.py
异常检测.py
循环习题.py
心heart.py
找最多.py
模块
用户名和密码.py
类与对象.py
类的魔法方法.py
递归小兔.py
集合.py

'''

此处无例子。

os.mkdir(path)创建单层目录,如果该目录已存在抛出异常。

os.makedirs(path)用于递归创建多层目录,如果该目录已存在抛出异常。

os.remove(path)用于删除指定路径的文件。如果指定的路径是一个目录,将抛出 OSError

os.rmdir(path)用于删除单层目录。仅当这文件夹是空的才可以, 否则, 抛出 OSError

os.removedirs(path)递归删除目录,从子目录到父目录逐层尝试删除,遇到目录非空则抛出异常。

os.rename(src, dst)方法用于命名文件或目录,从 srcdst,如果 dst 是一个存在的目录, 将抛出 OSError

os.system(command)运行系统的shell命令(将字符串转化成命令)

  • os.curdir指代当前目录(.
  • os.pardir指代上一级目录(..
  • os.sep输出操作系统特定的路径分隔符(win下为\\,Linux下为/
  • os.linesep当前平台使用的行终止符(win下为\r\n,Linux下为\n
  • os.name指代当前使用的操作系统(包括:‘mac’,‘nt’)

  • os.path.basename(path)去掉目录路径,单独返回文件名
  • os.path.dirname(path)去掉文件名,单独返回目录路径
  • os.path.join(path1[, path2[, ...]])path1path2 各部分组合成一个路径名
  • os.path.split(path)分割文件名与路径,返回(f_path,f_name)元组。如果完全使用目录,它会将最后一个目录作为文件名分离,且不会判断文件或者目录是否存在。
  • os.path.splitext(path)分离文件名与扩展名,返回(f_path,f_name)元组。

  • os.path.getsize(file)返回指定文件大小,单位是字节。
  • os.path.getatime(file)返回指定文件最近的访问时间
  • os.path.getctime(file)返回指定文件的创建时间
  • os.path.getmtime(file)返回指定文件的最新的修改时间
  • 浮点型秒数,可用time模块的gmtime()localtime()函数换算

  • os.path.exists(path)判断指定路径(目录或文件)是否存在
  • os.path.isabs(path)判断指定路径是否为绝对路径
  • os.path.isdir(path)判断指定路径是否存在且是一个目录
  • os.path.isfile(path)判断指定路径是否存在且是一个文件
  • os.path.islink(path)判断指定路径是否存在且是一个符号链接
  • os.path.ismount(path)判断指定路径是否存在且是一个悬挂点
  • os.path.samefile(path1,path2)判断path1和path2两个路径是否指向同一个文件

序列化与反序列化

Python 的 pickle 模块实现了基本的数据序列和反序列化。

  • 通过 pickle 模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储。
  • 通过 pickle 模块的反序列化操作,我们能够从文件中创建上一次程序保存的对象。

pickle模块中最常用的函数为:

pickle.dump(obj, file, [,protocol])obj对象序列化存入已经打开的file中。

  • obj:想要序列化的obj对象。
  • file:文件名称。
  • protocol:序列化使用的协议。如果该项省略,则默认为0。如果为负值或HIGHEST_PROTOCOL,则使用最高的协议版本。

pickle.load(file)file中的对象序列化读出。

  • file:文件名称。

习题

1、打开中文字符的文档时,会出现乱码,Python自带的打开文件是否可以指定文字编码?还是只能用相关函数?
答:open(file, mode=‘r’, buffering=None, encoding=None, errors=None, newline=None, closefd=True)
在mode中设置文件打开的编码形式


2、编写程序查找最长的单词
输入文档: res/test.txt
题目说明:

"""
   
Input file
   test.txt
   
Output file
   ['general-purpose,', 'object-oriented,']
   
"""
def longest_word(filename):
    # your code here
        pass
   

解答:
还没想出来,等我回去补补课再回来不上这道题。


总结

未完,待续。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值