Python工具:pathlib

news2024/9/28 13:25:00

文件的路径实际上是一件很困扰的时间(各种平台有时候规则不一样,有时候还需要考虑字符转义的问题),因此我直接推荐使用模块 pathlib,当然,如果您不介意的话,可以使用 os.path 做较为低级的路径操作…

文档:https://docs.python.org/3/library/pathlib.html#module-pathlib

源代码:https://github.com/python/cpython/blob/3.12/Lib/pathlib.py

1.路径对象

pathlib 的文档中有这样一张类继承图片,让我来为您细细介绍该继承图:

在这里插入图片描述

  • Path(具体路径类):是 pathlib 中的具体路径类,它继承自 PurePathPath 类除了能够执行纯路径的抽象操作外,还能够进行与文件系统交互的实际文件和目录操作,比如创建文件、删除文件、读取文件内容等。

    """使用具体路径类"""
    from pathlib import Path
    
    concrete_path = Path("some/path/file.txt")
    concrete_path.touch()  # 在文件系统中创建文件
    print("File Exists:", concrete_path.exists())
    
  • PurePath(纯路径类):主要用于对路径字符串本身进行抽象的操作,比如:连接路径的不同部分、提取路径的各个部分等。是对路径的纯粹抽象,不牵涉到实际的文件或目录

    """使用纯路径类"""
    from pathlib import PurePath
    
    pure_path = PurePath("some/path")
    print("Pure Path Parts:", pure_path.parts)
    

    所以,当你只需要对路径进行抽象的操作时,使用 PurePath 足够了。但如果你需要进行实际的文件系统操作,就应该使用 Path,在本系列文章中,更多使用 Path 类。

  • PosixPathWindowsPath 这两个类分别是 Path 的子类,用于提供特定于操作系统的行为。PosixPath 用于类 Unix 操作系统,而 WindowsPath 用于 Windows 操作系统。通常你可以直接使用 Pathpathlib 会根据你的操作系统选择适当的子类。

  • PurePosixPathPureWindowsPath:类似于 PosixPathWindowsPath,这两个类是 PurePath 的子类,提供了特定于操作系统的路径抽象。

实际上上述类都是将字符串包装起来而已,如果需要取得上述路径对象的包装部分,直接使用 str() 即可获取被包装起来的字符串部分。

2.纯路径对象操作

可以通过 PurePath 对象来拼接目录形成字符串,并且在不同平台下生成对应的字符串,考虑分别在 Windows11Centos7 下运行以下代码:

"""拼接字符路径"""
import os
from pathlib import PurePath
from pathlib import PureWindowsPath
from pathlib import PurePosixPath

print("当前工作目录为:", os.getcwd())
print(PurePath( 'FatherDir', 'SonDir', 'setup.py'))
print(PureWindowsPath( 'FatherDir', 'SonDir', 'setup.py'))
print(PurePosixPath( 'FatherDir', 'SonDir', 'setup.py'))

Windows11 下运行结果为:

# Windows11 下运行结果
> python pathTest.py
当前工作目录为: C:\Users\Limou_p350ml9\Desktop\Test
fatherDir\sonDir\setup.py
fatherDir\sonDir\setup.py
fatherDir/sonDir/setup.py

Centos7 下运行结果为:

# Centos7 下运行结果
$ python3 pathTest.py
当前工作目录为: /home/ljp/LimouGitFile/limou-c-test-code/2024归档/my_code_2024_1_24
FatherDir/SonDir/setup.py
FatherDir\SonDir\setup.py
FatherDir/SonDir/setup.py

因此一般我们都是使用 PurePath 对象让 pathlib 在不同平台下自动转化为适应不同平台的路径字符串,只有在某些特定的场合下才会使用另外两个子类…

注意:后续代码为避免不必要的混乱,我只在 Windows11 下运行关于 PurePath 对象的代码,关于在 Centos7 或者其他平台下的运行结果大同小异,只不过格式不太一样,您可以自己验证一下…

补充:如果使用没有任何参数的 PurePath(),则会返回指向当前目录的 . 符号。

对于这三个类,都可以用以下方法构成一个 PurePath 对象:

  1. 可以传入字符串,并用逗号进行连接
  2. 也可以采用传入 Path 对象来连接(甚至部分 Path 对象,部分字符串,关于 Path 对象的创建我们后面提及)
  3. 或者直接传入我们在代码文件所处文件获取到的路径字符串作为参数,pathlib 会自动做转化处理(关于这些处理您可以前去文档看看,我不再阐述细节)
"""多种形成 PurePath 对象的方法"""
import os
from pathlib import PurePath
from pathlib import Path

# 创建路径字符串
print("当前工作目录为:", os.getcwd())

print(PurePath( 'FatherDir', 'SonDir', 'setup.py' )) # 传入多个字符串进行拼接
print(PurePath( Path('FatherDir'), Path('SonDir'), Path('setup.py') )) # 传入多个 Path 对象进行拼接
print(PurePath( Path('FatherDir'), 'FatherDir', 'SonDir', 'setup.py' )) # 传入部分 Path 对象和字符串对象
print(PurePath( os.getcwd() )) # 传入从本平台获取到的字符串

补充:文档在这里还提及了一个警告,如果 foo 是一个符号链接(例如 Linux 下的软链接),指向另一个目录,那么 PurePosixPath('foo/../bar') 的简化结果不应该简单地变成 PurePosixPath('bar')。这是因为符号链接可能引入了路径的实际结构,而简单地去除 foo/../ 可能会导致错误的路径。

并且在某些平台下,文件路径是不区分大小写的(例如 Windows11,该平台对目录名和文件名的大小写并不敏感),也因此会影响到路径对象比较的结果(这点在排序路径字符串上就会明显体现出来)。

"""路径的比较"""
from pathlib import PurePath
from pathlib import PureWindowsPath
from pathlib import PurePosixPath

print(PurePosixPath('foo') == PurePosixPath('FOO')) # 在一些类 Unix/Linux 平台下对大小写敏感 
print(PureWindowsPath('foo') == PureWindowsPath('FOO')) # 在 Windows 系列平台下,基本对大小写不敏感

print(PurePosixPath('FOO') in { PurePosixPath('foo') })
print(PureWindowsPath('FOO') in { PureWindowsPath('foo') })

print(PurePosixPath('C:') < PurePosixPath('d:'))
print(PureWindowsPath('C:') < PureWindowsPath('d:'))

除了可以对路径对象进行比较,还可以使用 / 操作符,该字符在任何支持的平台下均适用,可以用来连接两个 PurePath 对象,比直接使用 PurePath() 构造一个路径对象更加方便。

不过该运算符有一个使用前提,要求操作符的左操作数本身是一个 PurePath 对象,右操作数既可以是字符串,也可以是 PurePath 对象,最后的运算结果是一个 PurePath 对象。

"""拼接路径对象"""
from pathlib import PurePath

p = PurePath('/home')
q = PurePath('limou')

print(p)
print(p / 'dimou' / 'test.py')
print(p / q)

该运算符在创建多个子路径的时候非常好用。

如果需要访问路径对象中路径字符串的各个部分,则可以使用 PurePath.parts 属性来获取各个部分组成的元组。

# 获取路径的每个部分
import os
from pathlib import PurePath

p = PurePath(os.getcwd())
print(p.parts) # 得到元组 ('C:\\', 'Users', 'Limou_p350ml9', 'Desktop', 'Test')

另外,您最好了解一下不同平台对于路径字符串的不同部分的解释。

在这里插入图片描述

我们可以通过以下属性来获取这些部分(如果对应平台下没有某些部分,则对应属性的值为空字符串):

  • drive:获取驱动
  • root:获取根
  • anchor:获取锚点
  • parents:获取父路径序列,可使用下标访问不同范围的父路径(在 3.10 版本中支持切片和负索引),也可以直接使用 parent 属性获得最小范围的父路径
  • namestemsuffixe:获取文件名、获取主干名、获取最后一个后缀名
  • suffixes:获取后缀名列表(因为有的文件具有多个后缀名)
"""获取路径的各个部分"""
from pathlib import PurePath
from pathlib import PureWindowsPath
from pathlib import PurePosixPath

# 获取驱动器
print("获取驱动器")
print(PureWindowsPath('c:/Program Files/').drive)
print(PureWindowsPath('//host/share/foo.txt').drive) # UNC 共享也被视为驱动器
print(PurePosixPath('/etc').drive)

# 获取根
print("获取根")
print(PureWindowsPath('c:/Program Files/').root)
print(PureWindowsPath('c:Program Files/').root)
print(PureWindowsPath('//host/share').root)
print(PurePosixPath('/etc').root) # UNC 共享始终有一个根

# 获取锚点
print("获取锚点")
print(PureWindowsPath('c:/Program Files/').anchor)
print(PureWindowsPath('c:Program Files/').anchor)
print(PurePosixPath('/etc').anchor)
print(PureWindowsPath('//host/share').anchor)

# 获取父路径
print("获取父路径")
p = PurePosixPath('/a/b/c/d').parent
print(p)
print(p.parents[0])
print(p.parents[1])
print(p.parents[2])

# 获取文件名
p = PurePosixPath('my/library/library.tar.gz')
print(p.name)
print(p.stem)
print(p.suffix)
print(p.suffixes)

上述就是关于纯路径对象的基本操作,下面来重点介绍一些关于纯路径对象的方法:

  1. as_posix():转化为 posix 风格的路径
  2. as_uri():将本地绝对路径转化为标准的 URI 格式,该格式适用于 Web 获取其他网络上引用文件(如果不是绝对路径则会引发错误)
  3. is_absolute():判断路径是否为绝对路径
  4. is_relative_to():检查一个路径是否相对于其他路径
  5. is_reserved():检查文件名是否为保留字
  6. joinpath(*pathsegments):连接路径对象中的路径字符(主要是在代码中动态连接,但是用 / 实际更好一些…)
  7. match(pattern, *, case_sensitive=None):检查通配符匹配是否正确
  8. with_name(name)
  9. with_stem(stem)
  10. with_suffix(suffix)

上述函数没什么好讲解的,直接看我下面的代码运行例子即可:

"""使用 PurePath 各个方法"""
import os
from pathlib import PurePath
from pathlib import PureWindowsPath
from pathlib import PurePosixPath
p1 = PurePath(os.getcwd())
p2 = PurePath('dir1', 'dir2', 'text.txt')
print(p1)
print(p2)


# 转化为 posix 风格的字符串
print(p1.as_posix())
print(p1.as_posix())


# 将本地绝对路径转化为标准的 URI 格式
print(p1.as_uri())
# print(p2.as_uri()) # 抛出错误


# 判断路径是否为绝对路径
if p1.is_absolute():
    print("是绝对路径")
if not p2.is_absolute():
    print("是相对路径")


# 检查一个路径是否相对于其他路径
# (1)创建两个 Path 对象
path1 = PurePath("/path/to/your/")
path2 = PurePath("/path/to/your/file.txt")
# (2)使用 is_relative_to() 方法检查是否相对于另一个路径
result = path2.is_relative_to(path1) # path2 是相对于 path1 确定的
print("Is Path 2 relative to Path 1?", result)

# 检查文件名是否为保留字
print(PureWindowsPath('nul').is_reserved())
print(PurePosixPath('nul').is_reserved())


# 连接路径对象中的路径字符
print(PurePosixPath('/etc').joinpath('passwd'))
print(PurePosixPath('/etc').joinpath(PurePosixPath('passwd')))
print(PurePosixPath('/etc').joinpath('init.d', 'apache2'))
print(PureWindowsPath('c:').joinpath('/Program Files'))


# 检查通配符匹配是否正确
print(PurePath('a/b.py').match('*.py'))
pattern = PurePath('*.py')
print(PurePath('a/b.py').match(str(pattern))) # 我使用的版本较低,貌似在新版本中这里可以直接使用路径对象的参数而不用转化为字符串
print(PurePath('/a/b/c.py').match('a/*.py'))
print(PurePosixPath('b.py').match('*.PY')) # 遵循不同平台下的大小写规则匹配
print(PureWindowsPath('b.py').match('*.PY'))


# 更改路径的部分
p = PureWindowsPath('c:/Downloads/pathlib.tar.gz')
print(p.with_name('setup.py'))
p = PureWindowsPath('c:/Downloads/draft.txt')
print(p.with_stem('final'))
p = PureWindowsPath('c:/Downloads/pathlib.tar.gz')
print(p.with_suffix('.bz2'))

补充:上述有一个方法 is_reserved() 有提及一个“保留字”的概念,实际上类似编程语言中“不允许用户以关键字作为变量命名”的规则类似,有些平台也保留一些字符,不允许用户以这些字符作为文件名/目录名(下面例子尝试在 windows 中创建文件夹 COM,但是创建失败)。

在这里插入图片描述

注意:貌似有两个方法太新了,在我的模块版本中没法使用,您有兴趣可以前往了解一下 relative_to()with_segments()

3.具体路径对象操作

具体路径(Path)是纯路径类(PurePath)的子类,因此继承了后者提供的所有操作,但是除此之外还提供了对路径对象进行系统调用的方法,因此 Path 对象会比 PurePath 对象更加常用。

当然,有些方法略有区别,不是直接粗暴继承下来,还新增了检查对象是否适应平台的功能。

"""不允许创建和平台不对应的路径对象"""
from pathlib import Path
from pathlib import WindowsPath
from pathlib import PosixPath

print(Path('setup.py'))
# print(PosixPath('setup.py')) # 由于我使用的 Windows 平台,所以这个对象不被允许创建
print(WindowsPath('setup.py'))

因此通常情况下,为了代码的可移植性,建议使用路径对象 Path

下面除了 Path 继承下来的方法(因为除了创建会检查平台以外其他基本差不多),我们介绍一些该子类专有的方法:

  • cwd()home():返回工作目录、家目录

    """寻找工作路径和家路径"""
    from pathlib import Path
    print(Path.cwd())
    print(Path.home())
    
  • stat():查询文件的属性

    """查询文件的属性"""
    from pathlib import Path
    p = Path('pathTest.py')
    print(p.stat().st_size)
    print(p.stat().st_mtime)
    print(p.stat().st_mode)
    # 还可以查询其他属性,具体去看下文档
    
  • exists():查询文件/目录是否真实存在

    """查找文件/目录是否存在"""
    from pathlib import Path
    print(Path('.').exists())
    print(Path('pathTest.py').exists())
    print(Path('/etc').exists())
    print(Path('nonexistentfile').exists())
    
  • chmod():修改文件权限

    """更改文件模式和权限"""
    from pathlib import Path
    p = Path('pathTest.py')
    p.chmod(0o777) # 设置文件为所有用户都有完整权限
    p.stat().st_mode # 注意不同平台对权限的理解可能不太一样,这点需要用户自己把控
    
  • 一些对目录操作的方法:

    (1)mkdir():创建空目录

    (2)rmdir():删除空目录(递归删除目录及其内容可用 shutil.rmtree(),该方法是 shutil 模块的,貌似 pathlib 没有直接提供类似方法)

    """创建目录/删除目录"""
    from pathlib import Path
    # 创建一个路径对象
    path = Path('C:/Users/Limou_p350ml9/Desktop/Test/NewFolder')
    # 创建目录
    path.mkdir()
    # 删除目录
    path.rmdir() # 目录必须为空
    
  • 一些对文件操作的方法:

    (1)touch():创建文件

    (2)unlink():减少文件的链接数(相当于删除文件)

    (3)write_text()/write_bytes():写入文件(前者按文本,后者按字节)

    (4)read_text()/read_bytes():读取文件(前者按文本,后者按字节)

    (5)rename():文件重命名(也可以达到移动文件到其他路径的目的)

    """创建文件/删除文件/写入文件/读取文件/比较文件"""
    from pathlib import Path
    file_path = Path(r"C:/Users/Limou_p350ml9/Desktop/Test/new_file.txt")
    # 创建文件
    file_path.touch()
    # 删除文件
    file_path.unlink()
    
    # 读取/写入文件
    p = Path(r"C:\Users\Limou_p350ml9\Desktop\Test\test_1.txt")
    p.write_text('Text file contents') # 以字节写入可用 write_bytes()
    print(p.read_text()) # 以字节读取可用 read_bytes()
    
    # 重命名文件(该方法还可以用来当作移动文件使用)
    p = Path('foo')
    p.open('w').write('some text')
    
    target = Path('bar')
    p.rename(target)
    
  • iterdir()glob():获取所有指定目录下的子目录和子文件列表,后者则在指定目录下使用通配符查询匹配的文件或目录

    """获取当前目录下的所有子目录和子文件"""
    from pathlib import Path
    p = Path(r"C:\Users\Limou_p350ml9\Desktop\Test")
    for child in p.iterdir(): 
        print(child)
    
    """返回匹配指定模式的文件路径表"""
    from pathlib import Path
    pattern = Path(r"C:\Users\Limou_p350ml9\Desktop\Test")
    matched_files = pattern.glob("*.txt")
    for file_path in matched_files:
        print(file_path)
    # glob() 方法通过匹配指定目录下所有以 .txt 结尾的文件,返回一个生成器
    # 通过迭代生成器,我们可以获取匹配到的每个文件的路径并进行处理
    
  • absolute()resolve():返回对应文件/目录的绝对路径

    from pathlib import Path
    # 返回绝对路径
    p = Path('pathTest.py')
    print(p.absolute())
    
    # 下面的方法可以解析符号链接
    p = Path('.')
    print(p.resolve())
    p = Path('..')
    print(p.resolve())
    
  • is_dir()is_file():检查路径是否指向目录或文件

    """检查路径是否指向目录或路径"""
    from pathlib import Path
    p = Path(r":\Users\Limou_p350ml9\Desktop\Test\pathTest.py")
    print(p.is_dir())
    print(p.is_file())
    
  • samefile():可以判断两个文件或目录的指向是否相同

    """判断是否指向相同的文件"""
    from pathlib import Path
    p = Path('pathTest.py')
    q = Path('test_1.txt')
    print(p.samefile(q))
    

注意:还有一些比较细碎的方法,这里不再展开您可以直接查阅文档…

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1409913.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

蓝桥杯(Python)每日练Day5

题目 OJ1229 题目分析 题目完全符合栈的特征&#xff0c;后进先出。如果能够熟练使用列表的9种方法那么这道题很容易解出。 题解 a[]#存衣服 nint(input()) for i in range(n):llist(input().split())#判断每一步的操作if len(l[0])2:a.append(l[1])else:while a.pop()!l…

不停机迁移,TDengine 在 3D 打印技术中的“焕新”之路

小T导读&#xff1a;自 2021 年我们正式使用 TDengine 至今已接近三年&#xff0c;现在 TDengine 已经成熟应用于我们多个项目当中&#xff0c;凭借着强大的读写存储能力&#xff0c;为我司多项业务的核心数据保驾护航。近期我们团队刚好完成 TDengine 2.x 到 3.x 的数据迁移&a…

Redisson 分布式锁可重入的原理

目录 1. 使用 Redis 实现分布式锁存在的问题 2. Redisson 的分布式锁解决不可重入问题的原理 1. 使用 Redis 实现分布式锁存在的问题 不可重入&#xff1a;同一个线程无法两次 / 多次获取锁举例 method1 执行需要获取锁method2 执行也需要&#xff08;同一把&#xff09;锁如…

Redis面试

1.说说什么事redis Redis是一种基于键值对的NoSql数据库。 Redis中的value支持string&#xff08;字符串&#xff09;、hahs&#xff08;哈希&#xff09;、list、set、zset&#xff08;有序集合&#xff09;、bitmaps&#xff08;位图&#xff09;&#xff0c;HyperLoglog等数…

树的学习day01

树的理解 树是一种递归形式的调用 树是由于多个结点组成的有限集合T 树中有且仅有一个结点称为根 当结点大于1的时候&#xff0c;往往其余的结点为m个互不相交的有限个集合T1,…,Tm&#xff0c;每个互不相交的有限集合本身右是一棵树&#xff0c;称为这个根的子树 空树也是树 关…

【Web前端开发基础】CSS3之空间转换和动画

CSS3之空间转换和动画 目录 CSS3之空间转换和动画一、空间转换1.1 概述1.2 3D转换常用的属性1.3 3D转换&#xff1a;translate3d&#xff08;位移&#xff09;1.4 3D转换&#xff1a;perspective&#xff08;视角&#xff09;1.5 3D转换&#xff1a;rotate3d&#xff08;旋转&a…

城市开发区视频系统建设方案:打造视频基座、加强图像数据治理

一、背景需求 随着城市建设的步伐日益加快&#xff0c;开发区已经成为了我国工业化、城镇化和对外开放的重要载体。自贸区、开发区和产业园的管理工作自然也变得至关重要。在城市经开区的展览展示馆、进出口商品展示交易中心等地&#xff0c;数千路监控摄像头遍布各角落&#…

matlab窗函数-hann窗和hamming窗函数

窗函数的作用 在时域上&#xff0c;窗函数可以看作是对原始信号进行截断或调制的加权函数。这些窗函数通常在时域上是有限的宽度&#xff0c;并且具有对称性&#xff0c;如矩形窗、汉宁窗、汉明窗和布莱克曼窗等。例如&#xff0c;汉明窗是一种对称窗函数&#xff0c;它可以用…

Cuda笔记1

1、培训001 1 1…100&#xff0c;CPU是串行执行&#xff0c;GPU是分成几部分同时计算&#xff0c;如123,456… 2、培训002 一来一回 每种定义有对应的调用位置&#xff0c;和执行位置&#xff0c;不对会报错。 下图是用NVPROF时间分析 下图是资源分析 1&#xff09; CUDA…

《统计学习方法:李航》笔记 从原理到实现(基于python)-- 第 2章感知机

文章目录 第 2章感知机2.1 感知机模型2.2 感知机学习策略2.2.1 数据集的线性可分性2.2.2 感知机学习策略 2.3 感知机学习算法2.3.1 感知机学习算法的原始形式2.3.2 算法的收敛性2.3.3 感知机学习算法的对偶形式 实践&#xff1a;二分类模型&#xff08;iris数据集&#xff09;数…

爬虫正则+bs4+xpath+综合实战详解

Day3 - 1.数据解析概述_哔哩哔哩_bilibili 聚焦爬虫&#xff1a;爬取页面中指定的页面内容 编码流程&#xff1a;指定url -> 发起请求 -> 获取响应数据 -> 数据解析 -> 持久化存储 数据解析分类&#xff1a;正则、bs4、xpath(本教程的重点) 数据解析原理概述&am…

2024群硕荣誉首响,第十三届公益节斩获企业大奖

2024年1月23日至24日&#xff0c;第十三届公益节在北京顺利举行。 历经多年的探索和实践&#xff0c;公益节已经成为中国公益慈善领域颇具影响力的年度盛事。本届公益节全面恢复线下活动&#xff0c;各大企业齐聚现场&#xff0c;展现社会责任的力量&#xff0c;现场气氛热烈而…

什么是5G RedCap?5G RedCap有什么优势?

5G RedCap&#xff08;Reduced Capability&#xff09;是指5G轻量化技术&#xff0c;即通过对5G技术进行一定程度的“功能裁剪”&#xff0c;来降低终端和模组的复杂度、成本、尺寸和功耗等指标&#xff0c;从而“量体裁衣”适配不同的物联需求&#xff0c;实现兼顾物联网系统的…

【送书活动八期】docker容器中登陆并操作postgresql

这里的背景比较简单&#xff0c;因为区块链浏览器使用的是blockscout&#xff0c;blockscout的数据库选择的是postgresql&#xff0c;这些服务组件都是使用的docker容器来管理&#xff0c;今天进行区块链上交易查询的时候&#xff0c;发现数据存在部分问题&#xff0c;因此需要…

大数据信用查询系统能查到什么呢?

在金融助贷行业&#xff0c;大数据有叫大数据信用或者网贷大数据&#xff0c;在申贷的时候&#xff0c;想必大多数人都有听说过&#xff0c;很多人因为大数据不良的原因申贷被拒过&#xff0c;那大数据信用查询系统能查到什么呢?本文就简单为大家总结几点大数据信用查询的内容…

freeRTOS总结(十)消息 队列

1&#xff0c;队列简介&#xff08;了解&#xff09; 队列是任务到任务、任务到中断、中断到任务数据交流的一种机制&#xff08;消息传递&#xff09; 与全局变量的区别 类似全局变量&#xff1f;假设有一个全局变量a 0&#xff0c;现有两个任务都在写这个变量a 假如 当任务…

三层架构-pc通外网小实验

要求:pc端能上外网(isp) 效果图:pc1(VLAN2)和pc3(vlan3)都能ping通2.2.2.2(R2环回) 代码:#先配置好r1,r2,端口ip # [R1] ip route-static 0.0.0.0 0.0.0.0 10.1.1.2 acl 2000 rule permit source any interface GigabitEthernet0/0/2 nat outbound 2000 …

Android消息推送 SSE(Server-Sent Events)方案实践

转载请注明出处&#xff1a;https://blog.csdn.net/kong_gu_you_lan/article/details/135777170 本文出自 容华谢后的博客 0.写在前面 最近公司项目用到了消息推送功能&#xff0c;在技术选型的时候想要找一个轻量级的方案&#xff0c;偶然看到一篇文章讲ChatGPT的对话机制是基…

Bank_Code_FullName_2020.06.16.xlsx

Bank_Code_FullName_2020.06.16.xlsx 银行联行号和全称 https://download.csdn.net/download/spencer_tseng/88780566 144692条记录&#xff0c;没法子贴上去

抖音VR直播:沉浸式体验一键打通360度精彩

随着5G技术的发展&#xff0c;VR直播近年来也逐步进入到大众的视野中&#xff0c;相比于传统直播&#xff0c;VR直播能够提供更加丰富的内容和多样化的互动方式&#xff0c;让观众更有沉浸感和参与感。现如今&#xff0c;抖音平台也上线了VR直播&#xff0c;凭借沉浸式体验和有…