前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python os模块文件操作(二)

Python os模块文件操作(二)

作者头像
Python碎片公众号
发布2021-02-26 15:17:49
8320
发布2021-02-26 15:17:49
举报
文章被收录于专栏:Python碎片公众号的专栏

os模块对文件夹和文件的操作很多。可以先看:

Python os模块文件操作(一)

一、os文件夹删除操作

代码语言:javascript
复制
# coding=utf-8
import os
 
 
try:
    os.mkdir("folder")
except:
    pass
fd = os.open('folder/ccc.txt', os.O_CREAT)
print(os.listdir('folder'))
os.close(fd)
try:
    # 删除指定的空目录,如果目录非空,则抛出一个OSError异常
    os.rmdir("folder")
except OSError as e:
    print(e)
os.remove('folder/ccc.txt')
print(os.listdir('folder'))
try:
    os.rmdir("folder")
    print("删除文件夹成功")
except OSError as e:
    print(e)

运行结果:

代码语言:javascript
复制
['ccc.txt']
[Errno 39] Directory not empty: 'folder'
[]
删除文件夹成功

上面的代码中,先创建了一个folder文件夹,然后在folder目录下创建了一个ccc.txt文件,使用os.listdir()方法,看到文件夹中有一个ccc.txt文件,说明我们创建文件夹和文件都成功了。

os.rmdir(name)是删除指定的文件夹,如果删除的文件夹不是一个空的文件夹,会报错,抛出OSError异常,如上面的folder中有ccc.txt文件时,删除时报错了。先将ccc.txt文件删除,再使用rmdir()来删除folder文件夹,删除成功。

二、os递归创建、重命名、删除文件夹

代码语言:javascript
复制
try:
    # 递归创建文件夹
    os.makedirs("folder_a/folder_aa/folder_aaa")
except:
    pass

os.makedirs(path)会根据传入的路径递归地创建文件夹。如:上面的代码执行后,会在当前目录下递归地创建folder_a/folder_aa/folder_aaa文件夹,文件夹是分三层的。

在传入path时,最后也可以是一个文件,这样会先递归创建目录,然后在最里层创建文件。

代码语言:javascript
复制
try:
    # 递归地对目录进行更名,也可以对文件进行更名
    os.renames("folder_a/folder_aa/folder_aaa", "folder_b/folder_bb/folder_bbb")
except:
    pass

os.renames(old, new)会根据传入的old和new参数,递归地对文件夹进行重命名,将old的文件夹名重命名成new的文件夹名。

如果old的文件夹除了最里面的文件夹外,其他都是空的,则重命名后old改成了new。old和new的层数可以不同,如old是3层的目录,new可以不等于3层,最终,old最里层的文件保留在new最里层的文件夹里。

如果在old除了最里层目录内有文件,其他层里也有文件,renames()按照new创建新的嵌套文件夹,将old最里层的文件复制过来,old里有文件的文件夹及父级文件夹保留不变。具体可以自己演示一下,就知道效果了。

代码语言:javascript
复制
try:
    # 递归删除目录
    os.removedirs("folder_b/folder_bb/folder_bbb")
except:
    pass

os.removedirs(path)会递归地将文件夹删除。path的最里层可以指定到文件(如果有文件的话)。

当递归删除的文件夹中有文件时,如果path没有指定到文件,只指定到文件夹,删除会失败,文件夹里面为空才能删除成功。

如果除了最里层目录有文件,其他层目录里也有文件,文件及文件的父级目录都会保留。

三、os获取当前文件夹的信息

代码语言:javascript
复制
# os.walk(top[, topdown=True[, οnerrοr=None[, followlinks=False]]])
folders = os.walk('.')
for i in folders:
    print(i)

运行结果:

代码语言:javascript
复制
('.', ['os_folder'], ['os_demo_two.py', 'os_demo.py'])
('./os_folder', [], ['aaa.txt'])

os.walk(path)返回指定目录下的文件信息,返回的是一个可迭代对象。os.walk()会遍历指定目录下的所有文件夹,依次返回每个文件夹中的文件信息。

上面的代码中,传入的参数是当前路径,遍历返回的可迭代对象,得到的文件信息是一个一个的元组。

每个元组的第一个元素是文件夹的相对路径,根据我们传的参数来确定。第二个元素是此文件夹下有哪些子文件夹,这些子文件夹的名字组成一个列表,如果没有子文件夹,则列表为空。第三个元素是此文件夹下有哪些文件,这些文件的文件名组成一个列表,如果没有文件,则列表为空。

os.walk(top[, topdown=True[, οnerrοr=None[, followlinks=False]]])的参数:

top为指定的目录或路径,是一个文件夹。

topdown可选,为True或者没有指定, 则返回结果是从最上层目录开始遍历的,如果指定为False,则从最底层目录开始遍历。

onerror可选,是一个函数,它调用时有一个参数, 一个OSError实例。报这个错误后,继续执行walk,或者抛出exception终止walk。

followlinks可选,设置为true,则通过软链接访问目录。

代码语言:javascript
复制
# 获取path指定的路径的信息
print(os.stat(os.getcwd()))
# 像stat(),但是没有软链接
print(os.lstat(os.getcwd()))

运行结果:

代码语言:javascript
复制
os.stat_result(st_mode=16893, st_ino=656043, st_dev=2049, st_nlink=3, st_uid=1000, st_gid=1000, st_size=4096, st_atime=1565531003, st_mtime=1565531428, st_ctime=1565531428)
os.stat_result(st_mode=16893, st_ino=656043, st_dev=2049, st_nlink=3, st_uid=1000, st_gid=1000, st_size=4096, st_atime=1565531003, st_mtime=1565531428, st_ctime=1565531428)

os.stat(path)返回指定路径的信息,详见上面的运行结果。其中比较常用的有st_size和st_mtime。

每一项的含义如下:

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"。

四、os修改文件的权限

代码语言:javascript
复制
# 检验文件的权限
print(os.access('os_folder/aaa.txt', os.F_OK))
print(os.access('os_folder/aaa.txt', os.R_OK))
print(os.access('os_folder/aaa.txt', os.W_OK))
print(os.access('os_folder/aaa.txt', os.X_OK))
 
 
import stat
 
 
# 修改文件的权限
os.chmod('os_folder/aaa.txt', stat.S_IRUSR)
print(os.access('os_folder/aaa.txt', os.X_OK))
print(os.access('os_folder/aaa.txt', os.W_OK))
os.chmod('os_folder/aaa.txt', stat.S_IRWXU)

运行结果:

代码语言:javascript
复制
True
True
True
True
False
False

os.access(file, mode)用于判断文件是否存在,是否可读,是否可写,是否可执行。

os.chmod(file, mode)用于修改文件的权限。

上面的代码中,通过os.access()依次判断了aaa.txt文件是否存在,是否可读,可写,可执行,一开始都是Ture,然后通过os.chmod()修改为只读,aaa.txt的可写和可执行变成False。

os.access()的mode常用参数:

os.F_OK: 作为access()的mode参数,判断path是否存在

os.R_OK: 包含在access()的mode参数中 , 判断path是否可读

os.W_OK: 包含在access()的mode参数中 , 判断path是否可写

os.X_OK: 包含在access()的mode参数中 ,判断path是否可执行

os.chmod()的mode常用参数:

stat.S_IXOTH: 其他用户有执行权限

stat.S_IWOTH: 其他用户有写权限

stat.S_IROTH: 其他用户有读权限

stat.S_IRWXO: 其他用户有全部权限

stat.S_IXGRP: 组用户有执行权限

stat.S_IWGRP: 组用户有写权限

stat.S_IRGRP: 组用户有读权限

stat.S_IRWXG: 组用户有全部权限

stat.S_IXUSR: 拥有者具有执行权限

stat.S_IWUSR: 拥有者具有写权限

stat.S_IRUSR: 拥有者具有读权限

stat.S_IRWXU: 拥有者有全部权限

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-09-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python 碎片 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档