【python】12. File
12. File
Python open() 方法用于打开一个文件,并返回文件对象。
注意:
- 使用 open() 方法一定要保证关闭文件对象,即调用 close() 方法。
- 如果该文件无法被打开,会抛出
OSError
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
参数说明:
- file: 必需,文件路径(相对或者绝对路径)。
- mode: 可选,文件打开模式
- buffering: 设置缓冲
- encoding: 一般使用utf8
- errors: 报错级别
- newline: 区分换行符
- closefd: 传入的file参数类型
- opener: 设置自定义开启器,开启器的返回值必须是一个打开的文件描述符。
mode
参数有:
模式 | 描述 |
---|---|
t | 文本模式 (默认)。 |
x | 写模式,新建一个文件,如果该文件已存在则会报错。 |
b | 二进制模式。 |
+ | 打开一个文件进行更新(可读可写)。 |
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。 |
w | 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
w+ | 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
12.1 close()
close() 方法用于关闭一个已打开的文件。关闭后的文件不能再进行读写操作, 否则会触ValueError
错误。 close() 方法允许调用多次。
当 file 对象,被引用到操作另外一个文件时,Python 会自动关闭之前的 file 对象。 使用 close() 方法关闭文件是一个好的习惯。
fileObject.close();
# 打开文件
fo = open("python.txt", "wb")
print("文件名为: ", fo.name)
# 关闭文件
fo.close()
结果:
文件名为: python.txt
12.2 flush()
flush() 方法是用来刷新缓冲区的,即将缓冲区中的数据立刻写入文件,同时清空缓冲区,不需要是被动的等待输出缓冲区写入。
一般情况下,文件关闭后会自动刷新缓冲区,但有时你需要在关闭前刷新它,这时就可以使用 flush() 方法。
fileObject.flush();
# 刷新缓冲区
fo.flush()
12.3 fileno()
fileno() 方法返回一个整型的[[文件描述符]](file descriptor FD 整型),可用于底层操作系统的 I/O 操作。
fileObject.fileno();
# 打开文件
fo = open("python.txt", "wb")
fid = fo.fileno()
print ("文件描述符为: ", fid)
# 关闭文件
fo.close()
结果:
文件描述符为: 3
12.4 isatty()
isatty() 方法检测文件是否连接到一个终端设备,如果是返回 True,否则返回 False。
fileObject.isatty();
import sys
fo = open("python.txt", "wb")
print(fo.isatty())
fo.close()
print(sys.stdout.isatty())
结果:
False
False
使用cmd运行
False
True
12.5 read()
read() 方法用于从文件读取指定的字符数(文本模式 t)或字节数(二进制模式 b),如果未给定参数 size 或 size 为负数则读取文件所有内容。
fileObject.read([size]);
python.txt
这是第一行
这是第二行
这是第三行
这是第四行
这是第五行
# 打开文件
fo = open("python.txt", "r+")
line = fo.read(10) # 读取10个字符
print ("读取的字符串: %s" % (line))
# 关闭文件
fo.close()
结果:
读取的字符串: 这是第一行
这是第二
12.6 readline()
readline() 方法用于从文件读取整行,包括 “\n” 字符。如果指定了一个非负数的参数,则返回指定大小的字节数,包括 “\n” 字符。
fileObject.readline();
"""
1:python
2:python
"""
# 打开文件
fo = open("python.txt", "r+")
line = fo.readline()
print ("读取第一行 %s" % (line))
line = fo.readline(5)
print ("读取的字符串为: %s" % (line))
# 关闭文件
fo.close()
结果:
读取第一行 1:python
读取的字符串为: 2:pyt
12.7 readlines()
readlines() 方法用于读取所有行(直到结束符 EOF)并返回列表,该列表可以由 Python 的 for… in … 结构进行处理。 如果碰到结束符 EOF 则返回空字符串。
fileObject.readlines( );
"""
1:python
2:python
"""
# 打开文件
fo = open("runoob.txt", "r")
for line in fo.readlines(): #依次读取每行
line = line.strip() #去掉每行头尾空白
print ("读取的数据为: %s" % (line))
# 关闭文件
fo.close()
结果:
读取的数据为: 1:python
读取的数据为: 2:python
12.8 seek()
seek() 方法用于移动文件读取指针到指定位置。
fileObject.seek(offset[, whence])
参数
- offset – 开始的偏移量,也就是代表需要移动偏移的字节数,如果是负数表示从倒数第几位开始。
- whence: 可选,默认值为 0。给 offset 定义一个参数,表示要从哪个位置开始偏移;0 代表从文件开头开始算起,1 代表从当前位置开始算起,2 代表从文件末尾算起。
# 0123456789abcdef
f = open('python.txt', 'rb+')
f.seek(5) # 移动到文件的第六个字节
print(f.read(1)) # b'5'
f.seek(-3, 2) # 移动到文件倒数第三个字节
print(f.read(1)) # b'd'
12.9 tell()
tell() 方法返回文件的当前位置,即文件指针当前位置。
fileObject.tell()
# 打开文件
fo = open("python.txt", "r+")
print("文件名为: ", fo.name)
print("读取的数据为: %s" % (fo.readline()))
# 获取当前文件位置
print("当前位置: %d" % (fo.tell()))
# 关闭文件
fo.close()
结果:
读取的数据为: 1:python
当前位置: 10
12.10 truncate()
truncate() 方法用于从文件的首行首字节开始截断,截断文件为 size 个字节,无 size 表示从当前位置截断;截断之后的所有字节被删除,其中 Widnows 系统下的换行代表2个字节大小。
fileObject.truncate( [ size ])
参数
- size – 可选,如果存在则文件截断为 size 字节。
"""
1:python
2:python
"""
# 打开文件
fo = open("python.txt", "r+")
fo.truncate(10)
# 关闭文件
fo.close()
"""
1:python
"""
12.11 write()
write() 方法用于向文件中写入指定字符串。
- 在文件关闭前或缓冲区刷新前,字符串内容存储在缓冲区中,这时你在文件中是看不到写入的内容的。
- 如果文件打开模式带 b,那写入文件内容时,str (参数)要用 encode 方法转为 bytes 形式,否则报错:
TypeError: a bytes-like object is required, not 'str'
。 - 换行需要制定换行符 \n。
fileObject.write( [ str ])
"""
1:python
2:python
"""
# 打开文件
fo = open("python.txt", "r+")
str = "\n3:python"
# 在文件末尾写入一行
fo.seek(0, 2)
line = fo.write( str )
# 读取文件所有内容
fo.seek(0,0)
for index in range(3):
print (next(fo))
# 关闭文件
fo.close()
"""
1:python
2:python
3:python
"""
12.12 writelines()
与write一致,不需要换行符
12.13 with关键字
使用 with 关键字系统会自动调用 f.close() 方法, with 的作用等效于 try/finally 语句是一样的。
with open('./test_runoob.txt', 'w') as file:
file.write('hello world !')