内置函数文件操作
python内置函数提供了简单的文件操作支持。
open()
open()函数打开一个文件,创建一个file对象,相关的方法才可以调用它进行读写。
语法为:
open(
file,
mode='r',
buffering=-1,
encoding=None,
errors=None,
newline=None,
closefd=True,
opener=None,
)
参数说明:
- file:file 是一个类路径对象(path-like object),表示将要打开的文件的路径
- mode:默认为 'r',用于指定打开文件的模式,可见下文介绍。
- buffering:设置缓冲策略
- encoding:是用于解码或编码文件的编码的名称,这只能在文本模式下使用,默认编码依赖于平台,但 Python 支持的任何编码都可以传递。
- errors:指定如何处理编码和解码错误,不能在二进制模式下使用。
- newline:控制如何换行
- closefd:如果 closefd 为 False 且给出的不是文件名而是文件描述符,那么当文件关闭时,底层文件描述符将保持打开状态。如果给出的是文件名,则 closefd 必须为 True (默认值),否则将触发错误。
- opener: 可以通过传递可调用的 opener 来使用自定义开启器。然后通过使用参数( file,flags )调用 opener 获得文件对象的基础文件描述符。 opener 必须返回一个打开的文件描述符(使用 os.open as opener 时与传递 None 的效果相同)。
file 是一个类路径对象(path-like object),表示将要打开的文件的路径(绝对路径或者相对当前工作目录的路径),也可以是要封装文件对应的整数类型文件描述符。(如果给出的是文件描述符,则当返回的 I/O 对象关闭时它也会关闭,除非将 closefd 设为 False 。)
路径类对象(path-like object)代表一个文件系统路径的对象。类路径对象可以是一个表示路径的 str 或者 bytes 对象,还可以是一个实现了 os.PathLike 协议的对象。一个支持 os.PathLike 协议的对象可通过调用 os.fspath() 函数转换为 str 或者 bytes 类型的文件系统路径;os.fsdecode() 和 os.fsencode() 可被分别用来确保获得 str 或 bytes 类型的结果。
可用的模式有:
- 'r':读文件 (默认)
- 'w':打开以进行写入,首先截断文件
- 'x':创建一个新文件并打开它进行写入,如果存在则失败
- 'a':打开进行写入,如果文件存在,则追加到文件末尾
- 'b':二进制模式
- 't':文本模式 (默认)
- '+':打开文件进行更新(读写)
- 'U':通用换行模式(已弃用)
不同模式打开文件的完全列表:
模式 | 描述 |
---|---|
t | 文本模式 (默认)。 |
x | 写模式,新建一个文件,如果该文件已存在则会报错。 |
b | 二进制模式。 |
+ | 打开一个文件进行更新(可读可写)。 |
U | 通用换行模式(不推荐)。 |
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。 |
w | 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
w+ | 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
Python 区分二进制和文本I/O。以二进制模式打开的文件(包括 mode 参数中的 'b' )返回的内容为 bytes 对象,不进行任何解码。在文本模式下(默认情况下,或者在 mode 参数中包含 't' )时,文件内容返回为 str ,首先使用指定的 encoding (如果给定)或者使用平台默认的的字节编码解码。
buffering 是用于设置缓冲策略的可选整数。规则有:
缓冲是用于设置缓冲策略的可选整数。规则有:
- 传递 0 以关闭缓冲(仅在二进制模式下允许)
- 传递 1 以选择行缓冲(仅在文本模式下可用)
- 传递大于1的整数以指示固定大小块缓冲区的字节大小
- 如果取负值,寄存区的缓冲大小则为系统默认
如果未给出缓冲参数(使用默认的或者负值),默认缓冲策略的工作方式如下:
- 二进制文件缓冲在固定大小的块中; 缓冲区的大小使用启发式选择,试图确定底层设备的默认缓冲区块大小(block size)和 回溯到
io.DEFAULT_BUFFER_SIZE
和回溯到io。默认缓冲区大小。在许多系统上,缓冲区的长度通常为4096或8192字节。 - “交互式”文本文件( satty() 返回 True的文件)使用行缓冲。其他文本文件使用上述策略用于二进制文件。
errors 是一个可选的字符串参数,用于指定如何处理编码和解码错误 - 这不能在二进制模式下使用。可以使用各种标准错误处理程序(列在 错误处理方案 ),但是使用 codecs.register_error() 注册的任何错误处理名称也是有效的。标准名称包括:
- 如果存在编码错误,'strict' 会引发 ValueError 异常。 默认值 None 具有相同的效果。
- 'ignore' 忽略错误。请注意,忽略编码错误可能会导致数据丢失。
- 'replace' 会将替换标记(例如 '?' )插入有错误数据的地方。
- 'surrogateescape' 将把任何不正确的字节表示为
U+DC80
至U+DCFF
范围内的下方替代码位。 当在写入数据时使用 - surrogateescape 错误处理句柄时这些替代码位会被转回到相同的字节。 这适用于处理具有未知编码格式的文件。
- 只有在写入文件时才支持 'xmlcharrefreplace'。编码不支持的字符将替换为相应的XML字符引用
&#nnn;
。 - 'backslashreplace' 用Python的反向转义序列替换格式错误的数据。
- 'namereplace' (也只在编写时支持)用
\N{...}
转义序列替换不支持的字符。
newline 控制 universal newlines 模式如何生效(它仅适用于文本模式)。它可以是 None,'','\n','\r' 和 '\r\n'
。它的工作原理:
- 从流中读取输入时,如果 newline 为 None,则启用通用换行模式。输入中的行可以以 '\n','\r' 或 '\r\n' 结尾,这些行被翻译成 '\n' 在返回呼叫者之前。如果它是 '',则启用通用换行模式,但行结尾将返回给调用者未翻译。如果它具有任何其他合法值,则输入行仅由给定字符串终止,并且行结尾将返回给未调用的调用者。
- 将输出写入流时,如果 newline 为 None,则写入的任何 '\n' 字符都将转换为系统默认行分隔符 os.linesep。如果 newline 是 '' 或 '\n',则不进行翻译。如果 newline 是任何其他合法值,则写入的任何 '\n' 字符将被转换为给定的字符串。
fileobject
一个文件被打开后,你有一个file对象,你可以得到有关该文件的各种信息。
以下是和file对象相关的所有属性的列表:
属性 | 描述 |
---|---|
file.closed | 返回true如果文件已被关闭,否则返回false。 |
file.mode | 返回被打开文件的访问模式。 |
file.name | 返回文件的名称。 |
file.softspace | 如果用print输出后,必须跟一个空格符,则返回false。否则返回true。 |
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 打开一个文件
fo = open("foo.txt", "w")
print "文件名: ", fo.name
print "是否已关闭 : ", fo.closed
print "访问模式 : ", fo.mode
print "末尾是否强制加空格 : ", fo.softspace
‘’’
文件名: foo.txt
是否已关闭 : False
访问模式 : w
末尾是否强制加空格 : 0
’’’
常见的 file 对象方法:
f.read([size])
:size 未指定则返回整个文件,如果文件大小 >2 倍内存则有问题,f.read()读到文件尾时返回""(空字串)。f.readline()
:返回一行。f.readlines([size])
:返回包含size行的列表, size 未指定则返回全部行。for line in f: print line
:通过迭代器访问。f.write("hello\n")
:如果要写入字符串以外的数据,先将他转换为字符串。f.tell()
:返回一个整数,表示当前文件指针的位置(就是到文件头的字节数)。f.seek(偏移量,[起始位置])
:用来移动文件指针。- 偏移量: 单位为字节,可正可负
- 起始位置: 0 - 文件头, 默认值; 1 - 当前位置; 2 - 文件尾
f.close()
关闭文件
file 对象常用的函数:
函数 | 方法及描述 |
---|---|
file.close() | 关闭文件。关闭后文件不能再进行读写操作。 |
file.flush() | 刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。 |
file.fileno() | 返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上。 |
file.isatty() | 如果文件连接到一个终端设备返回 True,否则返回 False。 |
file.next() | 返回文件下一行。 |
file.read([size]) | 从文件读取指定的字节数,如果未给定或为负则读取所有。 |
file.readline([size]) | 读取整行,包括 "\n" 字符。 |
file.readlines(sizeint]) | 读取所有行并返回列表,若给定sizeint>0,则是设置一次读多少字节,这是为了减轻读取压力。 |
file.seek(offset[,whence]) | 设置文件当前位置 |
file.tell() | 返回文件当前位置。 |
file.truncate([size]) | 截取文件,截取的字节通过size指定,默认为当前文件位置。 |
file.write(str) | 将字符串写入文件,返回的是写入的字符长度。 |
file.writelines(sequence) | 向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。 |
fileobject.close()
File 对象的 close()方法刷新缓冲区里任何还没写入的信息,并关闭该文件,这之后便不能再进行写入。
当一个文件对象的引用被重新指定给另一个文件时,Python 会关闭之前的文件。用 close()方法关闭文件是一个很好的习惯。
语法:
fileObject.close()
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 打开一个文件
fo = open("foo.txt", "w")
print "文件名: ", fo.name
# 关闭打开的文件
fo.close()
‘''
文件名: foo.txt
‘''
fileobject.write()
write()方法可将任何字符串写入一个打开的文件。需要重点注意的是,Python字符串可以是二进制数据,而不是仅仅是文字。
write()方法不会在字符串的结尾添加换行符('\n'):
fileObject.write(string)
在这里,被传递的参数是要写入到已打开文件的内容。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 打开一个文件
fo = open("foo.txt", "w")
fo.write( “I love Python!\nVery good!\n")
# 关闭打开的文件
fo.close()
‘’'
$ cat foo.txt
I love Python!
Very good!
‘''
writelines()
方法用于向文件中写入一序列的字符串。
换行需要制定换行符 \n。
# 打开文件
fo = open("test.txt", "w")
print "文件名为: ", fo.name
seq = ["Python实用教程 1\n", "Python实用教程 2"]
fo.writelines( seq )
# 关闭文件
fo.close()
fileobject.read()
read()方法从一个打开的文件中读取一个字符串。需要重点注意的是,Python字符串可以是二进制数据,而不是仅仅是文字。
语法:
fileObject.read([count])
在这里,被传递的参数是要从已打开文件中读取的字节计数。该方法从文件的开头开始读入,如果没有传入count,它会尝试尽可能多地读取更多的内容,很可能是直到文件的末尾。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 打开一个文件
fo = open("foo.txt", "r+")
str = fo.read(10)
print "读取的字符串是 : ", str
# 关闭打开的文件
fo.close()
‘’'
读取的字符串是 : I love Pyt
‘''
fileobject.readline()和readlines()
readline() 函数用于读取文件中的一行,包含最后的换行符“\n”。此函数的基本语法格式为:
file.readline([size])
其中,file 为打开的文件对象;size 为可选参数,用于指定读取每一行时,一次最多读取的字符(字节)数。
‘’‘
假设文件的内容是
Python实用教程
https://blog.csdn.net/spiritx/article/details/132154074
’’’
f = open("my_file.txt")
读取一行数据
byt = f.readline()
print(byt)
‘’’
Python实用教程
’’’
由于 readline() 函数在读取文件中一行的内容时,会读取最后的换行符“\n”,再加上 print() 函数输出内容时默认会换行,所以输出结果中会看到多出了一个空行。
不仅如此,在逐行读取时,还可以限制最多可以读取的字符(字节)数,例如:
#以二进制形式打开指定文件
f = open("my_file.txt",'rb')
byt = f.readline(6)
print(byt)
‘’’
b’Python'
’‘’
和上一个例子的输出结果相比,由于这里没有完整读取一行的数据,因此不会读取到换行符。
readlines() 函数用于读取文件中的所有行,它和调用不指定 size 参数的 read() 函数类似,只不过该函数返回是一个字符串列表,其中每个元素为文件中的一行内容。
f = open("my_file.txt",'r')
byt = f.readlines()
print(byt)
‘’‘
Python实用教程
https://blog.csdn.net/spiritx/article/details/132154074
’’’
fileobject.next()
文件使用迭代器时会使用到,在循环中,next()方法会在每次循环中调用,该方法返回文件的下一行,如果到达结尾(EOF),则触发 StopIteration
# 打开文件
fo = open(“foo.txt", "r+")
print "文件名为: ", fo.name
for index in range(5):
line = fo.next()
print "第 %d 行 - %s" % (index, line)
# 关闭文件
fo.close()
fileobject.tell()和seek()
tell()方法告诉你文件内的当前位置, 换句话说,下一次的读写会发生在文件开头这么多字节之后。
seek(offset [,from])方法改变当前文件的位置。Offset变量表示要移动的字节数。From变量指定开始移动字节的参考位置。
如果from被设为0,这意味着将文件的开头作为移动字节的参考位置。如果设为1,则使用当前的位置作为参考位置。如果它被设为2,那么该文件的末尾将作为参考位置。
例子:
就用我们上面创建的文件foo.txt。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 打开一个文件
fo = open("foo.txt", "r+")
str = fo.read(10)
print "读取的字符串是 : ", str
# 查找当前位置
position = fo.tell()
print "当前文件位置 : ", position
# 把指针再次重新定位到文件开头
position = fo.seek(0, 0)
str = fo.read(10)
print "重新读取字符串 : ", str
# 关闭打开的文件
fo.close()
’’’
读取的字符串是 : I love Pyt
当前文件位置 : 10
重新读取字符串 : I love Pyt
‘''
使用with语句打开文件
Python引入了with语句来自动帮我们调用close()方法。
with open() as写文件:
with open('test.txt','w') as f:
f.write('Hello, python!')
with open() as 读文件:
with open('example.txt', 'r') as file:
content = file.read()
print(content)
使用with语句可以打开文件,并在文件使用完毕后自动关闭文件。这种方式可以避免因为程序异常退出而导致文件没有关闭的问题,从而保证文件的安全性和可靠性。
os库中的文件目录方法
os 模块提供了非常丰富的方法用来处理文件和目录。
常见方法列表
方法 | 方法及描述 |
---|---|
os.access(path,mode) | 检验权限模式 |
os.chdir(path) | 改变当前工作目录 |
os.chflags(path,flags) | 设置路径的标记为数字标记。 |
os.chmod(path,mode) | 更改权限 |
os.chown(path,uid,gid) | 更改文件所有者 |
os.chroot(path) | 改变当前进程的根目录 |
os.close(fd) | 关闭文件描述符 fd |
os.closerange(fd_low,fd_high) | 关闭所有文件描述符,从 fd_low (包含) 到 fd_high (不包含), 错误会忽略 |
os.dup(fd) | 复制文件描述符 fd |
os.dup2(fd,fd2) | 将一个文件描述符 fd 复制到另一个 fd2 |
os.fchdir(fd) | 通过文件描述符改变当前工作目录 |
os.fchmod(fd,mode) | 改变一个文件的访问权限,该文件由参数fd指定,参数mode是Unix下的文件访问权限。 |
os.fchown(fd,uid,gid) | 修改一个文件的所有权,这个函数修改一个文件的用户ID和用户组ID,该文件由文件描述符fd指定。 |
os.fdatasync(fd) | 强制将文件写入磁盘,该文件由文件描述符fd指定,但是不强制更新文件的状态信息。 |
os.fdopen(fd[,mode[,bufsize]]) | 通过文件描述符 fd 创建一个文件对象,并返回这个文件对象 |
os.fpathconf(fd,name) | 返回一个打开的文件的系统配置信息。name为检索的系统配置的值,它也许是一个定义系统值的字符串,这些名字在很多标准中指定(POSIX.1, Unix 95, Unix 98, 和其它)。 |
os.fstat(fd) | 返回文件描述符fd的状态,像stat()。 |
os.fstatvfs(fd) | 返回包含文件描述符fd的文件的文件系统的信息,像 statvfs() |
os.fsync(fd) | 强制将文件描述符为fd的文件写入硬盘。 |
os.ftruncate(fd,length) | 裁剪文件描述符fd对应的文件, 所以它最大不能超过文件大小。 |
os.getcwd() | 返回当前工作目录 |
os.getcwdu() | 返回一个当前工作目录的Unicode对象 |
os.getenv() | 读取环境变量 |
os.getlogin() | 返回进程的控制终端上登录的用户的名称。 |
os.putenv() | 设置环境变量 |
os.isatty(fd) | 如果文件描述符fd是打开的,同时与tty(-like)设备相连,则返回true, 否则False。 |
os.lchflags(path,flags) | 设置路径的标记为数字标记,类似 chflags(),但是没有软链接 |
os.lchmod(path,mode) | 修改连接文件权限 |
os.lchown(path,uid,gid) | 更改文件所有者,类似 chown,但是不追踪链接。 |
os.link(src,dst) | 创建硬链接,名为参数 dst,指向参数 src |
os.listdir(path) | 返回path指定的文件夹包含的文件或文件夹的名字的列表。 |
os.lseek(fd,pos,how) | 设置文件描述符 fd当前位置为pos, how方式修改: SEEK_SET 或者 0 设置从文件开始的计算的pos; SEEK_CUR或者 1 则从当前位置计算; os.SEEK_END或者2则从文件尾部开始. 在unix,Windows中有效 |
os.lstat(path) | 像stat(),但是没有软链接 |
os.major(device) | 从原始的设备号中提取设备major号码 (使用stat中的st_dev或者st_rdev field)。 |
os.makedev(major,minor) | 以major和minor设备号组成一个原始设备号 |
os.mkedirs(path[,mode]) | 递归文件夹创建函数。像mkdir(), 但创建的所有intermediate-level文件夹需要包含子文件夹。 |
os.minor(device) | 从原始的设备号中提取设备minor号码 (使用stat中的st_dev或者st_rdev field )。 |
os.mkdir(path[,mode]) | 以数字mode的mode创建一个名为path的文件夹.默认的 mode 是 0777 (八进制)。 |
os.mkfifo(path[,mode]) | 创建命名管道,mode 为数字,默认为 0666 (八进制) |
os.mknod(filename[,mode=0600,device]) | 创建一个名为filename文件系统节点(文件,设备特别文件或者命名pipe)。 |
os.open(file,flags[,mode]) | 打开一个文件,并且设置需要的打开选项,mode参数是可选的 |
os.openpty() | 打开一个新的伪终端对。返回 pty 和 tty的文件描述符。 |
os.pathconf(path,name) | 返回相关文件的系统配置信息。 |
os.pipe() | 创建一个管道. 返回一对文件描述符(r, w) 分别为读和写 |
os.popen(command[,mode[,bufsize]]) | 从一个 command 打开一个管道 |
os.read(fd,n) | 从文件描述符 fd 中读取最多 n 个字节,返回包含读取字节的字符串,文件描述符 fd对应文件已达到结尾, 返回一个空字符串。 |
os.readlink(path) | 返回软链接所指向的文件 |
os.remove(path) | 删除路径为path的文件。如果path 是一个文件夹,将抛出OSError; 查看下面的rmdir()删除一个 directory。 |
os.removedirs(path) | 递归删除目录。 |
os.rename(src,dst) | 重命名文件或目录,从 src 到 dst |
os.renames(old,new) | 递归地对目录进行更名,也可以对文件进行更名。 |
os.rmdir(path) | 删除path指定的空目录,如果目录非空,则抛出一个OSError异常。 |
os.stat(path) | 获取path指定的路径的信息,功能等同于C API中的stat()系统调用。 |
os.stat_float_times([newvalue]) | 决定stat_result是否以float对象显示时间戳 |
os.statvfs(path) | 获取指定路径的文件系统统计信息 |
os.symlink(src,dst) | 创建一个软链接 |
os.system() | 运行shell命令 |
os.exit() | 终止当前进程 |
os.tcgetgrp(fd) | 返回与终端fd(一个由os.open()返回的打开的文件描述符)关联的进程组 |
os.tcsetpgrp(fd,pg) | 设置与终端fd(一个由os.open()返回的打开的文件描述符)关联的进程组为pg。 |
os.tempnam([dir[,prefix]]) | 返回唯一的路径名用于创建临时文件。 |
os.tmpfile() | 返回一个打开的模式为(w+b)的文件对象 .这文件对象没有文件夹入口,没有文件描述符,将会自动删除。 |
os.tmpnam() | 为创建一个临时文件返回一个唯一的路径 |
os.ttyname(fd) | 返回一个字符串,它表示与文件描述符fd 关联的终端设备。如果fd 没有与终端设备关联,则引发一个异常。 |
os.unlink(path) | 删除文件 |
os.utime(path,times) | 返回指定的path文件的访问和修改的时间。 |
os.walk(top[, topdown=True[, οnerrοr=None[, followlinks=False]]]) | 输出在文件夹中的文件名通过在树中游走,向上或者向下。 |
os.write(fd,str) | 写入字符串到文件描述符 fd中. 返回实际写入的字符串长度 |
os.path | 获取文件的属性信息。 |
os.sep
:取代操作系统特定的路径分隔符os.name
:指示你正在使用的工作平台。比如对于Windows,它是'nt',而对于Linux/Unix用户,它是'posix'。os.linesep
:给出当前平台的行终止符。例如,Windows使用'\r\n',Linux使用'\n'而Mac使用'\r'os.curdir
:返回当前目录('.')
os.path
方法 | 说明 |
---|---|
os.path.abspath(path) | 返回绝对路径 |
os.path.basename(path) | 返回文件名 |
os.path.commonprefix(list) | 返回list(多个路径)中,所有path共有的最长的路径 |
os.path.dirname(path) | 返回文件路径 |
os.path.exists(path) | 如果路径 path 存在,返回 True;如果路径 path 不存在或损坏,返回 False。 |
os.path.lexists(path) | 路径存在则返回 True,路径损坏也返回 True |
os.path.expanduser(path) | 把 path 中包含的 ~ 和 ~user 转换成用户目录 |
os.path.expandvars(path) | 根据环境变量的值替换 path 中包含的 $name 和 ${name} |
os.path.getatime(path) | 返回最近访问时间(浮点型秒数) |
os.path.getmtime(path) | 返回最近文件修改时间 |
os.path.getctime(path) | 返回文件 path 创建时间 |
os.path.getsize(path) | 返回文件大小,如果文件不存在就返回错误 |
os.path.isabs(path) | 判断是否为绝对路径 |
os.path.isfile(path) | 判断路径是否为文件 |
os.path.isdir(path) | 判断路径是否为目录 |
os.path.islink(path) | 判断路径是否为链接 |
os.path.ismount(path) | 判断路径是否为挂载点 |
os.path.join(path1[, path2[, ...]]) | 把目录和文件名合成一个路径 |
os.path.normcase(path) | 转换path的大小写和斜杠 |
os.path.normpath(path) | 规范path字符串形式 |
os.path.realpath(path) | 返回path的真实路径 |
os.path.relpath(path[, start]) | 从start开始计算相对路径 |
os.path.samefile(path1, path2) | 判断目录或文件是否相同 |
os.path.sameopenfile(fp1, fp2) | 判断fp1和fp2是否指向同一文件 |
os.path.samestat(stat1, stat2) | 判断stat tuple stat1和stat2是否指向同一个文件 |
os.path.split(path) | 把路径分割成 dirname 和 basename,返回一个元组 |
os.path.splitdrive(path) | 一般用在 windows 下,返回驱动器名和路径组成的元组 |
os.path.splitext(path) | 分割路径,返回路径名和文件扩展名的元组 |
os.path.splitunc(path) | 把路径分割为加载点与文件 |
os.path.walk(path, visit, arg) | 遍历path,进入每个目录都调用visit函数,visit函数必须有3个参数(arg, dirname, names),dirname表示当前目录的目录名,names代表当前目录下的所有文件名,args则为walk的第三个参数 |
os.path.supports_unicode_filenames | 设置是否支持unicode路径名 |
os.path.abspath(path) # 返回绝对路径
os.path.abspath(__file__) # 得到当前文件的绝对路径
os.path.dirname(path) # 返回文件路径
os.path.dirname(__file__) # 得到当前文件所在目录
os.path.join(path1,path2) # 把目录和文件名合成一个路径
os.path.join('/test/','tttttttt.txt')
os.path.exists('eeeee.txt') # 判断当前路径是否存在
# 判断是否是目录
print(os.path.isdir("test”))
# 判断是否是文件
print(os.path.isfile("a.txt”))
# 返回文件访问时间戳
print(os.path.getatime("a.txt”))
# 拼接路径
print(os.path.join("/tmp","a.txt")) # 返回结果就是/tmp/a.txt
# 分隔路径
print(os.path.split("/tmp/a.txt”)) # 返回结果是一个元组两个元素,('/tmp', 'a.txt’)
# 分隔后缀
print(os.path.splitext("a.txt”)) # 返回结果是一个元组两个元素,('a', '.txt')
import os
# 获取文件路径
file_path = "/Users/username/Documents/test.txt"
dir_path = os.path.dirname(file_path)
print("文件路径为:", file_path)
print("文件所在目录为:", dir_path)
‘’’
文件路径为: /Users/username/Documents/test.txt
文件所在目录为: /Users/username/Documents
’’’
file_path = "/Users/username/Documents/test.txt"
file_name = os.path.basename(file_path)
print("文件路径为:", file_path)
print("文件名为:", file_name)
‘’’
文件路径为: /Users/username/Documents/test.txt
文件名为: test.txt
’’’
# 获取文件扩展名
file_path = "/Users/username/Documents/test.txt"
file_ext = os.path.splitext(file_path)[1]
print("文件路径为:", file_path)
print("文件扩展名为:", file_ext)
‘’’
文件路径为: /Users/username/Documents/test.txt
文件扩展名为: .txt
’‘’
os.path.getmtime(path):文件或文件夹的最后修改时间,从新纪元到访问时的秒数。os.path.getatime(path):文件或文件夹的最后访问时间,从新纪元到访问时的秒数。os.path.getctime(path):文件或文件夹的创建时间,从新纪元到访问时的秒数。
>>> os.path.getmtime('D:\\pythontest\\ostest\\hello.py')
1481695651.857048
>>> os.path.getatime('D:\\pythontest\\ostest\\hello.py')
1481687717.8506615
>>> os.path.getctime('D:\\pythontest\\ostest\\hello.py')
1481687717.8506615
os.path.getsize(path):文件或文件夹的大小,若是文件夹返回0。
>>> os.path.getsize('D:\\pythontest\\ostest\\hello.py')
58L
>>> os.path.getsize('D:\\pythontest\\ostest')
0L
os.path.exists(path):文件或文件夹是否存在,返回True 或 False。
>>> os.listdir(os.getcwd())
['hello.py', 'test.txt']
>>> os.path.exists('D:\\pythontest\\ostest\\hello.py')
True
>>> os.path.exists('D:\\pythontest\\ostest\\Hello.py')
True
>>> os.path.exists('D:\\pythontest\\ostest\\Hello1.py')
False
重点方法详细说明
os.access()
使用当前的uid/gid尝试访问路径,检查文件或目录是否存在和可访问。
语法格式如下:
os.access(path, mode);
参数:
- path -- 要用来检测是否有访问权限的路径。
- mode -- mode为F_OK,测试存在的路径,或者它可以是包含R_OK, W_OK和X_OK或者R_OK, W_OK和X_OK其中之一或者更多。
- os.F_OK: 作为access()的mode参数,测试path是否存在。
- os.R_OK: 包含在access()的mode参数中 , 测试path是否可读。
- os.W_OK 包含在access()的mode参数中 , 测试path是否可写。
- os.X_OK 包含在access()的mode参数中 ,测试path是否可执行。
如果允许访问返回 True , 否则返回False。
import os, sys
# 假定 /tmp/foo.txt 文件存在,并有读写权限
ret = os.access("/tmp/foo.txt", os.F_OK)
print "F_OK - 返回值 %s"% ret
ret = os.access("/tmp/foo.txt", os.R_OK)
print "R_OK - 返回值 %s"% ret
ret = os.access("/tmp/foo.txt", os.W_OK)
print "W_OK - 返回值 %s"% ret
ret = os.access("/tmp/foo.txt", os.X_OK)
print "X_OK - 返回值 %s"% ret
‘''
备注 使用 access() 来检查用户是否具有某项权限(如打开文件的权限),然后再使用 open() 打开文件,这样做存在一个安全漏洞,因为用户可能会在检查和打开文件之间的时间里做其他操作。推荐使用 EAFP 技术。如:
‘’'
if os.access("myfile", os.R_OK):
with open("myfile") as fp:
return fp.read()
return "some default data"
#最好写成:
try:
fp = open("myfile")
except PermissionError:
return "some default data"
else:
with fp:
return fp.read()
‘''
备注 即使 access() 指示 I/O 操作会成功,但实际操作仍可能失败,尤其是对网络文件系统的操作,其权限语义可能超出常规的 POSIX 权限位模型。
‘''
os.open()
用于打开一个文件,并且设置需要的打开选项,模式参数mode参数是可选的,默认为 0777。
语法格式如下:
os.open(path, flags, mode=0o777, *, dir_fd=None)
参数:
- file -- 要打开的文件
- flags -- 该参数可以是以下选项,多个使用 "|" 隔开:
- os.O_RDONLY: 以只读的方式打开
- os.O_WRONLY: 以只写的方式打开
- os.O_RDWR : 以读写的方式打开
- os.O_NONBLOCK: 打开时不阻塞
- os.O_APPEND: 以追加的方式打开
- os.O_CREAT: 创建并打开一个新文件
- os.O_TRUNC: 打开一个文件并截断它的长度为零(必须有写权限)
- os.O_EXCL: 如果指定的文件存在,返回错误
- os.O_SHLOCK: 自动获取共享锁
- os.O_EXLOCK: 自动获取独立锁
- os.O_DIRECT: 消除或减少缓存效果
- os.O_FSYNC : 同步写入
- os.O_NOFOLLOW: 不追踪软链接
- mode 可用以下选项按位或操作生成, 目录的读权限表示可以获取目录里文件名列表, ,执行权限表示可以把工作目录切换到此目录 ,删除添加目录里的文件必须同时有写和执行权限 ,文件权限以用户id->组id->其它顺序检验,最先匹配的允许或禁止权限被应用。
- stat.S_IXOTH: 其他用户有执行权0o001
- stat.S_IWOTH: 其他用户有写权限0o002
- stat.S_IROTH: 其他用户有读权限0o004
- stat.S_IRWXO: 其他用户有全部权限(权限掩码)0o007
- stat.S_IXGRP: 组用户有执行权限0o010
- stat.S_IWGRP: 组用户有写权限0o020
- stat.S_IRGRP: 组用户有读权限0o040
- stat.S_IRWXG: 组用户有全部权限(权限掩码)0o070
- stat.S_IXUSR: 拥有者具有执行权限0o100
- stat.S_IWUSR: 拥有者具有写权限0o200
- stat.S_IRUSR: 拥有者具有读权限0o400
- stat.S_IRWXU: 拥有者有全部权限(权限掩码)0o700
- stat.S_ISVTX: 目录里文件目录只有拥有者才可删除更改0o1000
- stat.S_ISGID: 执行此文件其进程有效组为文件所在组0o2000
- stat.S_ISUID: 执行此文件其进程有效用户为文件所有者0o4000
- stat.S_IREAD: windows下设为只读
- stat.S_IWRITE: windows下取消只读
- dir_fd基于目录描述符的相对路径: 如果 dir_fd 不是
None
,它就应该是一个指向目录的文件描述符,这时待操作的 path 应该是相对路径,相对路径是相对于前述目录的。如果 path 是绝对路径,则 dir_fd 将被忽略。
import os, sys
# 打开文件
fd = os.open( "foo.txt", os.O_RDWR|os.O_CREAT )
# 写入字符串
os.write(fd, "This is test")
# 关闭文件
os.close( fd )
print "关闭文件成功!!"
os.fdopen()
通过文件描述符 fd 创建一个文件对象,并返回这个文件对象。
法格式如下:
os.fdopen(fd, [, mode[, bufsize]]);
参数:
- fd -- 打开的文件的描述符,在Unix下,描述符是一个小整数。
- mode -- 可选,和bufsize参数和Python内建的open函数一样,mode参数可以指定『r,w,a,r+,w+,a+,b』等,表示文件的是只读的还是可以读写的,以及打开文件是以二进制还是文本形式打开。这些参数和C语言中的<stdio.h>中fopen函数中指定的mode参数类似。
- bufsize -- 可选,指定返回的文件对象是否带缓冲:bufsize=0,表示没有带缓冲;bufsize=1,表示该文件对象是行缓冲的;bufsize=正数,表示使用一个指定大小的缓冲冲,单位为byte,但是这个大小不是精确的;bufsize=负数,表示使用一个系统默认大小的缓冲,对于tty字元设备一般是行缓冲,而对于其他文件则一般是全缓冲。如果这个参数没有制定,则使用系统默认的缓冲设定。
通过文件描述符返回的文件对象。
import os, sys
# 打开文件
fd = os.open( "foo.txt", os.O_RDWR|os.O_CREAT )
# 获取以上文件的对象
fo = os.fdopen(fd, "w+")
# 获取当前文章
print "Current I/O pointer position :%d" % fo.tell()
# 写入字符串
fo.write( "Python is a great language.\nYeah its great!!\n");
# 读取内容
os.lseek(fd, 0, 0)
str = os.read(fd, 100)
print "Read String is : ", str
# 获取当前位置
print "Current I/O pointer position :%d" % fo.tell()
# 关闭文件
os.close( fd )
print "关闭文件成功!!"
os.close()
关闭指定的文件描述符 。
语法格式如下:
os.close(fd);
该方法没有返回值。
os.read()
用于从文件描述符 fd 中读取最多 n 个字节,返回包含读取字节的字符串,文件描述符 fd对应文件已达到结尾, 返回一个空字符串。
在Unix,Windows中有效
语法格式如下:
os.read(fd,n)
参数:
- fd -- 文件描述符。
- n -- 读取的字节。
返回包含读取字节的字符串
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import os, sys
# 打开文件
fd = os.open("f1.txt",os.O_RDWR)
# 读取文本
ret = os.read(fd,12)
print ret
# 关闭文件
os.close(fd)
print "关闭文件成功!!"
os.pread()和os.preadv()
语法格式为:
os.pread(fd, n, offset, /)
从文件描述符 fd 所指向文件的偏移位置 offset 开始,读取至多 n 个字节,而保持文件偏移量不变。返回所读取字节的字节串 (bytestring)。如果到达了 fd 指向的文件末尾,则返回空字节对象。
os.preadv(fd, buffers, offset, flags=0, /)
从文件描述符 fd 所指向文件的偏移位置 offset 开始,将数据读取至可变 字节类对象 缓冲区 buffers 中,保持文件偏移量不变。将数据依次存放到每个缓冲区中,填满一个后继续存放到序列中的下一个缓冲区,来保存其余数据。
flags 参数可以由零个或多个标志位进行按位或运算来得到:
- RWF_HIPRI 高优先级读/写。允许基于块的文件系统对设备进行轮询,这样可以降低延迟,但可能会占用更多资源。目前在 Linux 上,此功能仅在使用 O_DIRECT 标志打开的文件描述符上可用。可用性: Linux >= 4.6。
- RWF_NOWAIT 如果无法获取数据,不等待立即返回
返回实际读取的字节总数,该总数可以小于所有对象的总容量。
# Python program to explain os.pread() method
# importing os module
import os
# Open the file and get
# the file descriptor associated
# with it using os.open() method
fd = os.open("Python_intro.txt", os.O_RDONLY)
# Number of bytes to be read
n = 50
# Read at most n bytes from
# file descriptor fd
# using os.read() method
readBytes = os.read(fd, n)
# Print the bytes read
print(readBytes)
# Now set the Offset value
offset = 20
# Read at most n bytes from
# file descriptor fd at a position of
# given offset value using os.pread() method
readBytes = os.pread(fd, n, offset)
# Print the bytes read
print(readBytes)
# close the file descriptor
os.close(fd)
import os
# 文件路径
path = "foo.txt"
fd = os.open(path, os.O_RDONLY)
# 初始化缓冲区,长度为10
size = 10
buffers = bytearray(size)
# 从第2个字符开始读取
len = os.preadv(fd, [buffers], 2)
print(buffers)
print('Length::', len)
os.close(fd)
os.readv()
os.readv(fd, buffers, /)
从文件描述符 fd 将数据读取至多个可变的 字节类对象 缓冲区 buffers 中。将数据依次存放到每个缓冲区中,填满一个后继续存放到序列中的下一个缓冲区,来保存其余数据。
返回实际读取的字节总数,该总数可以小于所有对象的总容量。
buffers是一个缓冲区的元组或列表,其中每个元素描述一个缓冲区,具有以下结构:
buffers = [(buf,len),(buf,len),...]
其中buf是一个表示缓冲区的字节数组或者内存地址,len是这个缓冲区的大小。
这种struct模块中pack()/unpack()的方式而不是内存视图,被传递给readv()。它考虑了主机字节顺序。
import os
f = open('file.txt', 'rb')
fd = f.fileno()
buf1 = bytearray(b'hello')
buf2 = bytearray(b'world')
iov = [(buf1, len(buf1)), (buf2, len(buf2))]
nbytes = os.readv(fd, iov)
print(nbytes)
# 关闭文件
f.close()
# Python program to explain os.readv() method
# import os module
import os
# File path
path = "./file.txt"
# Open the file and get the
# file descriptor associated
# with it using os.open() method
fd = os.open(path, os.O_RDONLY)
# Bytes-like objects to hold
# the data read from the file
size = 20
buffer1 = bytearray(size)
buffer2 = bytearray(size)
buffer3 = bytearray(size)
# Read the data from the
# file descriptor into
# bytes-like objects
# using os.readv() method
numBytes = os.readv(fd, [buffer1, buffer2, buffer3])
# Print the data read in buffer1
print("Data read in buffer 1:", buffer1.decode())
# Print the data read in buffer2
print("Data read in buffer 2:", buffer2.decode())
# Print the data read in buffer3
print("Data read in buffer 3:", buffer3.decode())
# Print the number of bytes actually read
print("\nTotal Number of bytes actually read:", numBytes)
os.write()
语法格式如下:
os.write(fd, str)
参数:
- fd -- 文件描述符。
- str -- 写入的字符串。
该方法返回写入的实际位数。
import os, sys
# 打开文件
fd = os.open("f1.txt",os.O_RDWR|os.O_CREAT)
# 写入字符串
ret = os.write(fd,"This is runoob.com site")
# 输入返回值
print "写入的位数为: "
print ret
print "写入成功"
# 关闭文件
os.close(fd)
print "关闭文件成功!!"
os.pwrite()和os.pwritev()
os.pwrite(fd, str, offset, /)
将 str 中的字节串 (bytestring) 写入文件描述符 fd 的偏移位置 offset 处,保持文件偏移量不变。返回实际写入的字节数。
os.pwritev(fd, buffers, offset, flags=0, /)
将缓冲区 buffers 的内容写入文件描述符 fd 的偏移位置 offset 处,保持文件偏移量不变。缓冲区 buffers 必须是由 字节类对象 组成的序列。缓冲区以数组顺序处理。先写入第一个缓冲区的全部内容,再写入第二个缓冲区,照此继续。返回实际写入的字节总数。
flags 参数可以由零个或多个标志位进行按位或运算来得到:
- RWF_DSYNC 提供预写功能,等效于带 O_DSYNC 标志的 os.open() 。本标志只作用于通过系统调用写入的数据。
- RWF_SYNC 提供预写功能,等效于带 O_SYNC 标志的 os.open() 。本标志只作用于通过系统调用写入的数据。
- RWF_APPEND提供预写功能,等效于带 O_APPEND 标志的 os.open() 。本标志只对 os.pwritev() 有意义,只作用于通过系统调用写入的数据。参数 offset 对写入操作无效;数据总是会添加到文件的末尾。但如果 offset 参数为 -1,则会刷新当前文件的 offset 。
# Python program to explain os.pwrite() method
# Importing os module
import os
# Filename
filename = "file.txt"
# Open the file and get the
# file descriptor associated
# with it using os.open method
fd = os.open(filename, os.O_RDWR)
# String to be written in the file
s = "Python, "
# converting string to bytestring
text = s.encode("utf-8")
# Position from where
# file writing will start
offset = 0
# As offset is 0, bytestring
# will be written in the
# beginning of the file
# Write the bytestring
# to the file indicated by
# file descriptor at
# specified position
bytesWritten = os.pwrite(fd, text, offset)
print("Number of bytes actually written:", bytesWritten)
# Print the content of the file
with open(filename) as f:
print(f.read())
# String to be written in the file
s = "Javascript, "
# converting string to bytestring
text = s.encode("utf-8")
# Position from where
# file writing will start
# os.stat(fd).st_size will return
# file size in bytes
# so bytestring will be written
# at the end of the file
offset = os.stat(fd).st_size
# Write the bytestring
# to the file indicated by
# file descriptor at
# specified position
bytesWritten = os.pwrite(fd, text, offset)
print("\nNumber of bytes actually written:", bytesWritten)
# Print the content of the file
with open(filename) as f:
print(f.read())
# String to be written in the file
s = "R Programming, "
# converting string to bytestring
text = s.encode("utf-8")
# Position from where
# file writing will start
offset = 10
# Write the bytestring
# to the file indicated by
# file descriptor at
# specified position
bytesWritten = os.pwrite(fd, text, offset)
print("\nNumber of bytes actually written:", bytesWritten)
# Print the content of the file
with open(filename) as f:
print(f.read())
# coding=utf-8
# Python3 代码
# 讲解怎样使用 os.pwritev() 函数写入缓冲区数组
# 引入 os 库
import os
# 文件路径
path = "foo.txt"
# 使用 os.open 函数打开文件
fd = os.open(path, os.O_RDWR)
# 使用 os.pwritev 函数
# 写入字节数组
buffer1 = bytearray(b"Python")
buffer2 = bytearray(b"PHP")
len = os.pwritev(fd, [buffer1, buffer2], 3)
# 缓冲的字符长度
print('Length::', len)
# 读取文件内容
with open(path) as f:
print(f.read())
# 关闭文件
os.close(fd)
os.writev()
os.writev(fd, buffers, /)
将缓冲区 buffers 的内容写入文件描述符 fd。缓冲区 buffers 必须是由 字节类对象 组成的序列。缓冲区以数组顺序处理。先写入第一个缓冲区的全部内容,再写入第二个缓冲区,照此继续。返回实际写入的字节总数。
# Python program to explain os.writev() method
# import os module
import os
# File path
path = "./file2.txt"
# Create a file and get the
# file descriptor associated
# with it using os.open() method
fd = os.open(path, os.O_CREAT | os.O_WRONLY)
# Bytes-like objects
# the data to be written in the file
buffer1 = bytearray(b"GeeksForGeeks:")
buffer2 = bytearray(b"A computer science portal ")
buffer3 = bytearray(b"for geeks")
# write the data contained in
# bytes-like objects
# to the file descriptor fd
# using os.writev() method
numBytes = os.writev(fd, [buffer1, buffer2, buffer3])
# print the content of file
with open(path) as f:
print(f.read())
# Print the number of bytes actually written
print("Total Number of bytes actually written:", numBytes)
os.sendfile()
os.sendfile(out_fd, in_fd, offset, count)
os.sendfile(out_fd, in_fd, offset, count, headers=(), trailers=(), flags=0)
将文件描述符 in_fd 中的 count 字节复制到文件描述符 out_fd 的偏移位置 offset 处。返回复制的字节数,如果到达 EOF,返回 0
。
在 Linux 上,将 offset 设置为 None
,则从 in_fd 的当前位置开始读取,并更新 in_fd 的位置。
第二种情况可以被用于 macOS 和 FreeBSD,其中 headers 和 trailers 是任意的缓冲区序列,它们会在写入来自 in_fd 的数据之前被写入。 它的返回内容与第一种情况相同。
在 macOS 和 FreeBSD 上,传入 0
值作为 count 将指定持续发送直至到达 in_fd 的末尾。
所有平台都支持将套接字作为 out_fd 文件描述符,有些平台也支持其他类型(如常规文件或管道)。
跨平台应用程序不应使用 headers、trailers 和 flags 参数。
os.rename()
rename() 方法需要两个参数,当前的文件名和新文件名。
语法:
os.rename(current_file_name, new_file_name)
例子:
下例将重命名一个已经存在的文件test1.txt。
import os
# 重命名文件test1.txt到test2.txt。
os.rename( "test1.txt", "test2.txt" )
os.remove()
可以用remove()方法删除文件,需要提供要删除的文件名作为参数。
语法:
os.remove(file_name)
例子:
下例将删除一个已经存在的文件test2.txt。
import os
# 删除一个已经存在的文件test2.txt
os.remove("test2.txt")
os.mkdir()
语法:
os.mkdir("newdir")
例子:
下例将在当前目录下创建一个新目录test。
import os
# 创建目录test
os.mkdir("test")
os.rmdir()
删除目录,目录名称以参数传递。
在删除这个目录之前,它的所有内容应该先被清除。
语法:
os.rmdir('dirname')
例子:
以下是删除" /tmp/test"目录的例子。目录的完全合规的名称必须被给出,否则会在当前目录下搜索该目录。
import os
# 删除”/tmp/test”目录
os.rmdir( "/tmp/test" )
os.makedirs()
可生成多层递归目录
os.getcwd()和os.chdir()
使用os.getcwd()函数来获取当前工作目录。当前工作目录是指Python程序当前所在的目录。
使用os.chdir()函数来改变当前工作目录。
import os
# 获取当前工作目录
current_dir = os.getcwd()
print("当前工作目录为:", current_dir)
# 改变当前工作目录
os.chdir("/Users/username/Documents")
new_dir = os.getcwd()
print("新的工作目录为:", new_dir)
‘’’
当前工作目录为: /Users/username/Desktop
新的工作目录为: /Users/username/Documents
’‘’
os.listdir()
os.listdir(path):将路径下所有文件存到list中
>>> import os
>>> os.getcwd()
'D:\\pythontest\\ostest'
>>> os.listdir(os.getcwd())
['hello.py', 'test.txt']
os.chflags()
用于设置路径的标记为数字标记
语法格式如下:
os.chflags(path, flags)
参数:
-
path -- 文件名路径或目录路径。
-
flags -- 可以是以下值:
- stat.UF_NODUMP: 非转储文件
- stat.UF_IMMUTABLE: 文件是只读的
- stat.UF_APPEND: 文件只能追加内容
- stat.UF_NOUNLINK: 文件不可删除
- stat.UF_OPAQUE: 目录不透明,需要通过联合堆栈查看
- stat.SF_ARCHIVED: 可存档文件(超级用户可设)
- stat.SF_IMMUTABLE: 文件是只读的(超级用户可设)
- stat.SF_APPEND: 文件只能追加内容(超级用户可设)
- stat.SF_NOUNLINK: 文件不可删除(超级用户可设)
- stat.SF_SNAPSHOT: 快照文件(超级用户可设)
该方法没有返回值。
import os,stat
path = "/tmp/foo.txt"
# 为文件设置标记,使得它不能被重命名和删除
flags = stat.SF_NOUNLINK
retval = os.chflags( path, flags)
print "返回值: %s" % retval
os.chmod()
用于更改文件或目录的权限。
语法格式如下:
os.chmod(path, mode)
参数:
-
path -- 文件名路径或目录路径。
-
flags -- 可用以下选项按位或操作生成, 目录的读权限表示可以获取目录里文件名列表, ,执行权限表示可以把工作目录切换到此目录 ,删除添加目录里的文件必须同时有写和执行权限 ,文件权限以用户id->组id->其它顺序检验,最先匹配的允许或禁止权限被应用。
- stat.S_IXOTH: 其他用户有执行权0o001
- stat.S_IWOTH: 其他用户有写权限0o002
- stat.S_IROTH: 其他用户有读权限0o004
- stat.S_IRWXO: 其他用户有全部权限(权限掩码)0o007
- stat.S_IXGRP: 组用户有执行权限0o010
- stat.S_IWGRP: 组用户有写权限0o020
- stat.S_IRGRP: 组用户有读权限0o040
- stat.S_IRWXG: 组用户有全部权限(权限掩码)0o070
- stat.S_IXUSR: 拥有者具有执行权限0o100
- stat.S_IWUSR: 拥有者具有写权限0o200
- stat.S_IRUSR: 拥有者具有读权限0o400
- stat.S_IRWXU: 拥有者有全部权限(权限掩码)0o700
- stat.S_ISVTX: 目录里文件目录只有拥有者才可删除更改0o1000
- stat.S_ISGID: 执行此文件其进程有效组为文件所在组0o2000
- stat.S_ISUID: 执行此文件其进程有效用户为文件所有者0o4000
- stat.S_IREAD: windows下设为只读
- stat.S_IWRITE: windows下取消只读
该方法没有返回值。
import os, sys, stat
# 假定 /tmp/foo.txt 文件存在,设置文件可以通过用户组执行
os.chmod("/tmp/foo.txt", stat.S_IXGRP)
# 设置文件可以被其他用户写入
os.chmod("/tmp/foo.txt", stat.S_IWOTH)
print "修改成功!!"
os.fstat()和os.stat()
返回文件描述符fd的状态,类似 stat()。
语法格式如下:
os.fstat(fd)
返回文件描述符fd的状态。
fstat 方法返回的结构:
-
st_dev: 设备信息
-
st_ino: 文件的i-node值
-
st_mode: 文件信息的掩码,包含了文件的权限信息,文件的类型信息(是普通文件还是管道文件,或者是其他的文件类型)
-
st_nlink: 硬连接数
-
st_uid: 用户ID
-
st_gid: 用户组 ID
-
st_rdev: 设备 ID (如果指定文件)
-
st_size: 文件大小,以byte为单位
-
st_blksize: 系统 I/O 块大小
-
st_blocks: 文件的是由多少个 512 byte 的块构成的
-
st_atime: 文件最近的访问时间
-
st_mtime: 文件最近的修改时间
-
st_ctime: 文件状态信息的修改时间(不是文件内容的修改时间)
import os, sys
# 打开文件
fd = os.open( "foo.txt", os.O_RDWR|os.O_CREAT )
# 获取元组
info = os.fstat(fd)
print "文件信息 :", info
# 获取文件 uid
print "文件 UID :%d" % info.st_uid
# 获取文件 gid
print "文件 GID :%d" % info.st_gid
# 关闭文件
os.close( fd)
‘''
文件信息 : (33261, 3753776L, 103L, 1, 0, 0,
102L, 1238783197, 1238786767, 1238786767)
文件 UID :0
文件 GID :0
‘''
os.walk()
一个遍历目录数的函数,它以一种深度优先的策略(depth-first)访问指定的目录。
os.walk(top=path,topdown=True,oneerror=None)
- 参数 top 表示需要遍历的目录树的路径。
- 参数 topdown 默认为 True ,表示首先返回根目录树下的文件,然后,再遍历目录树的子目录。 当topdown 的值为 False 时,则表示先遍历目录树的子目录,返回子目录下的文件,最后返回根目录下的文件。
- 参数 oneerror 的默认值为 None ,表示忽略文件遍历时产生的错误;如果不为空,则提供一个自定义函数提示错误信息,后边遍历抛出异常。
os.walk() 函数的返回值是一个生成器(generator),每次遍历的对象都是返回的是一个三元组 (root,dirs,files):该元组有3个元素,这3个元素分别表示每次遍历的路径名,目录列表和文件列表。
- root 代表当前遍历的目录路径,string类型。
- dirs 代表root路径下的所有子目录名称;list类型,列表中的每个元素是string类型,代表子目录名称。
- files 代表root路径下的所有子文件名称;list类型,列表中的每个元素是string类型,代表子文件名称。
‘’'
/home/root/1.txt
2.txt
3.txt
/zhang/zhang_1.mp4
zhang_2.mp4
zhang_3.mp4
/li
test.txt
hai.mp4
‘’'
import os
from os.path import join
home_path = "/home"
for (root, dirs, files) in os.walk(home_path):
print(root)
print(dirs)
print(files)
print("=" * 50)
‘’'
/home
['root', 'zhang', 'li']
['test.txt', 'hai.mp4']
==================================================
/home/root
[]
['1.txt', '2.txt', '3.txt']
==================================================
/hoome/zhang
[]
['zhang_1.mp4', 'zhang_2.mp4', 'zhang_3.mp4']
==================================================
/home/li
[]
[]
==================================================
‘’'
一共三行:
第1行代表当前遍历的目录,我们称为root目录,
第2行代表root目录下的子目录列表,我们称为dirs子目录列表,
第3行代表root目录下的子文件列表,我们称为files子文件列表,
注意:上面的列表为空就代表当前遍历的root目录下没有子目录或者没有子文件。
遍历home目录下获取所有的目录和文件的绝对路径
import os
from os.path import join
home_path = "/home"
for (root, dirs, files) in os.walk(home_path):
for dir in dirs:
print(join(root, dir))
for file in files:
print(join(root, file))
‘’'
/home
/home/root
/home/zhang
/home/li
/home/test.txt
/home/hai.mp4
/home/root/1.txt
/home/root/2.txt
/home/root/3.txt
/home/zhang/zhang_1.mp4
/home/zhang/zhang_2.mp4
/home/zhang/zhang_3.mp4
‘''
import os
def walk(path):
if not os.path.exists(path):
return -1
for root,dirs,names in os.walk(path):
for filename in names:
print(os.path.join(root,filename)) # 路径和文件名连接构成完整路径
if __name__=='__main__':
path = "C:\\Users\\Administrator\\Desktop\\2017-9-1"
walk(path)
‘’'
C:\Users\Administrator\Desktop\2017-9-1\2017-9-1.txt
C:\Users\Administrator\Desktop\2017-9-1\2017-9-1storage.txt
C:\Users\Administrator\Desktop\2017-9-1\apk.conf
C:\Users\Administrator\Desktop\2017-9-1\数据采集导入质量统计_2017-09-01.docx
C:\Users\Administrator\Desktop\2017-9-1\test1\2017-9-1.txt
C:\Users\Administrator\Desktop\2017-9-1\test2\2017-9-1.txt
‘''
os.system()
运行shell命令
eg:执行ls -a > 1.txt命令
import os
os.system(‘ls -a > 1.txt’)
os.popen()
是 Python 中用于执行一个 shell 命令并获取输出结果的方法。它返回一个 file-like object,可以像文件一样进行读取操作。下面是一个使用 os.popen
的例子:
import os
# 执行 shell 命令并获取输出结果
output = os.popen("ls -l").read()
# 打印输出结果
print(output)
上面的例子执行了 ls -l
命令,并将结果存储在 output
变量中。然后使用 print
函数将结果打印出来。
语法格式如下:
os.popen(command[, mode[, bufsize]])
参数:
- command -- 使用的命令。
- mode -- 模式权限可以是 'r'(默认) 或 'w'。
- bufsize -- 指明了文件需要的缓冲大小:0意味着无缓冲;1意味着行缓冲;其它正值表示使用参数大小的缓冲(大概值,以字节为单位)。负的bufsize意味着使用系统的默认值,一般来说,对于tty设备,它是行缓冲;对于其它文件,它是全缓冲。如果没有改参数,使用系统的默认值。
返回一个文件描述符号为fd的打开的文件对象
os.environ
os.environ
是一个用于获取和设置操作系统环境变量的模块。
import os
# 获取全部环境变量
env_variables = os.environ
print(env_variables)
# 获取指定环境变量的值
python_path = os.environ.get('PYTHONPATH')
print(python_path)
# 修改环境变量的值
os.environ['MY_VARIABLE'] = 'my_value'
注意:修改环境变量直接使用os.environ[key]的模式,不要使用os.putenv()、os.unsetenv()、os.getenv()这些方法,这些方法只会影响会由 os.system(), popen() ,fork() 和 execv() 发起的子进程。
import os
# print(os.environ)
if 'SHELL' in os.environ:
print(f"$SHELL={os.environ['SHELL']}")
os.putenv('PKEY', 'this is a test!')
if 'PKEY' not in os.environ:
print('PKEY not in os.environ!’)
‘’'
$SHELL=/bin/bash
PKEY not in os.environ!
‘''
os.name
导入的依赖特定操作系统的模块的名称,返回’posix’表示Linux,'nt’表示Windows,'java’表示Java虚拟机
import os
name = os.name
if name == 'posix':
print ("this is Linux or Unix")
elif name == 'nt':
print ("this is windows")
else:
print ("this is other system")
os.uname()
返回当前操作系统的识别信息。返回值是一个有5个属性的对象:
sysname
- 操作系统名nodename
- 机器在网络上的名称(需要先设定)release
- 操作系统发行信息version
- 操作系统版本信息machine
- 硬件标识符
为了向后兼容,该对象也是可迭代的,像是一个按照 sysname
,nodename
,release
,version
,和 machine
顺序组成的元组。
import os
print(os.uname())
for inf in os.uname():
print(inf)
‘’'
posix.uname_result(sysname='Darwin', nodename='bogon', release='21.6.0', version='Darwin Kernel Version 21.6.0: Thu Jul 6 22:18:26 PDT 2023; root:xnu-8020.240.18.702.13~1/RELEASE_X86_64', machine='x86_64')
Darwin
bogon
21.6.0
Darwin Kernel Version 21.6.0: Thu Jul 6 22:18:26 PDT 2023; root:xnu-8020.240.18.702.13~1/RELEASE_X86_64
x86_64
‘''
os.sep、os.extsep、os.pathsep、os.linesep
os中定义了一组文件、路径在不同操作系统中的表现形式参数,如:
>>> os.sep
'\\'
>>> os.extsep
'.'
>>> os.pathsep
';'
>>> os.linesep
'\r\n'
open()、os.open()、os.fdopen()
open() 函数用于打开一个文件,创建一个 file 对象
os.open()创建操作系统级文件描述符
os.fdopen()从文件描述符中创建一个文件对象。也就是说,os.fdopen()是以os.open()返回的基础上得到一个文件对象。
import os
fd = os.open('test.txt', os.O_RDONLY)
fo = os.fdopen(fd)
print(type(fo))
print(fo.read())
os.close(fd)
f1 = open('test.txt', 'r')
print(type(f1))
print(f1.read())
f1.close()
‘’’
<class '_io.TextIOWrapper'>
line1: name
line2: age
line3: country
<class '_io.TextIOWrapper'>
line1: name
line2: age
line3: country
’‘’
os.open
和os.fdopen
之间的最大区别在于它们返回的对象不同。os.open
返回的是一个整数类型的文件描述符,可以用于低级别的文件操作;而os.fdopen
返回的是一个文件对象,可以用于高级别的文件操作。
从os.fdopen()和open()返回的文件对象看是同一个类型的。
使用文件操作的函数时,一定要注意函数的参数是文件句柄还是文件对象。