如何访问文件状态,python高级编程技巧

实际案例

在某些项目中,我们需要获得文件状态,例如:

  1. 永利集团304com,文件的类型(普通文件、目录、符号链接和设备文件等);
  2. 文件的访问权限;
  3. 文件的最后访问、修改和节点状态更改时间;
  4. 普通文件的大小;……

解决方案:

  • 系统调用:标准库中os模块下的三个系统调用stat,fstat,lstat获取文件状态;
  • 快捷函数:标准库中os.path下一些函数,使用起来更加简洁。

系统调用

# -*- coding: utf-8 -*-import osimport statimport times = os.stat('test.txt')# 文件类型print stat.S_ISREG(s.st_mode)# 文件的执行权限print s.st_mode & stat.S_IXUSR# 文件的读权限print s.st_mode & stat.S_IRUSR# 文件的最后访问时间print time.localtime(s.st_atime)# 文件的最后修改时间print time.localtime(s.st_mtime)# 文件的节点状态更改时间print time.localtime(s.st_ctime)# 文件的大小print s.st_size

其运行结果为:

True0256time.struct_time(tm_year=2017, tm_mon=7, tm_mday=21, tm_hour=20, tm_min=23, tm_sec=52, tm_wday=4, tm_yday=202, tm_isdst=0)time.struct_time(tm_year=2017, tm_mon=7, tm_mday=21, tm_hour=20, tm_min=23, tm_sec=52, tm_wday=4, tm_yday=202, tm_isdst=0)time.struct_time(tm_year=2017, tm_mon=7, tm_mday=21, tm_hour=20, tm_min=23, tm_sec=52, tm_wday=4, tm_yday=202, tm_isdst=0)1769

快捷函数

# 文件的大小print s.st_size# 文件类型print os.path.isfile('test.txt')# 文件的最后访问时间print time.localtime(os.path.getatime('test.txt'))# 文件的最后修改时间print time.localtime(os.path.getctime('test.txt'))# 文件的节点状态更改时间print time.localtime(os.path.getmtime('test.txt'))# 文件的大小print os.path.getsize('test.txt')

注:os.path下没有获取文件权限的函数,因此只能使用系统调用方法来获取文件权限。

其运行结果为:

Truetime.struct_time(tm_year=2017, tm_mon=7, tm_mday=21, tm_hour=20, tm_min=23, tm_sec=52, tm_wday=4, tm_yday=202, tm_isdst=0)time.struct_time(tm_year=2017, tm_mon=7, tm_mday=21, tm_hour=20, tm_min=23, tm_sec=52, tm_wday=4, tm_yday=202, tm_isdst=0)time.struct_time(tm_year=2017, tm_mon=7, tm_mday=21, tm_hour=20, tm_min=23, tm_sec=52, tm_wday=4, tm_yday=202, tm_isdst=0)1769

一. 如何将文件映射到内存?

实际案例:

  1. 在访问某些二进制文件时。希望能把文件映射到内存中,可以实现随机访问。(framebuffer设备文件)
  2. 某些嵌入式设备,寄存器被编址到内存地址空间,我们可以映射/dev/mem某范围,去访问这些寄存器。
  3. 如果多个进程映射同一个文件,还能实现进程通信的目的。
解决方案:
  1. 使用标准库中mmap模块中的mmap()函数,它需要一个打开的文件描述符作为参数。
代码示例:
# _*_ coding:utf-8 _*_
# @Author   : TianYu
# @Time     : 2017/10/16 14:01
# @File     : 如何将文件映射到内存.py

#使用标准库中的mmap模块的mmap()函数,它需要一个打开的文件描述符作为参数

#首先:Linux下利用 dd 命令创建一个大小为 1M ,每个字节都是 0 的二进制文件demo.bin
# dd if=/dev/zero of=demo.bin bs=1024 count=1024
#接下来:使用 dd -x demo.bin 命令以十六进制的形式查看文件

#之后进行映射:
import mmap
# mmap.mmap在不同的系统下使用有一些差别
#Windows:mmap(fileno, length[,tagname[,access[,offset]]])
#Unix: mmap(fileno,length[,flags[,prot[,access[,offset]]])
#fileno:文件描述符(不是文件对象),由系统调用的open函数得到的(os模块下的os.open)
#length:映射区域的长度,为 0 的时候映射整个文件
#access:访问权限
#offset:指定文件映射的某一区域

f = open('demo.bin', 'r+b') #权限是 读写 二进制
f.fileno()#报告一个文件描述符
m = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_WRITE)
print(type(m)) #是mmap.mmap对象,可以有类似数组一样的操作:引索、切片
m[0] = 'x88' #写操作,修改 0 引索下的内容,利用 od -x 命令(Linux下)可以查看文件的变化
m[4:8] = 'xff' * 4 #修改的字符串的长度一定要和切片的长度一致

#注意:mmap函数它必须是“以内存页的大小进行对齐的”offset不能指定跳过文件的 3或5个字节
m = mmap.mmap(f.fileno(), mmap.PAGESIZE * 8, access=mmap.ACCESS_WRITE, offset=mmap.PAGESIZE * 4)
m[:0x1000] = 'xaa' * 0x1000 #之后 od -x 进行查看文件

二. 如何访问文件的状态?

实际案例:
在某些项目中,我们需要获得文件状态,例如:

  1. 文件的类型(普通文件,目录,符号链接,设备文件…)
  2. 文件的访问权限
  3. 文件的最后的访问/修改/节点状态更改时间
  4. 普通文件的大小
    ……
解决方案:

1.系统调用:标准库中os模块下的三个系统调用stat, fstat,
lstat
获取文件状态

  1. 快捷函数:标准库中os.path下一些函数,使用起来更加简洁。

发表评论

电子邮件地址不会被公开。 必填项已用*标注