• sticky是sticky 值越大,顶置的文章越靠前

  • thumbnail: “IMAGE_LINK”

    redefine对首页文章添加缩略图

  • 摘要

    excerpt: “这是文章摘要 This is the excerpt of the post”或者直接设置为false

  • massage: 文章的密码的提示,但是似乎没有什么用,总是显示Hey,password is required here.

查看Python版本

在命令行中

  • 系统的Python版本

    windows+R打开cmd,输入python -V或者python --version,即可查看Python的版本,此版本是存入系统的环境变量的版本。

  • anaconda 的Python版本

    Windows键输入anaconda,调出来anaconda prompt的终端,此时进入到base环境中,可以输入 conda env list,就可以查看所有的虚拟环境。

    然后输入conda activate(空格)环境名,比如conda activate Python_relearning就可以激活对应的环境,接着就可以重复”系统的Python版本“的查看方法,输入python -V或者python --version,即可查看Python的版本。

    退出环境输入conda deactivate 即可,就可退出到base环境。

在python中查看

无论是在Pycharm中,还是在终端的python窗口中,都可以用下面的命令:

1
2
import sys
print(sys.version_info)

上述命令返回一个包含了版本号5个组成部分的元组,这5个部分分别是主要版本号(major)、次要版本号(minor)、微型版本号(micro)、发布级别(releaselevel)和序列号(serial)

如下:

1
sys.version_info(major=3, minor=11, micro=0, releaselevel='final', serial=0)

还可以直接用下面的简单的命令:

1
2
import sys
print(sys.version)

这个命令直接返回包含主版本和次版本的字符串,还包括发布公司等信息:

1
3.11.0 | packaged by Anaconda, Inc. | (main, Mar  1 2023, 18:18:21) [MSC v.1916 64 bit (AMD64)]

使用platform模块

详见本文的”platform模块“的内容

Pycharm乱码问题解决

更改文件编码设置

在Pycharm上方导航栏,找到文件,

文件——>设置——>编辑器——>文件编码

将设置统一改为”utf-8”,并且设置为”不含BOOM“,如下图所示:

更改Python文件模板

在Pycharm上方导航栏,找到文件,

文件——>设置——>编辑器——>文件和代码模板,在文件标签中找到”Python Script“

加入以下内容:

1
2
#!/user/bin/env python3
# -*- coding: utf-8 -*-

如下图所示:

检查默认编码信息

使用sys库里面的函数getdefaultencoding(),即可查看编码信息:

1
2
default_encoding = sys.getdefaultencoding()
print("Python解释器的默认编码:",default_encoding)

platform模块

platform模块是Python标准库的一部分,因此无需额外安装。只需在Python脚本中导入即可开始使用。

获取操作系统及计算机信息

1
2
3
4
5
6
7
8
9
10
11
12
13
import platform

# 获取操作系统名称
os_name = platform.system()

# 获取操作系统版本
os_version = platform.release()

# 获取计算机名称
computer_name = platform.node()

# 获取计算机处理器的名称
processor_name = platform.processor()

获取python信息

1
2
3
4
5
6
7
8
9
10
11
import platform

# 获取Python版本,如返回'3.11.0'
python_version = platform.python_version()

# 获取Python实现名称,如CPython、Jython或者IronPython
python_implementation = platform.python_implementation()


# 获取当前Python解释器的编译器信息,如GCC、Clang或者Microsoft Visual C++
python_compiler = platform.python_compiler()

路径的常识

“./“:代表目前所在的目录。

“ . ./“代表上一层目录。

“/“:代表根目录。

  • 路径最后加/,比如”mypath/“表示在mypath文件夹下面,不加/,比如”mypath”,表示在mypath的上一级目录中。

  • “root/a/../b/../file.txt”实际路径是”root/file.txt”,因为a,b都被后面的../省略了,

  • 但是”root/a../b/../file.txt”路径却是”root/a../file.txt”,因为a后面的../返回前一级目录,但是并不存在前一级目录(相比于上面一个例子少了一个/),所以把a..视为一个目录名字。

os模块

os.path——常用的路径操作

显示绝对路径

1
2
3
4
5
6
7
# 绝对路径显示1
abspath=os.path.abspath('os.path.py')
print("本文件的绝对路径:",abspath)

# 绝对路径显示2
abspath=os.path.normpath(os.path.join(os.getcwd()))
print("当前工作的的绝对路径:",abspath)

连接两个或更多的路径名组件

1
2
3
4
5
6
7
8
9
10
11
# 连接两个或更多的路径名组件
Path1 = 'home'
Path2 = 'develop'
Path3 = 'code'
path_a=os.path.join(Path1,Path2,Path3)
path_b=os.path.join(Path1,Path2,Path3,'') # 多加一个空字符,可以在最后多加一个\
print('末尾不带反斜杠:',path_a) # 输出home\develop\code
print('末尾带反斜杠:',path_b) # 输出 home\develop\
# 如果参数中存在绝对路径或者以 " \ " 或“ / ”开头的路径,
# os.path.join() 会按顺序取最后的绝对路径或者 " \ " 或 “ / ” 开头的路径作为基础,
# 并将其与其余的相对路径组合。

如果参数中存在绝对路径或者以 “ \ “ 或“ / ”开头的路径,os.path.join() 会按顺序取最后的绝对路径或者 “ \ “ 或 “ / ” 开头的路径作为基础,并将其与其余的相对路径组合。

1
2
3
4
5
path1='/a/b/c'
path2='/d/e' # 最后一个“ / ” 开头的路径
path3='f'
print(os.path.join(path1,path2,path3))
# 输出:/d/e\f

检查指定的路径是否存在

返回布尔值

1
2
exists = os.path.exists(r'E:\codes\Python\python_relearning')
print(exists)

检查路径是否为文件

返回布尔值

1
2
is_file = os.path.isfile(r'E:\codes\Python\python_relearning')
print(is_file)

检查路径是否为目录

返回布尔值

1
2
is_dir = os.path.isdir(r'E:\codes\Python\python_relearning')
print(is_dir)

获取路径中的最后一级目录 (basename)

如果最后一个是文件,则返回文件名

1
2
base_name = os.path.basename(r'E:\codes\Python\python_relearning')
print('base_name:',base_name)

获取文件路径 (dirname)

返回路径中的目录名。如果路径以目录名结尾,那么就是这个目录的路径。

1
2
3
4
5
dir_name1=os.path.dirname(r'E:\codes\Python\python_relearning')
print(dir_name1) # 输出:E:\codes\Python

dir_name1=os.path.dirname(r'E:\codes\Python\python_relearning\os.path.py')
print(dir_name1) # 输出:E:\codes\Python\python_relearning

分割目录名和文件名

仅仅是对于字符串的操作,以最后一个\为分隔符,返回元组

1
2
3
4
dir_name, base_name = os.path.split(r'E:\codes\Python\python_relearning\os.path.py')
print(f"Directory: {dir_name},\nBase Name: {base_name}")
# 第一行输出E:\codes\Python\python_relearning,
# 第二行输出os.path.py

分离文件名和扩展名

1
2
3
filename, extension = os.path.splitext(r'E:\codes\Python\python_relearning\os.path.py')
print(f"File name: {filename}") # 输出:E:\codes\Python\python_relearning\os.path
print(f"Extension: {extension}") # 输出:.py

从绝对路径出发,找到相对路径

1
2
3
4
5
6
# 第一个参数加\
relative_path = os.path.relpath(r'\os.path.py', r'E:\\codes')
print(f"Relative path: {relative_path}") # 输出:..\os.path.py
# 第一个参数不加\
relative_path = os.path.relpath(r'os.path.py', r'E:\\codes')
print(f"Relative path: {relative_path}") # Python\python_relearning\os.path.py

关于加不加\,下面是AI生成的回答:

在您的代码示例中,您使用 os.path.relpath() 函数计算相对路径,但是您提供的第一个参数(目标路径)的形式影响了结果。这里需要理解 os.path.relpath() 函数如何处理相对路径和绝对路径。

  1. 当第一个参数(目标路径)以反斜杠 \ 开头时,Python 在 Windows 系统上会将其解释为相对于当前驱动器的根目录的路径。因此,r'\os.path.py' 实际上表示的是一个从当前驱动器根目录开始的路径。
    下面是您的第一个代码示例的详细解释:

    1
    2
    relative_path = os.path.relpath(r'\os.path.py', r'E:\codes')  
    print(f"Relative path: {relative_path}") # 输出:..\os.path.py
  • r'\os.path.py' 被解释为从当前驱动器的根目录开始的路径。
  • r'E:\\codes' 是一个绝对路径。
  • os.path.relpath() 计算从 r'E:\\codes'r'\os.path.py' 的相对路径,结果是 ..\os.path.py,因为 os.path.pyE:\codes 的上一级目录。
  1. 当第一个参数(目标路径)不以反斜杠 \ 开头时,它被视为相对于当前工作目录的路径。
    下面是您的第二个代码示例的详细解释:

    1
    2
    relative_path = os.path.relpath(r'os.path.py', r'E:\codes')  
    print(f"Relative path: {relative_path}") # 输出:Python\python_relearning\os.path.py
  • r'os.path.py' 被解释为相对于当前工作目录的路径。
  • r'E:\\codes' 是一个绝对路径。
  • os.path.relpath() 计算从 r'E:\\codes'r'os.path.py' 的相对路径。由于 os.path.py 被视为相对于当前工作目录的路径,假设当前工作目录是 E:\codes\Python\python_relearning,则结果是 Python\python_relearning\os.path.py
    请注意,第二个示例的输出取决于当前工作目录的实际位置。如果当前工作目录不是 E:\codes\Python\python_relearning,则输出会有所不同。
    因此,确保您了解 os.path.relpath() 如何处理不同类型的路径,并正确提供目标路径和起始路径。

规范路径

os.path.normpath() 函数用于规范化路径名,它将解析路径中的多余分隔符和上级目录引用(如 ..)。下面是该函数的具体行为和规则:

  1. 解析路径分隔符:它会将路径中的多个连续路径分隔符(例如 /\)替换为单个路径分隔符。

  2. 解析当前目录引用:它会移除路径中的 .,这代表当前目录。

  3. 解析上级目录引用:它会移除路径中的 ..,这代表上级目录,同时也会移除 .. 前面的目录名,除非 .. 指向根目录。

例程如下:

1
2
3
normalized_path = os.path.normpath(r'path/to\.\\ignored\..\test.txt')
print(f"Normalized path: {normalized_path}")
# 输出path\to\test.txt

更多例程:

1
2
3
4
5
6
7
8
normalized_path_0 = os.path.normpath(r'a../b..\file.txt')
print(f"Normalized path: {normalized_path_0}") # 输出 a..\b..\file.txt

normalized_path_1 = os.path.normpath(r'root/a/../..\file.txt')
print(f"Normalized path: {normalized_path_1}") # 输出root\a..\file.txt

normalized_path_2 = os.path.normpath(r'root/a../\..\file.txt')
print(f"Normalized path: {normalized_path_2}") # 输出root\file.txt

OS模块其他功能

汇总 查找表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
os.mknod("text.txt"):创建空文件
os.system():运行shell命令
os.exit():终止当前进程
os.getcwd() 取得当前工作目录
os.getenv()和os.putenv:分别用来读取和设置环境变量
os.environ['MY_USER']
os.chdir('dirname') 改变目录
os.mkdir/makedirs('dirname')创建目录/多层目录
os.rmdir/removedirs('dirname') 删除目录/多层目录
os.remove(‘path/filename’) 删除文件
os.rename(oldname, newname) 重命名文件
os.walk() 生成目录树下的所有文件名
os.stat(file):获得文件属性
os.listdir('dirname') 列出指定目录的文件
os.chmod() 改变目录权限
os.access(path, mode) # 检测是否有访问权限的路径。

os.path.abspath(path) #返回绝对路径
os.path.basename(path) #返回文件名
os.path.commonprefix(list) #返回list(多个路径)中,所有path共有的最长的路径。'
os.path.dirname(path) #返回文件路径
os.path.exists(path) #路径存在则返回True,路径损坏返回False
os.path.lexists #路径存在则返回True,路径损坏也返回True
os.path.expanduser(path) #把path中包含的"~"和"~user"转换成用户目录
os.path.expandvars(path) #根据环境变量的值替换path中包含的”$name”和”${name}”
os.path.getatime(path) #返回最后一次进入此path的时间。
os.path.getmtime(path) #返回在此path下最后一次修改的时间。
os.path.getctime(path) #返回path的大小
os.path.getsize(path) #返回文件大小,如果文件不存在就返回错误
os.path.isabs(path) #判断是否为绝对路径
os.path.isfile(path) #判断路径是否为文件
os.path.isdir(path) #判断路径是否为目录
os.path.islink(path) #判断路径是否为链接
os.path.ismount(path) #判断路径是否为挂载点()
os.path.join(path1[, path2[, ...]]) #把目录和文件名合成一个路径'
os.path.normcase(path) #转换path的大小写和斜杠
os.path.normpath(path) #规范path字符串形式
os.path.realpath(path) #返回path的真实路径
os.path.relpath(path[, start]) #从start开始计算相对路径'
os.path.samefile(path1, path2) #判断目录或文件是否相同'
os.path.sameopenfile(fp1, fp2) #判断fp1和fp2是否指向同一文件'
os.path.samestat(stat1, stat2) #判断stat tuple stat1和stat2是否指向同一个文件'
os.path.split(path) #把路径分割成dirname和basename,返回一个元组
os.path.splitdrive(path) #一般用在windows下,返回驱动器名和路径组成的元组
os.path.splitext(path) #分割路径,返回路径名和文件扩展名的元组
os.path.splitunc(path) #把路径分割为加载点与文件
os.path.walk(path, visit, arg) #遍历path,进入每个目录都调用visit函数,visit函数必须有'
#3个参数(arg, dirname, names),dirname表示当前目录的目录名,names代表当前目录下的所有
#文件名,args则为walk的第三个参数
os.path.supports_unicode_filenames #设置是否支持unicode路径名
os.sep:取代操作系统特定的路径分隔符
os.name:指示你正在使用的工作平台。比如对于Windows,它是'nt',而对于Linux/Unix用户,它是'posix'

获取当前工作目录

1
os.getcwd()

返回绝对路径

列出目录下所有的文件和子目录

1
os.listdir(path)

返回指定的文件夹包含的文件或文件夹的名字的列表,列表以字母序

更改工作目录

1
os.chdir(path)

如果允许访问返回 True , 否则返回False。

创建一个新目录

1
os.mkdir(path)

用于创建目录,而不能创建文件

递归创建多级目录

1
os.makedirs(name, mode=511, exist_ok=False)
  • exist_ok:是否在目录存在时触发异常。如果 exist_ok 为 False(默认值),则在目标目录已存在的情况下触发 FileExistsError 异常;如果 exist_ok 为 True,则在目标目录已存在的情况下不会触发 FileExistsError 异常。
  • 无返回值

删除空的目录

1
os.rmdir(path)

用于删除指定路径的目录。仅当这是文件夹是空才可以, 否则, 抛出OSError。并且不能删除多级目录,如果传入参数是多级目录,仅仅会删除掉最后一级目录。

递归删除多级空目录

1
os.removedirs(path)

同样,要求目录为空

列出包含的文件或者文件夹列表

1
os.listdir(path)

列表以字母顺序。 它不包括 . 和 .. 即使它在文件夹中。

删除指定路径的文件

1
os.remove(path)

path指向的路径必须是文件,如果指定的路径是一个目录,将抛出OSError。

重命名文件或者目录

1
os.rename(src, dst)
  • src — 要修改的目录名或者文件路径

  • dst — 修改后的目录名或者文件路径

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    import os

    # 设置要创建的目录路径
    path = "aa/bb/cc"

    # 创建目录
    os.makedirs(path, exist_ok=True)

    # 修改目录名称
    os.renames(path,'1/2/3')

检查访问权限

1
os.access(path, mode);
  • path — 要用来检测是否有访问权限的路径。

  • modemodeF_OK,测试存在的路径,或者它可以是包含R_OK, W_OKX_OK或者R_OK, W_OKX_OK其中之一或者更多。

    • os.F_OK: 作为access()mode参数,测试path是否存在。
    • os.R_OK: 包含在access()mode参数中 , 测试path是否可读。
    • os.W_OK 包含在access()mode参数中 , 测试path是否可写。
    • os.X_OK 包含在access()mode参数中 ,测试path是否可执行。

更改文件或目录的权限

1
os.chmod(path, mode)
  • path — 文件名路径或目录路径。

  • flags — 可用以下选项按位或操作生成, 目录的读权限表示可以获取目录里文件名列表, ,执行权限表示可以把工作目录切换到此目录 ,删除添加目录里的文件必须同时有写和执行权限 ,文件权限以用户id->组id->其它顺序检验,最先匹配的允许或禁止权限被应用。

    • stat.S_IXOTH: 其他用户有执行权0o001
    • stat.S_IWOTH: 其他用户有写权限0o002
    • stat.S_IROTH: 其他用户有读权限0o004
    • stat.S_IRWXO: 其他用户有全部权限(权限掩码)0o007
    • stat.S_IXGRP: 组用户有执行权限0o010
    • stat.S_IWGRP: 组用户有写权限0o020
    • stat.S_IRGRP: 组用户有读权限0o040
    • stat.S_IRWXG: 组用户有全部权限(权限掩码)0o070
    • stat.S_IXUSR: 拥有者具有执行权限0o100
    • stat.S_IWUSR: 拥有者具有写权限0o200
    • stat.S_IRUSR: 拥有者具有读权限0o400
    • stat.S_IRWXU: 拥有者有全部权限(权限掩码)0o700
    • stat.S_ISVTX: 目录里文件目录只有拥有者才可删除更改0o1000
    • stat.S_ISGID: 执行此文件其进程有效组为文件所在组0o2000
    • stat.S_ISUID: 执行此文件其进程有效用户为文件所有者0o4000
    • stat.S_IREAD: windows下设为只读
    • stat.S_IWRITE: windows下取消只读

获取文件或者目录的状态信息

1
os.stat(path)

返回值

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)是最新的元数据更改的时间,在其它系统上(如Windows)是创建时间(详细信息参见平台的文档)。

遍历指定目录及其所有子目录

os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]])

参数

  • top — 是你所要遍历的目录的地址, 返回的是一个三元组(root,dirs,files)。

    • root 所指的是当前正在遍历的这个文件夹的本身的地址
    • dirs 是一个 list ,内容是该文件夹中所有的目录的名字(不包括子目录)
    • files 同样是 list , 内容是该文件夹中所有的文件(不包括子目录)
  • topdown —可选,为 True,则优先遍历 top 目录,否则优先遍历 top 的子目录(默认为开启)。如果 topdown 参数为 True,walk 会遍历top文件夹,与top 文件夹中每一个子目录。

  • onerror — 可选,需要一个 callable 对象,当 walk 需要异常时,会调用。

  • followlinks — 可选,如果为 True,则会遍历目录下的快捷方式(linux 下是软连接 symbolic link )实际所指的目录(默认关闭),如果为 False,则优先遍历 top 的子目录。

返回生成器。

假设我们有下面的目录结构:

1
2
3
4
5
6
7
8
9
10
11
12
+--A
| +--B3
| | +--C0
| | | +--Dt0.txt
| | +--Ct0.txt
| | +--Ct1.txt
| +--B4
| | +--C1
| | | +--Dt1.txt
| | +--Ct2.txt
| +--Bt0.txt
| +--Bt1.txt

其中A文件夹和执行程序的Python文件放在同一个目录下面

1
2
3
4
5
6
7
start_path='A'
# 查看返回的三元组
tri_tuple=os.walk(start_path)
tri_tuple_list=list(tri_tuple)
print('返回的三元组转化为列表'.center(20,'-'))
print(tri_tuple_list)
# 输出:[('A', ['B3', 'B4'], ['Bt0.txt', 'Bt1.txt']), ('A\\B3', ['C0'], ['Ct0.txt', 'Ct1.txt']), ('A\\B3\\C0', [], ['Dt0.txt']), ('A\\B4', ['C1'], ['Ct2.txt']), ('A\\B4\\C1', [], ['Dt1.txt'])]

将三元组分别转化为列表打印输出

1
2
3
4
5
6
7
8
9
10
11
12
13
start_path='A'

root_list=[root for root, dirs, files in os.walk(start_path)]
print('root_list:',root_list)
# 输出:root_list: ['A', 'A\\B3', 'A\\B3\\C0', 'A\\B4', 'A\\B4\\C1']

dirs_list=[dirs for root, dirs, files in os.walk(start_path)]
print('dirs_list:',dirs_list)
# 输出:dirs_list: [['B3', 'B4'], ['C0'], [], ['C1'], []]

files_list=[files for root, dirs, files in os.walk(start_path)]
print('files_list:',files_list)
# 输出:files_list: [['Bt0.txt', 'Bt1.txt'], ['Ct0.txt', 'Ct1.txt'], ['Dt0.txt'], ['Ct2.txt'], ['Dt1.txt']]

过滤特定格式文件

如下:

1
2
3
4
5
start_path='A'
for root, dirs, files in os.walk(start_path):
for file in files:
if file.endswith('.txt'):
print(os.path.join(root, file)

pathlib模块

参考教程