标签:conf test 效果 用户组 写文件 pos ace 了解 evel
Python 文件 I/O(输入/输出)是比较乏味的事情,因为看不到明显的运行效果,但 I/O 是所有程序都必需的部分,使用输入机制,允许程序读取外部数据(包括来自磁盘、光盘等存储设备的数据),用户输入数据;使用输出机制,允许程序记录运行状态,将程序数据输出到磁盘、光盘等存储设备中;
Python 提供有非常丰富的文件 I/O 支持,它既提供了 pathlib 和 os.path 来操作各种路径,也提供了全局的 open() 函数来打开文件(在打开文件之后,程序既可读取文件的内容,也可向文件输出内容)。而且 Python 提供了多种方式来读取文件内容,因此非常简单、灵活。
此外,在 Python 的 os 模块下也包含了大量进行文件 I/O 的函数,使用这些函数来读取、写入文件也很方便,因此读者可以根据需要选择不同的方式来读写文件。
Pyhon 还提供了 tempfile 模块来创建临时文件和临时目录,tempfile 模块下的高级 API 会自动管理临时文件的创建和删除;当程序不再使用临时文件和临时目录时,程序会自动删除临时文件和临时目录
windows 要用反斜杠转义反斜杠
[root@kube file]# cat demo.py import os myFiles = [‘a.txt‘,‘b.txt‘,‘c.txt‘] for i in myFiles: print(os.path.join(‘/root/python/file‘, i)) [root@kube file]# py demo.py /root/python/file/a.txt /root/python/file/b.txt /root/python/file/c.txt [root@kube file]#
os 模块提供了非常丰富的方法用来处理文件和目录。常用的方法如下表所示:
序号 | 方法及描述 |
---|---|
1 |
检验权限模式 |
2 |
改变当前工作目录 |
3 |
设置路径的标记为数字标记。 |
4 |
更改权限 |
5 |
更改文件所有者 |
6 |
改变当前进程的根目录 |
7 |
关闭文件描述符 fd |
8 |
os.closerange(fd_low, fd_high) 关闭所有文件描述符,从 fd_low (包含) 到 fd_high (不包含), 错误会忽略 |
9 |
复制文件描述符 fd |
10 |
将一个文件描述符 fd 复制到另一个 fd2 |
11 |
通过文件描述符改变当前工作目录 |
12 |
改变一个文件的访问权限,该文件由参数fd指定,参数mode是Unix下的文件访问权限。 |
13 |
修改一个文件的所有权,这个函数修改一个文件的用户ID和用户组ID,该文件由文件描述符fd指定。 |
14 |
强制将文件写入磁盘,该文件由文件描述符fd指定,但是不强制更新文件的状态信息。 |
15 |
os.fdopen(fd[, mode[, bufsize]]) 通过文件描述符 fd 创建一个文件对象,并返回这个文件对象 |
16 |
返回一个打开的文件的系统配置信息。name为检索的系统配置的值,它也许是一个定义系统值的字符串,这些名字在很多标准中指定(POSIX.1, Unix 95, Unix 98, 和其它)。 |
17 |
返回文件描述符fd的状态,像stat()。 |
18 |
返回包含文件描述符fd的文件的文件系统的信息,像 statvfs() |
19 |
强制将文件描述符为fd的文件写入硬盘。 |
20 |
裁剪文件描述符fd对应的文件, 所以它最大不能超过文件大小。 |
21 |
返回当前工作目录 |
22 |
返回一个当前工作目录的Unicode对象 |
23 |
如果文件描述符fd是打开的,同时与tty(-like)设备相连,则返回true, 否则False。 |
24 |
设置路径的标记为数字标记,类似 chflags(),但是没有软链接 |
25 |
修改连接文件权限 |
26 |
更改文件所有者,类似 chown,但是不追踪链接。 |
27 |
创建硬链接,名为参数 dst,指向参数 src |
28 |
返回path指定的文件夹包含的文件或文件夹的名字的列表。 |
29 |
设置文件描述符 fd当前位置为pos, how方式修改: SEEK_SET 或者 0 设置从文件开始的计算的pos; SEEK_CUR或者 1 则从当前位置计算; os.SEEK_END或者2则从文件尾部开始. 在unix,Windows中有效 |
30 |
像stat(),但是没有软链接 |
31 |
从原始的设备号中提取设备major号码 (使用stat中的st_dev或者st_rdev field)。 |
32 |
以major和minor设备号组成一个原始设备号 |
33 |
递归文件夹创建函数。像mkdir(), 但创建的所有intermediate-level文件夹需要包含子文件夹。 |
34 |
从原始的设备号中提取设备minor号码 (使用stat中的st_dev或者st_rdev field )。 |
35 |
以数字mode的mode创建一个名为path的文件夹.默认的 mode 是 0777 (八进制)。 |
36 |
创建命名管道,mode 为数字,默认为 0666 (八进制) |
37 |
os.mknod(filename[, mode=0600, device]) |
38 |
打开一个文件,并且设置需要的打开选项,mode参数是可选的 |
39 |
打开一个新的伪终端对。返回 pty 和 tty的文件描述符。 |
40 |
返回相关文件的系统配置信息。 |
41 |
创建一个管道. 返回一对文件描述符(r, w) 分别为读和写 |
42 |
os.popen(command[, mode[, bufsize]]) 从一个 command 打开一个管道 |
43 |
从文件描述符 fd 中读取最多 n 个字节,返回包含读取字节的字符串,文件描述符 fd对应文件已达到结尾, 返回一个空字符串。 |
44 |
返回软链接所指向的文件 |
45 |
删除路径为path的文件。如果path 是一个文件夹,将抛出OSError; 查看下面的rmdir()删除一个 directory。 |
46 |
递归删除目录。 |
47 |
重命名文件或目录,从 src 到 dst |
48 |
递归地对目录进行更名,也可以对文件进行更名。 |
49 |
删除path指定的空目录,如果目录非空,则抛出一个OSError异常。 |
50 |
获取path指定的路径的信息,功能等同于C API中的stat()系统调用。 |
51 |
os.stat_float_times([newvalue]) |
52 |
获取指定路径的文件系统统计信息 |
53 |
创建一个软链接 |
54 |
返回与终端fd(一个由os.open()返回的打开的文件描述符)关联的进程组 |
55 |
设置与终端fd(一个由os.open()返回的打开的文件描述符)关联的进程组为pg。 |
56 |
返回唯一的路径名用于创建临时文件。 |
57 |
返回一个打开的模式为(w+b)的文件对象 .这文件对象没有文件夹入口,没有文件描述符,将会自动删除。 |
58 |
为创建一个临时文件返回一个唯一的路径 |
59 |
返回一个字符串,它表示与文件描述符fd 关联的终端设备。如果fd 没有与终端设备关联,则引发一个异常。 |
60 |
删除文件路径 |
61 |
返回指定的path文件的访问和修改的时间。 |
62 |
os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]]) 输出在文件夹中的文件名通过在树中游走,向上或者向下。 |
63 |
写入字符串到文件描述符 fd中. 返回实际写入的字符串长度 |
64 |
获取文件的属性信息。 |
input([prompt]) 函数和 raw_input([prompt]) 函数基本类似,但是 input 可以接收一个Python表达式作为输入,并将运算结果返回。
[root@kube file]# ls a.txt b.txt c.txt demo1.py demo.py qq.txt [root@kube file]# cat demo1.py #coding:utf-8 import os os.remove(‘qq.txt‘) os.remove 删除文件
[root@kube file]# py demo1.py [root@kube file]# ll total 8 -rw-r--r-- 1 root root 0 Oct 27 17:54 a.txt -rw-r--r-- 1 root root 0 Oct 27 17:54 b.txt -rw-r--r-- 1 root root 0 Oct 27 17:54 c.txt -rw-r--r-- 1 root root 45 Oct 27 18:11 demo1.py -rw-r--r-- 1 root root 110 Oct 27 17:58 demo.py [root@kube file]#
open() 函数用于创建或打开指定文件,该函数的语法格式如下: file = open(file_name [, mode[, buffering]]) 此格式中,用 [] 括起来的部分,表示作为可选操作,可以使用,也可以省略。其中,各个参数所代表的含义如下: file:表示要创建的文件对象。 file_mode:要创建或打开文件的文件名称,该名称要用引号(单引号或双引号都可以)括起来。需要注意的是,如果要打开的文件和当前执行的代码文件位于同一目录,则直接写文件名即可;否则,此参数需要指定打开文件所在的完整路径。 mode:可选参数,用于指定文件的打开模式。可选的打开模式如表 1 所示。如果不写,则默认以只读(r)模式打开文件。 buffing:可选参数,用于指定对文件做读写操作时,是否使用缓冲区(本节后续会详细介绍)。
open() 函数支持的文件打开模式如表 1 所示。
模式 | 意义 | 注意事项 |
---|---|---|
r | 只读模式打开文件,读文件内容的指针会放在文件的开头。 | 操作的文件必须存在。 |
rb | 以二进制格式、采用只读模式打开文件,读文件内容的指针位于文件的开头,一般用于非文本文件,如图片文件、音频文件等。 | |
r+ | 打开文件后,既可以从头读取文件内容,也可以从开头向文件中写入新的内容,写入的新内容会覆盖文件中等长度的原有内容。 | |
rb+ | 以二进制格式、采用读写模式打开文件,读写文件的指针会放在文件的开头,通常针对非文本文件(如音频文件)。 | |
w | 以只写模式打开文件,若该文件存在,打开时会清空文件中原有的内容。 | 若文件存在,会清空其原有内容(覆盖文件);反之,则创建新文件。 |
wb | 以二进制格式、只写模式打开文件,一般用于非文本文件(如音频文件) | |
w+ | 打开文件后,会对原有内容进行清空,并对该文件有读写权限。 | |
wb+ | 以二进制格式、读写模式打开文件,一般用于非文本文件 | |
a | 以追加模式打开一个文件,对文件只有写入权限,如果文件已经存在,文件指针将放在文件的末尾(即新写入内容会位于已有内容之后);反之,则会创建新文件。 | |
ab | 以二进制格式打开文件,并采用追加模式,对文件只有写权限。如果该文件已存在,文件指针位于文件末尾(新写入文件会位于已有内容之后);反之,则创建新文件。 | |
a+ | 以读写模式打开文件;如果文件存在,文件指针放在文件的末尾(新写入文件会位于已有内容之后);反之,则创建新文件。 | |
ab+ | 以二进制模式打开文件,并采用追加模式,对文件具有读写权限,如果文件存在,则文件指针位于文件的末尾(新写入文件会位于已有内容之后);反之,则创建新文件。 | |
成功打开文件之后,可以调用文件对象本身拥有的属性获取当前文件的部分信息,其常见的属性为:
# 以默认方式打开文件 f = open(‘open_test.py‘) # 访问文件的编码方式 print(f.encoding) # cp936 # 访问文件的访问模式 print(f.mode) # r # 访问文件是否已经关闭 print(f.closed) # False # 访问文件对象打开的文件名 print(f.name) # open_test.py 上面程序使用 open() 内置函数打开了 open_test.py 文件,接下来程序访问了被打开文件的各属性。运行上面程序,可以看到如下输出结果: cp936 r False open_test.py
file 对象使用 open 函数来创建,下表列出了 file 对象常用的函数:
序号 | 方法及描述 |
---|---|
1 |
关闭文件。关闭后文件不能再进行读写操作。 |
2 |
刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。 |
3 |
返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上。 |
4 |
如果文件连接到一个终端设备返回 True,否则返回 False。 |
5 |
Python 3 中的 File 对象不支持 next() 方法。 返回文件下一行。 |
6 |
从文件读取指定的字节数,如果未给定或为负则读取所有。 |
7 |
读取整行,包括 "\n" 字符。 |
8 |
读取所有行并返回列表,若给定sizeint>0,返回总和大约为sizeint字节的行, 实际读取值可能比 sizeint 较大, 因为需要填充缓冲区。 |
9 |
移动文件读取指针到指定位置 |
10 |
返回文件当前位置。 |
11 |
从文件的首行首字符开始截断,截断文件为 size 个字符,无 size 表示从当前位置截断;截断之后后面的所有字符被删除,其中 Widnows 系统下的换行代表2个字符大小。 |
12 |
将字符串写入文件,返回的是写入的字符长度。 |
13 |
向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。 |
任何一门编程语言中,文件的输入输出、数据库的连接断开等,都是很常见的资源管理操作。但资源都是有限的,在写程序时,必须保证这些资源在使用过后得到释放,不然就容易造成资源泄露,轻者使得系统处理缓慢,严重时会使系统崩溃。
例如,前面在介绍文件操作时,一直强调打开的文件最后一定要关闭,否则会程序的运行造成意想不到的隐患。但是,即便使用 close() 做好了关闭文件的操作,如果在打开文件或文件操作过程中抛出了异常,还是无法及时关闭文件。
为了更好地避免此类问题,不同的编程语言都引入了不同的机制。在 Python 中,对应的解决方式是使用 with as 语句操作上下文管理器(context manager),它能够帮助我们自动分配并且释放资源。
简单的理解,同时包含 __enter__() 和 __exit__() 方法的对象就是上下文管理器。常见构建上下文管理器的方式有 2 种,分别是基于类实现和基于生成器实现,在《什么是上下文管理器,深入底层了解 with as 语句》一文有详细介绍。
例如,使用 with as 操作已经打开的文件对象(本身就是上下文管理器),无论期间是否抛出异常,都能保证 with as 语句执行完毕后自动关闭已经打开的文件。
首先学习如何使用 with as 语句。with as 语句的基本语法格式为:
with 表达式 [as target]:
代码块
简单的理解,同时包含 __enter__() 和 __exit__() 方法的对象就是上下文管理器。也就是说,上下文管理器必须实现如下两个方法:
当 with as 操作上下文管理器时,就会在执行语句体之前,先执行上下文管理器的 __enter__() 方法,然后再执行语句体,最后执行 __exit__() 方法。
构建上下文管理器,常见的有 2 种方式:基于类实现和基于生成器实现。
通过上面的介绍不难发现,只要一个类实现了 __enter__() 和 __exit__() 这 2 个方法,程序就可以使用 with as 语句来管理它,通过 __exit__() 方法的参数,即可判断出 with 代码块执行时是否遇到了异常。其实,上面程序中的文件对象也实现了这两个方法,因此可以接受 with as 语句的管理。
下面我们自定义一个实现上下文管理协议的类,并尝试用 with as 语句来管理它:
class FkResource: def __init__(self, tag): self.tag = tag print(‘构造器,初始化资源: %s‘ % tag) # 定义__enter__方法,with体之前的执行的方法 def __enter__(self): print(‘[__enter__ %s]: ‘ % self.tag) # 该返回值将作为as子句中变量的值 return ‘fkit‘ # 可以返回任意类型的值 # 定义__exit__方法,with体之后的执行的方法 def __exit__(self, exc_type, exc_value, exc_traceback): print(‘[__exit__ %s]: ‘ % self.tag) # exc_traceback为None,代表没有异常 if exc_traceback is None: print(‘没有异常时关闭资源‘) else: print(‘遇到异常时关闭资源‘) return False # 可以省略,默认返回None也被看做是False with FkResource(‘孙悟空‘) as dr: print(dr) print(‘[with代码块] 没有异常‘) print(‘------------------------------‘) with FkResource(‘白骨精‘): print(‘[with代码块] 异常之前的代码‘) raise Exception print(‘[with代码块] ~~~~~~~~异常之后的代码‘) 运行上面的程序,可以看到如下输出结果: 构造器,初始化资源: 孙悟空 [__enter__ 孙悟空]: fkit [with代码块] 没有异常 [__exit__ 孙悟空]: 没有异常时关闭资源 ------------------------------ 构造器,初始化资源: 白骨精 [__enter__ 白骨精]: [with代码块] 异常之前的代码 [__exit__ 白骨精]: 遇到异常时关闭资源 Traceback (most recent call last): File "C:\Users\mengma\Desktop\1.py", line 26, in <module> raise Exception Exception
上面程序定义了一个 FkResource 类,并包含了 __enter__() 和 __exit__() 两个方法,因此该类的对象可以被 with as 语句管理。
此外,程序中两次使用 with as 语句管理 FkResource 对象。第一次代码块没有出现异常,第二次代码块出现了异常。从上面的输出结果来看,使用 with as 语句管理资源,无论代码块是否有异常,程序总可以自动执行 __exit__() 方法。
注意,当出现异常时,如果 __exit__ 返回 False(默认不写返回值时,即为 False),则会重新抛出异常,让 with as 之外的语句逻辑来处理异常;反之,如果返回 True,则忽略异常,不再对异常进行处理。
除了基于类的上下文管理器,它还可以基于生成器实现。接下来先看一个例子。比如,我们可以使用装饰器 contextlib.contextmanager,来定义自己所需的基于生成器的上下文管理器,用以支持 with as 语句:
from contextlib import contextmanager @contextmanager def file_manager(name, mode): try: f = open(name, mode) yield f finally: f.close() with file_manager(‘a.txt‘, ‘w‘) as f: f.write(‘hello world‘)
这段代码中,函数 file_manager() 就是一个生成器,当我们执行 with as 语句时,便会打开文件,并返回文件对象 f;当 with 语句执行完后,finally 中的关闭文件操作便会执行。另外可以看到,使用基于生成器的上下文管理器时,不再用定义 __enter__() 和 __exit__() 方法,但需要加上装饰器 @contextmanager,这一点新手很容易疏忽。
需要强调的是,基于类的上下文管理器和基于生成器的上下文管理器,这两者在功能上是一致的。只不过,基于类的上下文管理器更加灵活,适用于大型的系统开发,而基于生成器的上下文管理器更加方便、简洁,适用于中小型程序。但是,无论使用哪一种,不用忘记在方法“__exit__()”或者是 finally 块中释放资源,这一点尤其重要。
标签:conf test 效果 用户组 写文件 pos ace 了解 evel
原文地址:https://www.cnblogs.com/zy09/p/11748372.html