学习要点
如果我们要通过python来操作文件、目录,可以调用os等模块的接口
调用函数 | 作用 |
---|---|
os.name | 获取操作系统类型 |
os.uname() | 获取操作系统详细信息(只有linux系统有这个方法) |
os.environ | 获取所有环境变量 |
os.environ.get(‘key’) | 获取某环境变量 |
os.path.abspath(’.’) | 查看当前目录的绝对路径 |
os.path.join(‘E:\python代码’,‘testdir’) | 在“E:\python代码”目录下创建“testdir”目录,并将新目录的完整路径表示出来 |
os.chdir(‘E:\python代码’) | 修改当前路径为“E:\python代码” |
os.mkdir(‘haha’) | 在当前目录下创建一个名为“haha”的文件夹 |
os.rmdir(‘haha’) | 在当前目录下删除一个名为“haha”的文件夹 |
os.getcwd() | 获取当前工作目录 |
练习与问题
1、使用os模块,在windows环境下写出linux中ls -l的功能
为详细了解ls -l各个字段的意思,我翻阅学习了https://blog.csdn.net/sjzs5590/article/details/8254527
drwxr-xr-x 12 admin root 4096 Nov 16 09:06 usr
字段 | 含义 | 获取方法 |
---|---|---|
d | 文件类型 | 后续补充 |
rwxr-xr-x | 文件权限 | os.stat(path) |
2 | 链接数(子目录数) | os.stat(path).st_nlink |
admin | 所属用户为admin | os.stat(path).st_uid |
root | 所属用户组为root | os.stat(path).st_gid |
4096 | 文件大小4096字节 | os.stat(path).st_size |
Nov 16 09:06 | 时间为11月16号9点06分 | os.stat(path).st_mtime(时间戳需转换) |
usr | 目录名为usr | x for x in os.listdir() |
我的思路是循环获取文件名称,然后将文件的信息通过os模块下的方法获取,之后每个字段之间添加适当间隔,拼接成一个str,然后循环隔行打印。那么问题来了,这些信息具体用os模块的什么方法获取?查询了相关链接,找到了os.stat()方法和time.locate()方法
附上代码
import os
import time
print('权限\t\t文件数\t用户名\t群组名\t大小\t月份\t日期\t时间\t文件名')
path = r'E:\python代码'
def mod_english(mod): #将权限777转换为'wrxwrxwrx'
s = ''
i = 0
for x in mod:
s = s + bin(int(x,8))[2:]
l = list (s)
for power in l:
if i%3 == 0:
if power == '1':
l[i] = 'r'
else:
l[i] = '-'
if i%3 == 1:
if power == '1':
l[i] = 'w'
else:
l[i] = '-'
if i%3 == 2:
if power == '1':
l[i] = 'x'
else:
l[i] = '-'
i += 1
return ''.join(l) #返回权限对应字符串
for name in os.listdir() #循环打印每个文件的信息
stat = os.stat(name) #获取文件stat对象
mod = oct(stat.st_mode)[-3:] #返回十进制int需要用oct(int)转换为8进制,[-3:]切片最后三位就是权限,例如777
fullpath = os.path.join(path,name) #拼接绝对路径,因为isdir()和isfile()必须要用绝对路径才能正常使用
if os.path.isdir(fullpath):
filetype = 'd'
elif os.path.isfile(fullpath):
filetype = '-'
else:
filetype = '?'
print(
filetype + #文件类型
mod_english(mod) + '\t' + #权限
str(stat.st_nlink) +'\t' + #文件数
str(stat.st_uid) + '\t' + #用户名
str(stat.st_gid)+ '\t' + #群组名
str(stat.st_size) + '\t' + #大小
time.strftime('%b\t%d\t%H:%M',time.localtime(stat.st_mtime))+ '\t' + #月份 日期 时间
name
)
运行结果: