目录
open方法
open
函数在 Python 中用于打开一个文件,返回一个文件对象。其基本语法格式如下:
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
其中,各个参数的含义如下:
file
: 要打开的文件的路径,字符串类型。mode
: 文件打开模式,默认为'r'
(只读)。常用的模式包括:'r'
: 只读(默认)。'w'
: 只写。如果文件存在,先清空文件;如果文件不存在,创建新文件。'a'
: 追加。如果文件存在,将内容写入文件末尾;如果文件不存在,创建新文件。'b'
: 以二进制模式打开文件(与其他模式结合使用,如'rb'
、'wb'
)。't'
: 以文本模式打开文件(默认,与其他模式结合使用,如'rt'
、'wt'
)。'+'
: 打开文件进行更新(读写)(与其他模式结合使用,如'r+'
、'w+'
、'a+'
)。
buffering
: 设置缓冲策略。0 表示不缓冲,1 表示行缓冲,正整数表示使用一个固定大小的缓冲区(单位是字节),负数表示使用系统默认的缓冲策略。encoding
: 打开文件时使用的编码类型,默认是 None。errors
: 设置错误处理方式,默认是 None。newline
: 用于区分换行符,默认是 None。closefd
: 如果为 False,文件描述符将保持打开状态。opener
: 自定义打开器,可以是一个自定义函数。
其中mode(模式)
参数的模式总结表格
模式 | 描述 | 文件存在 | 文件不存在 |
---|---|---|---|
'r' | 以只读模式打开文本文件 | 打开 | 报错 |
'w' | 以写入模式打开文本文件 | 清空 | 创建新文件 |
'a' | 以追加模式打开文本文件 | 追加 | 创建新文件 |
'b' | 以二进制模式打开文件 | N/A | N/A |
't' | 以文本模式打开文件(默认) | N/A | N/A |
'x' | 以排它性创建模式打开文件 | 报错 | 创建新文件 |
'r+' | 以读写模式打开文本文件 | 打开 | 报错 |
'w+' | 以读写模式打开文本文件 | 清空 | 创建新文件 |
'a+' | 以读写模式打开文本文件 | 追加 | 创建新文件 |
'rb' | 以二进制只读模式打开文件 | 打开 | 报错 |
'wb' | 以二进制写入模式打开文件 | 清空 | 创建新文件 |
'ab' | 以二进制追加模式打开文件 | 追加 | 创建新文件 |
'xb' | 以二进制排它性创建模式打开文件 | 报错 | 创建新文件 |
'r+b' | 以二进制读写模式打开文件 | 打开 | 报错 |
'w+b' | 以二进制读写模式打开文件 | 清空 | 创建新文件 |
'a+b' | 以二进制读写模式打开文件 | 追加 | 创建新文件 |
注:
'b'
和't'
不能单独使用,通常与其他模式组合使用。'x'
模式用于创建文件,如果文件已存在则会报错。'+'
模式用于同时进行读和写操作。- 使用
'rb'
、'wb'
、'ab'
、'xb'
、'r+b'
、'w+b'
、'a+b'
时文件将以二进制模式打开,可以读取或写入二进制数据。
模式 | r | r+ | w | w+ | a | a+ |
---|---|---|---|---|---|---|
读 | + | + | + | + | ||
写 | + | + | + | + | + | |
创建 | + | + | + | + | ||
覆盖 | + | + | ||||
指针在开始 | + | + | + | + | ||
指针在结尾 | + | + |
示例
打开和关闭文件
# 打开文件
file = open('filename.txt', 'r') # 打开文件以供读取 ('r'),也可以用 'w' 写入模式或 'a' 追加模式
# 文件操作
content = file.read() # 读取文件内容
file.close() # 关闭文件
with(上下文管理器)
上下文管理器是Python中的一种管理资源的方式,确保资源在使用后能够自动释放。在文件操作中,常见的上下文管理器是使用 with
语句来打开和关闭文件。这种方式不仅简洁,还能自动处理文件关闭,即使在发生异常时也能确保文件正确关闭。
基本语法格式
with context_expression [as target]:
with-body
其中:
context_expression 是一个返回上下文管理器对象的表达式,例如 open(file, mode)。
[as target] 是可选部分,用于将上下文管理器的返回值赋给变量(即 target)。
with-body 是一个缩进的代码块,在上下文管理器的管理范围内执行。
读取文件内容
读取整个文件内容
with open('filename.txt', 'r') as file:
content = file.read()
print(content)
逐行读取文件内容
with open('filename.txt', 'r') as file:
for line in file:
print(line.strip()) # 使用strip()去除行尾的换行符
使用 readline
方法逐行读取
with open('example.txt', 'r', encoding='utf-8') as file:
while True:
line = file.readline()
if not line:
break
print(line, end='')
使用 readlines
方法读取所有行
with open('example.txt', 'r', encoding='utf-8') as file:
lines = file.readlines()
for line in lines:
print(line, end='')
写入文件内容
覆盖原内容写入
with open('filename.txt', 'w') as file:
file.write('Hello, World!')
追加内容到文件末尾
with open('filename.txt', 'a') as file:
file.write('\nAppending new line.')
文件指针操作
获取文件指针位置
使用 tell()
方法获取当前文件指针的位置
with open('example.txt', 'r', encoding='utf-8') as file:
position = file.tell()
print(f"Current file pointer position: {position}")
移动文件指针
使用 seek()
方法移动文件指针:
with open('example.txt', 'r', encoding='utf-8') as file:
file.seek(5) # 将文件指针移动到偏移量 5 的位置
position = file.tell()
print(f"File pointer moved to position: {position}")
seek() 方法参数
seek(offset, whence=0)
:
offset
:相对于whence
的偏移量,单位是字节。whence
:参考位置(默认值为 0),可选值:0
:文件开头(默认)1
:当前文件指针位置2
:文件末尾
使用 truncate() 截断文件
语法:
file.truncate(size=None)
参数:
size:指定截断的文件大小(以字节为单位)。如果未提供 size,则从当前文件指针位置开始截断,默认截断到文件的当前指针位置。
功能:
- 缩小文件:通过
truncate()
函数,可以将文件的大小调整为指定的大小,删除超出部分的数据。 - 扩大文件:如果指定的大小大于文件当前大小,文件将被填充到指定大小。通常,这种填充不会自动完成,而是需要在写入新数据时进行。
with open('example.txt', 'r+', encoding='utf-8') as file:
file.write("Hello, World!\nThis is a test file.\nEnjoy reading!")
file.seek(0)
print("Original file content:")
print(file.read())
file.seek(0)
file.truncate(13) # 截断文件到 13 字节
file.seek(0)
print("\n截断后的文件内容是:")
print(file.read())
'''
输出:
Original file content:
Hello, World!
This is a test file.
Enjoy reading!
截断后的文件内容是:
Hello, World!
'''
#二进制截断:
with open('example.bin', 'wb') as file:
file.write(b'\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A')
with open('example.bin', 'r+b') as file:
file.seek(4)
file.truncate() # 从当前位置截断文件
file.seek(0)
print("Binary file content after truncation:", file.read())
'''
输出:
Binary file content after truncation: b'\x01\x02\x03\x04'
'''