0%

Python-Debug

1. os.getcwd()

os.getcwd()返回工作目录,工作目录(Working Directory)是指当前用户或程序正在其中执行命令或访问文件的目录。在操作系统中,当你打开一个命令行界面(如终端、命令提示符)或运行一个程序时,都有一个与之关联的工作目录。这个目录是相对于该环境而言的当前位置,用于解析相对路径。
os.getcwd() 函数是 Python 标准库 os 模块中的一个函数,用于获取当前工作目录的绝对路径。这个函数通过查询操作系统来确定当前进程的工作目录,并将其作为一个字符串返回。
具体来说,os.getcwd() 如何确定工作目录,取决于操作系统提供的机制。在 Unix-like 系统(如 Linux 和 macOS)中,这通常涉及到查询当前进程的环境信息,该信息中包含了工作目录的路径。在 Windows 系统中,机制可能有所不同,但同样依赖于操作系统提供的API来查询当前进程的工作目录。

当 Python 程序(或 Python 交互式解释器)启动时,它的工作目录通常是启动该程序或解释器的那个目录。但是,在程序执行过程中,可以使用 os.chdir(path) 函数来改变工作目录,这时 os.getcwd() 返回的将是新的工作目录路径。
需要注意的是,os.getcwd() 返回的是绝对路径,这意味着它是一个从根目录开始的完整路径,不受当前工作目录的相对位置影响。这对于需要精确处理文件路径的程序来说是非常有用的。

所以python返回的工作目录是执行python命令的那个目录,所以这个目录很重要,不能随便用来删除目录,我不小心就把自己的源码目录给删除了,还好有GitHub。

2. timezone

python有第三方库pytz,python 3.9版本以上有一个自带的库zoneinfo。我必须吐槽一下,这个timezone库就这么不重视吗,这么晚才有。

2.1 不带timezone的创建方法

1
2
3
date1= datetime.now()
date2 = datetime.strptime(str, '%Y-%m-%d')
date3 = datetime(2023, 4, 1, 10, 0, 0)

这3种都是不带timezone,但是有个地方要注意,date1虽然没带,但是如果打印它,是当前的系统timezone下的时间,而非UTC时间,所以就是它没有这个tzinfo的属性,但是就是用了。

2.2 带有timezone的创建方法

1
2
3
4
5
6
tz = pytz.timezone('Asia/Shanghai')
date1= datetime.now(pytz.utc) # 或者 datetime.now(tz)

date2 = datetime.strptime(str, '%Y-%m-%d')
local_date = tz.localize(date2)
utc_date = pytz.utc.localize(date2)

这里就是给datetime.now一个tzinfo,无论给它什么样的tzinfo,最近它们的本质还是一样的,都是同一个时间,不同点只是tzinfo不同。注意localize只能对没有tzinfo的值设置,而replace没有这个限制。
尽管实参一样,但是local_date和utc_date的表示时间却是不一样的,因为date2原来没有tzinfo,调用了不同的tzinfo.localize方法后,产生的时间就是不一样的,所以这需要知道你的实参的timezone是什么,才能正确的给它设置timezone。

2.3 timezone转换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 将UTC时间转换为上海时间
# 第一种方法
local_date = utc_date.astimezone(tz) # 结果正确

# 第二种方法
from zoneinfo import ZoneInfo
zone_info = ZoneInfo('Asia/Shanghai')
local_date2 = utc_date.astimezone(zone_info) # 结果正确

# 第三种方法
local_date3 = datetime.now(tz=pytz.utc).replace(tzinfo=zone_info).astimezone(shanghai_tz) #结果正确
local_date4 = datetime.now(tz=pytz.utc).replace(tzinfo=pytz.utc).astimezone(shanghai_tz) #结果正确
local_date5 = datetime.now().replace(tz=shanghai_tz) #结果错误,虽然按照2.1的创建方法date.now其实使用了tzinfo的信息,但是结果是不对。
local_date6 = datetime.now(tz=shanghai_tz).replace(tzinfo=shanghai_tz).astimezone(shanghai_tz) #结果错误
print(local_date5) # local_date4 2024-09-04 19:02:43.948018+08:06 这个后面带有06分钟,是个什么意思?

当我们有一个带有timezone的时间,想转为另一个timezone的时间,从时间本身来讲,它们是一样的,只不过是影响了表现形式。这里的作用就是给用户看的时候,他能理解这个是他的时区的时间,所以这种转换就是为了输出可视化字符串。
由于replace过于粗暴,所以还是最好别用了, replace中传入pytz.tzinfo就有bug。实在要用就用zoneinfo,不要用pytz。

2.4 时间比较

时间比较需要注意的是,要么两个时间都不带timezone,要么都带,不能一个带一个不带。所以推荐都带,两个时间相减时,得到timedelta。因为有些服务的API返回的date是带有timezone的,所以最好我们自己的时间也带上。