Day 24 元组和OS模块

今日任务:
  1. 认识元组,掌握基本操作
  2. 可迭代对象,遍历操作
  3. os模块,如os.walk()遍历目录树
  4. 对自己电脑的不同文件夹利用今天学到的知识操作下,理解下os路径。

元组

与列表(List)相比,元组(tuple)最突出的特点就是不可修改。比如在深度学习中很多参数与形式在定义完毕需要保证不被修改,这个时候元组就派上了用场。

此外,在昨天的pipeline中,也出现了元组。在定义转换器时,其中一个参数steps是由元组作为元素的列表。在这里可以理解,为什么是列表和元组的嵌套:

  • 列表:存储执行步骤,按照先后顺序执行。后续存在修改流程(增加或删除等)的可能,因此,选择可修改的列表(字典是无序的)
  • 元组:将名称(后续访问)和处理对象绑定,对于每一个步骤来说,操作名和操作是固定的,因而选择了不可修改的元组,优化内存分配

对于元组创建,可以采取两种方法,一种是使用小括号自己定义,另一种是省略括号并用括号隔离元素。如果要创建空元组的话,类似列表的方法,要么直接使用“()”,要么使用“tuple()”

tuple_1 = ('a','best',1,[56,21,15]) #('a','best',1,[56,21,15])
tuple_2 = 5,'df',4 # (5, 'df', 4)
print(type(tuple_2)) # <class 'tuple'>

#空元组创建
empty_tuple1 = () # ()
empty_tuple2 = tuple() # ()

当然,列表的许多操作,在元组中都适用,比如索引、切片、长度获取、遍历等等。

tuple = ('P', 'y', 't', 'h', 'o', 'n')
print(tuple[-1]) #索引,取最后一个,n
print(tuple[::2]) #切片,('P', 't', 'o')
print(len(tuple)) #元组长度:6

可迭代对象

可迭代对象,一次能够返回一个元素,然后能遍历(比如常见的for循环)的对象。

常见的可迭代对象有以下几种:

  • 序列:list,tuple,str,range
  • 键值对:dict(默认迭代健)
  • 集合:set(无序,不重复,形如{1,5,4})
  • 文件对象:每次迭代返回一行内容
  • 生成器

如果需要查看是否为可迭代对象,可以使用isinstance()和collections.abc 模块中的 Iterable 类来检测。

from collections.abc import Iterable
#isinstance(object, classinfo),判断一个对象是否是一个已知的类型
print(isinstance({‘a‘: 1, ‘b‘: 2}, Iterable)) # True (字典,遍历的是键)

下面以字典为例,展示字典遍历的三个方面(遍历键 \ 值 \ 键值对):

#定义字典
my_dict = {'name': 'Alice', 'age': 30, 'city': 'Singapore'}
#遍历键,dict.keys()
print('遍历键')
for key in my_dict.keys(): #或者for key in my_dict,默认遍历键
    print(key,end=' ')
print('')
#遍历值, dict.values()
print('遍历值')
for value in my_dict.values():
    print(value,end=' ')
print('')
#遍历键值对, dict.items()
print('遍历键值对')
for key,value in my_dict.items():
    print(key,':',value)

OS模块

OS模块,用于与操作系统进行交互的核心模块,能够用来处理文件和目录、执行系统命令、管理进程环境等。

以下说明OS模块的常用的五种类别:

文件和目录操作

  • 获取(getcwd)或改变(chdir)当前工作目录(current working directory )
  • 列出指定目录下的所有文件及子目录(listdir(’path‘))
  • 创建目录,mkdir(单个) 或 mkdirs(多级)
  • 删除:remove(),rmdir(),removedirs()
  • 重命名:rename(old,new)
  • 获取详细信息
import os
#文件和目录操作
#当前工作目录
cwd = os.getcwd()
print('当前工作目录:',cwd)
#列出指定目录的所有文件及目录
list_directory = os.listdir(r'C:\Users\DELL\Desktop\test')
print(list_directory)
#创建目录
os.mkdir('C:\\Users\\DELL\\Desktop\\test\\new_folder')
#重命名
os.rename(r'C:\Users\DELL\Desktop\test\\file.txt',r'C:\Users\DELL\Desktop\test\\new_name.txt')
print(os.listdir(r'C:\Users\DELL\Desktop\test'))

路径操作

使用 os.path 子模块来处理路径,这里还需要注意,对于windows系统,路径不能使用单斜杠,以下选择任选:使用单斜杠的路径前加’r‘;使用双斜杠'\\';使用反斜杠’/‘

  • 路径拆解:basename(文件名)\dirname(目录路径)\split(同时拆,返回元组)
  • 路径拼接:join(‘folder‘, ‘subfolder‘, ‘file.txt‘),自动添加斜杠或反斜杠连接
  • 获取绝对路径:abspath
  • 检查路径是否存在及类型:exists,isfile,isdir,islink(是否是符号链接)
  • 获取文件扩展名与主文件名:splitext,如将’abd.pdf‘得到('abc','.pdf')
#路径操作
path = r'C:\Users\DELL\Desktop\test'
#拆解
print(os.path.basename(path)) #获取path中的文件名
print(os.path.dirname(path)) #获取path中的目录路径
print(os.path.split(path)) #同时获得

#拼接
new_path = os.path.join('user','dell','desktop') #避免了不同系统的问题
print(new_path)

环境变量

os.environ查看所有的环境变量,输出形式类似字典,因此在遍历时可以使用类似的items()方法处理,得到变量名以及对应的值:

environment = os.environ
print(environment)

#遍历
for key,value in environment.items():
    print(f'{key} = {value}')
print('总共变量的数量:{}'.format(len(environment)))

目录树

目录树就是展示每层目录下包含的子目录以及文件,比如下面的例子:

test_folder/
├── file1.txt
├── subfolder1/
│   ├── file2.txt
│   └── file3.jpg
└── subfolder2/
    ├── file4.py
    └── nested_folder/
        └── file5.log

而OS中可以使用os.walk()来遍历目录树,生成文件名。对于起始目录,递归访问每个子目录,每次返回三元组(当前目录路径root,[子目录名dirs],[文件名files])。也就是说,使用os.walk()可以’走遍‘一个文件夹及其所有子文件夹,得到每个文件夹中的内容信息,从而便于后续操作。

关于os.walk(top, topdown=True, οnerrοr=None, followlinks=False)的参数说明如下:

  • top:要开始遍历的根目录路径
  • topdown:如果为 True(默认),则自上而下遍历;如果为 False,则自下而上遍历
  • onerror:处理遍历过程中错误的回调函数
  • followlinks:是否跟随符号链接(在 Linux/macOS 中常用)
#目录树遍历
path = r'C:\Users\DELL\Desktop\test'
print('当前遍历的路径是:{}'.format(path))
print('-'*20)
for root,dirnames,filenames in os.walk(top=path):
    print('当前遍历的目录路径是:{}'.format(root)) #获得当前遍历的目录路径
    print('当前路径下的子目录是:{}'.format(dirnames)) #获取该路径下的子目录名称
    print('当前路径下的文件是:{}'.format(filenames)) #获取该路径下的文件名
    if filenames: #若存在文件名,获得每个文件名的完整路径
        for file in filenames:
            file_path = os.path.join(root,file) #路径拼接
            print('{}的完整路径是:{}'.format(file,file_path))
    print('-'*20)

注意,对于子目录的遍历,默认从第一个遍历,并且遍历完其所有分支后(也即是深度优先),才遍历第二个,以此类推。

其实,在day22使用kaggle提交比赛代码时,默认的第一个代码块中就已经出现os.walk()这个函数了。

此外,这个遍历目录树的方法,在使用云服务器查看相关信息或大模型训练时十分有用,不过实际的价值还是需要在后续的实践中才能真正体会到。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值