目录
- 1. 创建
- 2. 写入
- 3. 关闭
- 4. 读取
- 5. 定位
- 6. 其他方法
1. 创建
Python 使用 open()
函数创建或打开文件,语法格式如下所示:
| open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None) |
复制
参数说明如下所示:
- file:表示将要打开的文件的路径,也可以是要被封装的整数类型文件描述符。(如果是文件描述符,它会随着返回的 I/O 对象关闭而关闭,除非 closefd 被设为 False 。)
- mode:是一个可选字符串,用于指定打开文件的模式,默认值是 ‘r’(以文本模式打开并读取,同 ‘rt’)。对于二进制写入, ‘w+b’
模式打开并把文件截断成 0 字节; ‘r+b’ 则不会截断。可选模式如下:
| 模式 描述 |
| r 读取(默认) |
| w 写入,并先截断文件 |
| x 排它性创建,如果文件已存在则失败 |
| a 写入,如果文件存在则在末尾追加 |
| b 二进制模式 |
| t 文本模式(默认) |
| + 更新磁盘文件(读取并写入) |
复制
- buffering:是一个可选的整数,用于设置缓冲策略。传递0以切换缓冲关闭(仅允许在二进制模式下),1选择行缓冲(仅在文本模式下可用),并且>1的整数以指示固定大小的块缓冲区的大小(以字节为单位)。如果没有给出 buffering 参数,则默认缓冲策略的工作方式如下:
| 二进制文件以固定大小的块进行缓冲;使用启发式方法选择缓冲区的大小,尝试确定底层设备的“块大小”或使用 io.DEFAULT_BUFFER_SIZE。在许多系统上,缓冲区的长度通常为4096或8192字节。 |
| |
| “交互式”文本文件( isatty() 返回 True 的文件)使用行缓冲。其他文本文件使用上述策略用于二进制文件。 |
复制
- encoding:用于解码或编码文件的编码的名称。
- errors:是一个可选的字符串,用于指定如何处理编码和解码错误(这应该只在文本模式下使用。不能在二进制模式下使用)。
- newline:区分换行符,它可以是 None,‘’,‘\n’,‘\r’ 和 ‘\r\n’。它的工作原理:
| 从流中读取输入时,如果 newline 为 None,则启用通用换行模式。输入中的行可以以 '\n','\r' 或 '\r\n' 结尾,这些行被翻译成 '\n' 在返回呼叫者之前。如果它是 '',则启用通用换行模式,但行结尾将返回给调用者未翻译。如果它具有任何其他合法值,则输入行仅由给定字符串终止,并且行结尾将返回给未调用的调用者。 |
| |
| 将输出写入流时,如果 newline 为 None,则写入的任何 '\n' 字符都将转换为系统默认行分隔符 os.linesep。如果 newline 是 '' 或 '\n',则不进行翻译。如果 newline 是任何其他合法值,则写入的任何 '\n' 字符将被转换为给定的字符串。 |
复制
- closefd:如果 closefd 为 False
并且给出了文件描述符而不是文件名,那么当文件关闭时,底层文件描述符将保持打开状态;如果给出文件名,closefd 为 True(默认值),否则将引发错误。标准名称包括:
| 如果存在编码错误,'strict' 会引发 ValueError 异常。 默认值 None 具有相同的效果。 |
| |
| 'ignore' 忽略错误。请注意,忽略编码错误可能会导致数据丢失。 |
| |
| 'replace' 会将替换标记(例如 '?' )插入有错误数据的地方。 |
| |
| 'surrogateescape' 将表示任何不正确的字节作为Unicode专用区中的代码点,范围从U+DC80到U+DCFF。当在写入数据时使用 surrogateescape 错误处理程序时,这些私有代码点将被转回到相同的字节中。这对于处理未知编码的文件很有用。 |
| |
| 只有在写入文件时才支持 'xmlcharrefreplace'。编码不支持的字符将替换为相应的XML字符引用 & |
| |
| 'backslashreplace' 用Python的反向转义序列替换格式错误的数据。 |
| |
| 'namereplace' (也只在编写时支持)用 \N{...} 转义序列替换不支持的字符。 |
复制
- opener:可以通过传递可调用的 opener 来使用自定义开启器。 以 txt 格式文件为例,我们不手动创建文件,通过代码方式来创建,如下所示:
| open('test.txt', mode='w',encoding='utf-8') |
复制
执行完上述代码,就为我们创建好了 test.txt 文件。
2. 写入
上面我们创建的文件 test.txt 没有任何内容,我们向这个文件中写入一些信息,对于写操作,Python 文件对象提供了两个函数,如下所示:
| 函数 描述 |
| write(str) 将字符串写入文件,返回写入字符长度 |
| writelines(s) 向文件写入一个字符串列表 |
复制
我们使用这两个函数向文件中写入一些信息,如下所示:
| wf = open('test.txt', 'w', encoding='utf-8') |
| wf.write('Tom\n') |
| wf.writelines(['Hello\n', 'Python']) |
| |
| wf.close() |
复制
3. 关闭
上面我们使用了 close()
函数进行关闭操作,如果打开的文件忘记了关闭,可能会对程序造成一些隐患,为了避免这个问题的出现,可以使用 with as
语句,通过这种方式,程序执行完成后会自动关闭已经打开的文件。
with 语句是一种上下文管理器,当它的代码块执行完毕时,会自动关闭文件。这是推荐的方式,因为它确保文件在使用完毕后被正确关闭,即使发生异常也能保证关闭。如下所示:
| with open('test.txt', 'w', encoding='utf-8') as wf: |
| wf.write('Tom\n') |
| wf.writelines(['Hello\n', 'Python']) |
复制
4. 读取
之前我们已经向文件中写入了一些内容,现在我们读取一下,对于文件的读操作,Python 文件对象提供了三个函数,如下所示:
| 函数 描述 |
| read(size) 读取指定的字节数,参数可选,无参或参数为负时读取所有 |
| readline() 读取一行 |
| readlines() 读取所有行并返回列表 |
复制
我们使用上面三个函数读取一下之前写入的内容,如下所示:
| with open('test.txt', 'r', encoding='utf-8') as rf: |
| print('readline-->', rf.readline()) |
| print('read-->', rf.read(6)) |
| print('readlines-->', rf.readlines()) |
复制
5. 定位
Python 提供了两个与文件对象位置相关的函数,如下所示:
| 函数 描述 |
| tell() 返回文件对象在文件中的当前位置 |
| file.seek(offset[, whence]) 将文件对象移动到指定的位置;offset 表示移动的偏移量;whence 为可选参数,值为 0 表示从文件开头起算(默认值)、值为 1 表示使用当前文件位置、值为 2 表示使用文件末尾作为参考点 |
复制
下面通过示例对上述函数作进一步了解,如下所示:
| with open('test.txt', 'rb+') as f: |
| f.write(b'123456789') |
| |
| print(f.tell()) |
| |
| f.seek(3) |
| |
| print(f.read(1)) |
| print(f.tell()) |
| |
| f.seek(-2, 2) |
| print(f.tell()) |
| print(f.read(1)) |
复制
6. 其他方法
| with open('test.txt', 'r+') as f: |
| |
| print(f.isatty()) |
| |
| f.truncate(2) |
| print(f.read()) |
复制